OOKNET                             [ /  search the index  ]  
──────────────────────────────────────────────────────────────────────────────────────
══════════════════════════════════════════════════════════════════════════════════════
OOKNET   [ /  search  ]  
────────────────────────────────────────────────
════════════════════════════════════════════════
 
 
master @ 322 LINES
 
[ HISTORY ]  [ UP ]
 

---
// ItemDatabase.astro - Handles item display, reforging, and Wowhead integration
---

<script>
  // Reforging data mapping
  const reforgeData = {
    "113": { id: 113, i1: 6, s1: "spi", i2: 13, s2: "dodgertng", v: 0.4 },
    "114": { id: 114, i1: 6, s1: "spi", i2: 14, s2: "parryrtng", v: 0.4 },
    "115": { id: 115, i1: 6, s1: "spi", i2: 31, s2: "hitrtng", v: 0.4 },
    "116": { id: 116, i1: 6, s1: "spi", i2: 32, s2: "critstrkrtng", v: 0.4 },
    "117": { id: 117, i1: 6, s1: "spi", i2: 36, s2: "hastertng", v: 0.4 },
    "118": { id: 118, i1: 6, s1: "spi", i2: 37, s2: "exprtng", v: 0.4 },
    "119": { id: 119, i1: 6, s1: "spi", i2: 49, s2: "mastrtng", v: 0.4 },
    "120": { id: 120, i1: 13, s1: "dodgertng", i2: 6, s2: "spi", v: 0.4 },
    "121": {
      id: 121,
      i1: 13,
      s1: "dodgertng",
      i2: 14,
      s2: "parryrtng",
      v: 0.4,
    },
    "122": { id: 122, i1: 13, s1: "dodgertng", i2: 31, s2: "hitrtng", v: 0.4 },
    "123": {
      id: 123,
      i1: 13,
      s1: "dodgertng",
      i2: 32,
      s2: "critstrkrtng",
      v: 0.4,
    },
    "124": {
      id: 124,
      i1: 13,
      s1: "dodgertng",
      i2: 36,
      s2: "hastertng",
      v: 0.4,
    },
    "125": { id: 125, i1: 13, s1: "dodgertng", i2: 37, s2: "exprtng", v: 0.4 },
    "126": { id: 126, i1: 13, s1: "dodgertng", i2: 49, s2: "mastrtng", v: 0.4 },
    "127": { id: 127, i1: 14, s1: "parryrtng", i2: 6, s2: "spi", v: 0.4 },
    "128": {
      id: 128,
      i1: 14,
      s1: "parryrtng",
      i2: 13,
      s2: "dodgertng",
      v: 0.4,
    },
    "129": { id: 129, i1: 14, s1: "parryrtng", i2: 31, s2: "hitrtng", v: 0.4 },
    "130": {
      id: 130,
      i1: 14,
      s1: "parryrtng",
      i2: 32,
      s2: "critstrkrtng",
      v: 0.4,
    },
    "131": {
      id: 131,
      i1: 14,
      s1: "parryrtng",
      i2: 36,
      s2: "hastertng",
      v: 0.4,
    },
    "132": { id: 132, i1: 14, s1: "parryrtng", i2: 37, s2: "exprtng", v: 0.4 },
    "133": { id: 133, i1: 14, s1: "parryrtng", i2: 49, s2: "mastrtng", v: 0.4 },
    "134": { id: 134, i1: 31, s1: "hitrtng", i2: 6, s2: "spi", v: 0.4 },
    "135": { id: 135, i1: 31, s1: "hitrtng", i2: 13, s2: "dodgertng", v: 0.4 },
    "136": { id: 136, i1: 31, s1: "hitrtng", i2: 14, s2: "parryrtng", v: 0.4 },
    "137": {
      id: 137,
      i1: 31,
      s1: "hitrtng",
      i2: 32,
      s2: "critstrkrtng",
      v: 0.4,
    },
    "138": { id: 138, i1: 31, s1: "hitrtng", i2: 36, s2: "hastertng", v: 0.4 },
    "139": { id: 139, i1: 31, s1: "hitrtng", i2: 37, s2: "exprtng", v: 0.4 },
    "140": { id: 140, i1: 31, s1: "hitrtng", i2: 49, s2: "mastrtng", v: 0.4 },
    "141": { id: 141, i1: 32, s1: "critstrkrtng", i2: 6, s2: "spi", v: 0.4 },
    "142": {
      id: 142,
      i1: 32,
      s1: "critstrkrtng",
      i2: 13,
      s2: "dodgertng",
      v: 0.4,
    },
    "143": {
      id: 143,
      i1: 32,
      s1: "critstrkrtng",
      i2: 14,
      s2: "parryrtng",
      v: 0.4,
    },
    "144": {
      id: 144,
      i1: 32,
      s1: "critstrkrtng",
      i2: 31,
      s2: "hitrtng",
      v: 0.4,
    },
    "145": {
      id: 145,
      i1: 32,
      s1: "critstrkrtng",
      i2: 36,
      s2: "hastertng",
      v: 0.4,
    },
    "146": {
      id: 146,
      i1: 32,
      s1: "critstrkrtng",
      i2: 37,
      s2: "exprtng",
      v: 0.4,
    },
    "147": {
      id: 147,
      i1: 32,
      s1: "critstrkrtng",
      i2: 49,
      s2: "mastrtng",
      v: 0.4,
    },
    "148": { id: 148, i1: 36, s1: "hastertng", i2: 6, s2: "spi", v: 0.4 },
    "149": {
      id: 149,
      i1: 36,
      s1: "hastertng",
      i2: 13,
      s2: "dodgertng",
      v: 0.4,
    },
    "150": {
      id: 150,
      i1: 36,
      s1: "hastertng",
      i2: 14,
      s2: "parryrtng",
      v: 0.4,
    },
    "151": { id: 151, i1: 36, s1: "hastertng", i2: 31, s2: "hitrtng", v: 0.4 },
    "152": {
      id: 152,
      i1: 36,
      s1: "hastertng",
      i2: 32,
      s2: "critstrkrtng",
      v: 0.4,
    },
    "153": { id: 153, i1: 36, s1: "hastertng", i2: 37, s2: "exprtng", v: 0.4 },
    "154": { id: 154, i1: 36, s1: "hastertng", i2: 49, s2: "mastrtng", v: 0.4 },
    "155": { id: 155, i1: 37, s1: "exprtng", i2: 6, s2: "spi", v: 0.4 },
    "156": { id: 156, i1: 37, s1: "exprtng", i2: 13, s2: "dodgertng", v: 0.4 },
    "157": { id: 157, i1: 37, s1: "exprtng", i2: 14, s2: "parryrtng", v: 0.4 },
    "158": { id: 158, i1: 37, s1: "exprtng", i2: 31, s2: "hitrtng", v: 0.4 },
    "159": {
      id: 159,
      i1: 37,
      s1: "exprtng",
      i2: 32,
      s2: "critstrkrtng",
      v: 0.4,
    },
    "160": { id: 160, i1: 37, s1: "exprtng", i2: 36, s2: "hastertng", v: 0.4 },
    "161": { id: 161, i1: 37, s1: "exprtng", i2: 49, s2: "mastrtng", v: 0.4 },
    "162": { id: 162, i1: 49, s1: "mastrtng", i2: 6, s2: "spi", v: 0.4 },
    "163": { id: 163, i1: 49, s1: "mastrtng", i2: 13, s2: "dodgertng", v: 0.4 },
    "164": { id: 164, i1: 49, s1: "mastrtng", i2: 14, s2: "parryrtng", v: 0.4 },
    "165": { id: 165, i1: 49, s1: "mastrtng", i2: 31, s2: "hitrtng", v: 0.4 },
    "166": {
      id: 166,
      i1: 49,
      s1: "mastrtng",
      i2: 32,
      s2: "critstrkrtng",
      v: 0.4,
    },
    "167": { id: 167, i1: 49, s1: "mastrtng", i2: 36, s2: "hastertng", v: 0.4 },
    "168": { id: 168, i1: 49, s1: "mastrtng", i2: 37, s2: "exprtng", v: 0.4 },
  };

  // Stat name mappings
  const statNames = {
    spi: "Spirit",
    dodgertng: "Dodge",
    parryrtng: "Parry",
    hitrtng: "Hit",
    critstrkrtng: "Crit",
    hastertng: "Haste",
    exprtng: "Expertise",
    mastrtng: "Mastery",
  };

  // Global functions for item database functionality
  (window as any).ItemDatabase = {
    // Helper function to format reforging
    formatReforge: (reforgeId: any) => {
      if (!reforgeId || reforgeId === 0) return "";
      const reforge =
        reforgeData[reforgeId.toString() as keyof typeof reforgeData];
      if (!reforge) return ` [R:${reforgeId}]`;

      const fromStat =
        statNames[reforge.s1 as keyof typeof statNames] || reforge.s1;
      const toStat =
        statNames[reforge.s2 as keyof typeof statNames] || reforge.s2;
      return ` [${fromStat} -> ${toStat}]`;
    },

    // Generate Wowhead URL for items
    getWowheadUrl: (itemId: any) => {
      return `https://www.wowhead.com/mop-classic/item=${itemId}`;
    },

    // Format equipment item with all details - uses enriched data from backend
    formatEquipmentItem: (item: any) => {
      if (!item || !item.id) return null;

      // Use enriched name if available, otherwise fallback to ID
      const itemName = item.name || `Item ${item.id}`;
      const wowheadUrl = (window as any).ItemDatabase.getWowheadUrl(item.id);
      const iconUrl = item.icon
        ? `https://wow.zamimg.com/images/wow/icons/large/${item.icon}.jpg`
        : null;

      // Build details array with specific layout structure
      const details = [];

      // Item Level (white text)
      if (item.stats && item.stats.ilvl) {
        details.push(
          `<div class="item-level">Item Level ${item.stats.ilvl}</div>`,
        );
      }

      // Slot (determine from item type - this might need enhancement)
      // For now, we'll skip slot since it's shown in the header already

      // Reforged (green text)
      if (item.reforging && item.reforging.description) {
        details.push(
          `<div class="item-reforge">Reforged ${item.reforging.description}</div>`
,
        );
      } else if (item.reforging && typeof item.reforging === "number") {
        // Fallback to manual reforge lookup if not enriched
        const reforge =
          reforgeData[item.reforging.toString() as keyof typeof reforgeData];
        if (reforge) {
          const fromStat =
            statNames[reforge.s1 as keyof typeof statNames] || reforge.s1;
          const toStat =
            statNames[reforge.s2 as keyof typeof statNames] || reforge.s2;
          details.push(
            `<div class="item-reforge">Reforged ${fromStat} -> ${toStat}</div>`,
          );
        }
      }

      // Gems - each gem on separate line with icon and white stats
      if (item.gems && item.gems.length > 0) {
        item.gems.forEach((gem: any) => {
          if (gem && gem.name) {
            const gemIcon = gem.icon
              ? `<img src="https://wow.zamimg.com/images/wow/icons/small/${gem.ico
n}.jpg" alt="${gem.name}" class="gem-icon-inline" />`
              : "";
            const gemStats =
              gem.stats && gem.stats.length > 0
                ? gem.stats.join(", ")
                : gem.name;
            details.push(
              `<div class="gem-line">${gemIcon}<span class="gem-stats-white">${gem
Stats}</span></div>`,
            );
          } else if (gem && typeof gem === "number") {
            // Fallback for non-enriched gem IDs
            details.push(`<div class="gem-line">Gem ${gem}</div>`);
          }
        });
      }

      // Enchant (green text)
      if (item.enchant && item.enchant.name) {
        details.push(`<div class="item-enchant">${item.enchant.name}</div>`);
      } else if (item.enchant && typeof item.enchant === "number") {
        details.push(`<div class="item-enchant">Enchant ${item.enchant}</div>`);
      }

      // Tinker (not enriched yet, but prepared for future)
      if (item.tinker) {
        details.push(`Tinker ${item.tinker}`);
      }

      return {
        itemId: item.id,
        itemName: itemName,
        itemDetails: details,
        wowheadUrl: wowheadUrl,
        iconUrl: iconUrl,
        quality: item.quality || null,
      };
    },

    // Format gem information
    formatGems: (gems: any) => {
      if (!gems || gems.length === 0) return "";
      const activeGems = gems.filter((g: any) => g && g !== 0);
      if (activeGems.length === 0) return "";

      return activeGems.map((gemId: any) => `Gem ${gemId}`).join(", ");
    },
  };
</script>

---
// ItemDatabase.astro - Handles item display
, reforging, and Wowhead integration
---

<script>
  // Reforging data mapping
  const reforgeData = {
    "113": { id: 113, i1: 6, s1: "spi", i2: 
13, s2: "dodgertng", v: 0.4 },
    "114": { id: 114, i1: 6, s1: "spi", i2: 
14, s2: "parryrtng", v: 0.4 },
    "115": { id: 115, i1: 6, s1: "spi", i2: 
31, s2: "hitrtng", v: 0.4 },
    "116": { id: 116, i1: 6, s1: "spi", i2: 
32, s2: "critstrkrtng", v: 0.4 },
    "117": { id: 117, i1: 6, s1: "spi", i2: 
36, s2: "hastertng", v: 0.4 },
    "118": { id: 118, i1: 6, s1: "spi", i2: 
37, s2: "exprtng", v: 0.4 },
    "119": { id: 119, i1: 6, s1: "spi", i2: 
49, s2: "mastrtng", v: 0.4 },
    "120": { id: 120, i1: 13, s1: "dodgertng
", i2: 6, s2: "spi", v: 0.4 },
    "121": {
      id: 121,
      i1: 13,
      s1: "dodgertng",
      i2: 14,
      s2: "parryrtng",
      v: 0.4,
    },
    "122": { id: 122, i1: 13, s1: "dodgertng
", i2: 31, s2: "hitrtng", v: 0.4 },
    "123": {
      id: 123,
      i1: 13,
      s1: "dodgertng",
      i2: 32,
      s2: "critstrkrtng",
      v: 0.4,
    },
    "124": {
      id: 124,
      i1: 13,
      s1: "dodgertng",
      i2: 36,
      s2: "hastertng",
      v: 0.4,
    },
    "125": { id: 125, i1: 13, s1: "dodgertng
", i2: 37, s2: "exprtng", v: 0.4 },
    "126": { id: 126, i1: 13, s1: "dodgertng
", i2: 49, s2: "mastrtng", v: 0.4 },
    "127": { id: 127, i1: 14, s1: "parryrtng
", i2: 6, s2: "spi", v: 0.4 },
    "128": {
      id: 128,
      i1: 14,
      s1: "parryrtng",
      i2: 13,
      s2: "dodgertng",
      v: 0.4,
    },
    "129": { id: 129, i1: 14, s1: "parryrtng
", i2: 31, s2: "hitrtng", v: 0.4 },
    "130": {
      id: 130,
      i1: 14,
      s1: "parryrtng",
      i2: 32,
      s2: "critstrkrtng",
      v: 0.4,
    },
    "131": {
      id: 131,
      i1: 14,
      s1: "parryrtng",
      i2: 36,
      s2: "hastertng",
      v: 0.4,
    },
    "132": { id: 132, i1: 14, s1: "parryrtng
", i2: 37, s2: "exprtng", v: 0.4 },
    "133": { id: 133, i1: 14, s1: "parryrtng
", i2: 49, s2: "mastrtng", v: 0.4 },
    "134": { id: 134, i1: 31, s1: "hitrtng",
 i2: 6, s2: "spi", v: 0.4 },
    "135": { id: 135, i1: 31, s1: "hitrtng",
 i2: 13, s2: "dodgertng", v: 0.4 },
    "136": { id: 136, i1: 31, s1: "hitrtng",
 i2: 14, s2: "parryrtng", v: 0.4 },
    "137": {
      id: 137,
      i1: 31,
      s1: "hitrtng",
      i2: 32,
      s2: "critstrkrtng",
      v: 0.4,
    },
    "138": { id: 138, i1: 31, s1: "hitrtng",
 i2: 36, s2: "hastertng", v: 0.4 },
    "139": { id: 139, i1: 31, s1: "hitrtng",
 i2: 37, s2: "exprtng", v: 0.4 },
    "140": { id: 140, i1: 31, s1: "hitrtng",
 i2: 49, s2: "mastrtng", v: 0.4 },
    "141": { id: 141, i1: 32, s1: "critstrkr
tng", i2: 6, s2: "spi", v: 0.4 },
    "142": {
      id: 142,
      i1: 32,
      s1: "critstrkrtng",
      i2: 13,
      s2: "dodgertng",
      v: 0.4,
    },
    "143": {
      id: 143,
      i1: 32,
      s1: "critstrkrtng",
      i2: 14,
      s2: "parryrtng",
      v: 0.4,
    },
    "144": {
      id: 144,
      i1: 32,
      s1: "critstrkrtng",
      i2: 31,
      s2: "hitrtng",
      v: 0.4,
    },
    "145": {
      id: 145,
      i1: 32,
      s1: "critstrkrtng",
      i2: 36,
      s2: "hastertng",
      v: 0.4,
    },
    "146": {
      id: 146,
      i1: 32,
      s1: "critstrkrtng",
      i2: 37,
      s2: "exprtng",
      v: 0.4,
    },
    "147": {
      id: 147,
      i1: 32,
      s1: "critstrkrtng",
      i2: 49,
      s2: "mastrtng",
      v: 0.4,
    },
    "148": { id: 148, i1: 36, s1: "hastertng
", i2: 6, s2: "spi", v: 0.4 },
    "149": {
      id: 149,
      i1: 36,
      s1: "hastertng",
      i2: 13,
      s2: "dodgertng",
      v: 0.4,
    },
    "150": {
      id: 150,
      i1: 36,
      s1: "hastertng",
      i2: 14,
      s2: "parryrtng",
      v: 0.4,
    },
    "151": { id: 151, i1: 36, s1: "hastertng
", i2: 31, s2: "hitrtng", v: 0.4 },
    "152": {
      id: 152,
      i1: 36,
      s1: "hastertng",
      i2: 32,
      s2: "critstrkrtng",
      v: 0.4,
    },
    "153": { id: 153, i1: 36, s1: "hastertng
", i2: 37, s2: "exprtng", v: 0.4 },
    "154": { id: 154, i1: 36, s1: "hastertng
", i2: 49, s2: "mastrtng", v: 0.4 },
    "155": { id: 155, i1: 37, s1: "exprtng",
 i2: 6, s2: "spi", v: 0.4 },
    "156": { id: 156, i1: 37, s1: "exprtng",
 i2: 13, s2: "dodgertng", v: 0.4 },
    "157": { id: 157, i1: 37, s1: "exprtng",
 i2: 14, s2: "parryrtng", v: 0.4 },
    "158": { id: 158, i1: 37, s1: "exprtng",
 i2: 31, s2: "hitrtng", v: 0.4 },
    "159": {
      id: 159,
      i1: 37,
      s1: "exprtng",
      i2: 32,
      s2: "critstrkrtng",
      v: 0.4,
    },
    "160": { id: 160, i1: 37, s1: "exprtng",
 i2: 36, s2: "hastertng", v: 0.4 },
    "161": { id: 161, i1: 37, s1: "exprtng",
 i2: 49, s2: "mastrtng", v: 0.4 },
    "162": { id: 162, i1: 49, s1: "mastrtng"
, i2: 6, s2: "spi", v: 0.4 },
    "163": { id: 163, i1: 49, s1: "mastrtng"
, i2: 13, s2: "dodgertng", v: 0.4 },
    "164": { id: 164, i1: 49, s1: "mastrtng"
, i2: 14, s2: "parryrtng", v: 0.4 },
    "165": { id: 165, i1: 49, s1: "mastrtng"
, i2: 31, s2: "hitrtng", v: 0.4 },
    "166": {
      id: 166,
      i1: 49,
      s1: "mastrtng",
      i2: 32,
      s2: "critstrkrtng",
      v: 0.4,
    },
    "167": { id: 167, i1: 49, s1: "mastrtng"
, i2: 36, s2: "hastertng", v: 0.4 },
    "168": { id: 168, i1: 49, s1: "mastrtng"
, i2: 37, s2: "exprtng", v: 0.4 },
  };

  // Stat name mappings
  const statNames = {
    spi: "Spirit",
    dodgertng: "Dodge",
    parryrtng: "Parry",
    hitrtng: "Hit",
    critstrkrtng: "Crit",
    hastertng: "Haste",
    exprtng: "Expertise",
    mastrtng: "Mastery",
  };

  // Global functions for item database func
tionality
  (window as any).ItemDatabase = {
    // Helper function to format reforging
    formatReforge: (reforgeId: any) => {
      if (!reforgeId || reforgeId === 0) ret
urn "";
      const reforge =
        reforgeData[reforgeId.toString() as 
keyof typeof reforgeData];
      if (!reforge) return ` [R:${reforgeId}
]`;

      const fromStat =
        statNames[reforge.s1 as keyof typeof
 statNames] || reforge.s1;
      const toStat =
        statNames[reforge.s2 as keyof typeof
 statNames] || reforge.s2;
      return ` [${fromStat} -> ${toStat}]`;
    },

    // Generate Wowhead URL for items
    getWowheadUrl: (itemId: any) => {
      return `https://www.wowhead.com/mop-cl
assic/item=${itemId}`;
    },

    // Format equipment item with all detail
s - uses enriched data from backend
    formatEquipmentItem: (item: any) => {
      if (!item || !item.id) return null;

      // Use enriched name if available, oth
erwise fallback to ID
      const itemName = item.name || `Item ${
item.id}`;
      const wowheadUrl = (window as any).Ite
mDatabase.getWowheadUrl(item.id);
      const iconUrl = item.icon
        ? `https://wow.zamimg.com/images/wow
/icons/large/${item.icon}.jpg`
        : null;

      // Build details array with specific l
ayout structure
      const details = [];

      // Item Level (white text)
      if (item.stats && item.stats.ilvl) {
        details.push(
          `<div class="item-level">Item Leve
l ${item.stats.ilvl}</div>`,
        );
      }

      // Slot (determine from item type - th
is might need enhancement)
      // For now, we'll skip slot since it's
 shown in the header already

      // Reforged (green text)
      if (item.reforging && item.reforging.d
escription) {
        details.push(
          `<div class="item-reforge">Reforge
d ${item.reforging.description}</div>`,
        );
      } else if (item.reforging && typeof it
em.reforging === "number") {
        // Fallback to manual reforge lookup
 if not enriched
        const reforge =
          reforgeData[item.reforging.toStrin
g() as keyof typeof reforgeData];
        if (reforge) {
          const fromStat =
            statNames[reforge.s1 as keyof ty
peof statNames] || reforge.s1;
          const toStat =
            statNames[reforge.s2 as keyof ty
peof statNames] || reforge.s2;
          details.push(
            `<div class="item-reforge">Refor
ged ${fromStat} -> ${toStat}</div>`,
          );
        }
      }

      // Gems - each gem on separate line wi
th icon and white stats
      if (item.gems && item.gems.length > 0)
 {
        item.gems.forEach((gem: any) => {
          if (gem && gem.name) {
            const gemIcon = gem.icon
              ? `<img src="https://wow.zamim
g.com/images/wow/icons/small/${gem.icon}.jpg
" alt="${gem.name}" class="gem-icon-inline" 
/>`
              : "";
            const gemStats =
              gem.stats && gem.stats.length 
> 0
                ? gem.stats.join(", ")
                : gem.name;
            details.push(
              `<div class="gem-line">${gemIc
on}<span class="gem-stats-white">${gemStats}
</span></div>`,
            );
          } else if (gem && typeof gem === "
number") {
            // Fallback for non-enriched gem
 IDs
            details.push(`<div class="gem-li
ne">Gem ${gem}</div>`);
          }
        });
      }

      // Enchant (green text)
      if (item.enchant && item.enchant.name)
 {
        details.push(`<div class="item-encha
nt">${item.enchant.name}</div>`);
      } else if (item.enchant && typeof item
.enchant === "number") {
        details.push(`<div class="item-encha
nt">Enchant ${item.enchant}</div>`);
      }

      // Tinker (not enriched yet, but prepa
red for future)
      if (item.tinker) {
        details.push(`Tinker ${item.tinker}`
);
      }

      return {
        itemId: item.id,
        itemName: itemName,
        itemDetails: details,
        wowheadUrl: wowheadUrl,
        iconUrl: iconUrl,
        quality: item.quality || null,
      };
    },

    // Format gem information
    formatGems: (gems: any) => {
      if (!gems || gems.length === 0) return
 "";
      const activeGems = gems.filter((g: any
) => g && g !== 0);
      if (activeGems.length === 0) return ""
;

      return activeGems.map((gemId: any) => 
`Gem ${gemId}`).join(", ");
    },
  };
</script>
 
──────────────────────────────────────────────────────────────────────────────────────
OOKNET
────────────────────────────────────────────────
OOKNET