-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathindex.html
1097 lines (964 loc) · 54.5 KB
/
index.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
<!DOCTYPE html>
<html>
<head>
<title>Sulfuras Points Cheatsheet</title>
<meta charset="utf-8" />
<style>
body {
background-color: rgb(34, 34, 34);
color: rgb(255, 255, 255);
font-family: Arial, sans-serif;
}
#wrapper {
max-width: 1160px;
margin: 0 auto;
}
#sections-container {
foo: bar;
}
#raid-links {
margin: 10px 0;
}
.raid-link {
padding: 6px;
color: white;
background-color: indigo;
border-radius: 4px;
}
.raid-link:hover {
background-color: darkorchid;
}
.raid-link.active {
background-color: blueviolet;
}
.items-container {
display: flex;
flex-direction: row;
flex-wrap: wrap;
justify-content: center;
}
p.contested-item {
width: 340px;
border: 1px solid black;
border-radius: 4px;
padding: 10px;
margin: 10px;
background-color: rgb(37, 37, 37);
box-shadow: rgba(0, 0, 0, 0.3) 0px 0px 10px 2px;
border-radius: 5px;
border-width: 1px;
border-style: solid;
border-color: rgb(68, 68, 68);
}
.item-source {
font-size: small;
}
.points-record.unobtainable {
opacity: 20%;
}
input.roll {
width: 26px;
border: 1px solid gray;
border-radius: 4px;
text-align: center;
}
.druid {
color: rgb(255, 125, 10);
}
.hunter {
color: rgb(169, 210, 113);
}
.mage {
color: rgb(64, 199, 235);
}
.paladin {
color: rgb(245, 140, 186);
}
.priest {
color: rgb(255, 255, 255);
}
.rogue {
color: rgb(255, 245, 105);
}
.warlock {
color: rgb(135, 135, 237);
}
.warrior {
color: rgb(199, 156, 110);
}
.q3 {
color: rgb(0, 112, 221) !important;
}
.q4 {
color: rgb(163, 53, 238) !important;
}
.q5 {
color: rgb(255, 128, 0) !important;
}
div.camel {
float: right;
}
img.camel {
width: 32px;
height: 32px;
vertical-align: bottom;
}
</style>
<script>const whTooltips = {colorLinks: true, iconizeLinks: true, renameLinks: true};</script>
<script src="https://wow.zamimg.com/js/tooltips.js"></script>
</head>
<body>
<div id="wrapper">
<div>
<p>Sulfuras Points Cheatsheet, v0.0.28</p>
<div class="camel">Camel (with a HUMP) --> <img class="camel" src="camel.svg"></div>
</div>
<div id="raid-links">
<a href="?raid=NAXX" id="link-naxx" class="raid-link">Naxx</a>
<a href="?raid=NAXX2" id="link-naxx2" class="raid-link">Naxx2</a>
<a href="?raid=AQ40" id="link-aq40" class="raid-link">AQ40</a>
<a href="?raid=BWL" id="link-bwl" class="raid-link">BWL</a>
</div>
<div id="message"></div>
<div id="sections-container"></div>
</div>
<script type="text/javascript">
const API_KEY = 'AIzaSyCNAFRhLa3kMQVTBJsf4-b7yrwlA3PLFDw';
const DISCOVERY_DOC = 'https://sheets.googleapis.com/$discovery/rest?version=v4';
const SCOPES = 'https://www.googleapis.com/auth/spreadsheets.readonly';
const QUALITY_RARE = 3;
const QUALITY_EPIC = 4;
const QUALITY_LEGENDARY = 5;
class Item {
constructor(boss, name, link, quality) {
this.boss = boss;
this.name = name;
this.link = link;
let match = link.match(/item=[\d]+/);
if (match === null || match.length !== 1) {
throw 'Cannot get item id from value: ' + link;
}
this.id = match[0].split('=')[1];
this.quality = quality ? quality : QUALITY_EPIC;
}
}
const ITEMS_MC = [
new Item('Magmadar', 'Striker\'s Mark', 'https://classic.wowhead.com/item=17069'),
new Item('Majordomo Executus', 'Wild Growth Spaulders', 'https://classic.wowhead.com/item=18810'),
new Item('Ragnaros', 'Band of Accuria', 'https://classic.wowhead.com/item=17063'),
new Item('Ragnaros', 'Onslaught Girdle', 'https://classic.wowhead.com/item=19137'),
new Item('Shared', 'Quick Strike Ring', 'https://classic.wowhead.com/item=18821'),
new Item('Ragnaros', 'Eye of Sulfuras', 'https://classic.wowhead.com/item=17204', QUALITY_LEGENDARY)
];
const ITEMS_BWL = [
new Item('Razorgore the Untamed', 'Arcane Infused Gem', 'https://classic.wowhead.com/item=19336'),
new Item('Razorgore the Untamed', 'Bindings of Transcendence', 'https://classic.wowhead.com/item=16926'),
new Item('Razorgore the Untamed', 'Bloodfang Bracers', 'https://classic.wowhead.com/item=16911'),
new Item('Razorgore the Untamed', 'Bracelets of Wrath', 'https://classic.wowhead.com/item=16959'),
new Item('Razorgore the Untamed', 'Dragonstalker\'s Bracers', 'https://classic.wowhead.com/item=16935'),
new Item('Razorgore the Untamed', 'Gloves of Rapid Evolution', 'https://classic.wowhead.com/item=19369'),
new Item('Razorgore the Untamed', 'Judgement Bindings', 'https://classic.wowhead.com/item=16951'),
new Item('Razorgore the Untamed', 'Mantle of the Blackwing Cabal', 'https://classic.wowhead.com/item=19370'),
new Item('Razorgore the Untamed', 'Nemesis Bracers', 'https://classic.wowhead.com/item=16934'),
new Item('Razorgore the Untamed', 'Netherwind Bindings', 'https://classic.wowhead.com/item=16918'),
new Item('Razorgore the Untamed', 'Spineshatter', 'https://classic.wowhead.com/item=19335'),
new Item('Razorgore the Untamed', 'Stormrage Bracers', 'https://classic.wowhead.com/item=16904'),
new Item('Razorgore the Untamed', 'The Black Book', 'https://classic.wowhead.com/item=19337'),
new Item('Razorgore the Untamed', 'The Untamed Blade', 'https://classic.wowhead.com/item=19334'),
new Item('Vaelastrasz the Corrupt', 'Belt of Transcendence', 'https://classic.wowhead.com/item=16925'),
new Item('Vaelastrasz the Corrupt', 'Bloodfang Belt', 'https://classic.wowhead.com/item=16910'),
new Item('Vaelastrasz the Corrupt', 'Dragonfang Blade', 'https://classic.wowhead.com/item=19346'),
new Item('Vaelastrasz the Corrupt', 'Dragonstalker\'s Belt', 'https://classic.wowhead.com/item=16936'),
new Item('Vaelastrasz the Corrupt', 'Helm of Endless Rage', 'https://classic.wowhead.com/item=19372'),
new Item('Vaelastrasz the Corrupt', 'Judgement Belt', 'https://classic.wowhead.com/item=16952'),
new Item('Vaelastrasz the Corrupt', 'Mind Quickening Gem', 'https://classic.wowhead.com/item=19339'),
new Item('Vaelastrasz the Corrupt', 'Nemesis Belt', 'https://classic.wowhead.com/item=16933'),
new Item('Vaelastrasz the Corrupt', 'Netherwind Belt', 'https://classic.wowhead.com/item=16818'),
new Item('Vaelastrasz the Corrupt', 'Pendant of the Fallen Dragon', 'https://classic.wowhead.com/item=19371'),
new Item('Vaelastrasz the Corrupt', 'Red Dragonscale Protector', 'https://classic.wowhead.com/item=19348'),
new Item('Vaelastrasz the Corrupt', 'Rune of Metamorphosis', 'https://classic.wowhead.com/item=19340'),
new Item('Vaelastrasz the Corrupt', 'Stormrage Belt', 'https://classic.wowhead.com/item=16903'),
new Item('Vaelastrasz the Corrupt', 'Waistband of Wrath', 'https://classic.wowhead.com/item=16960'),
new Item('Broodlord Lashlayer', 'Black Brood Pauldrons', 'https://classic.wowhead.com/item=19373'),
new Item('Broodlord Lashlayer', 'Bloodfang Boots', 'https://classic.wowhead.com/item=16906'),
new Item('Broodlord Lashlayer', 'Boots of Transcendence', 'https://classic.wowhead.com/item=16919'),
new Item('Broodlord Lashlayer', 'Bracers of Arcane Accuracy', 'https://classic.wowhead.com/item=19374'),
new Item('Broodlord Lashlayer', 'Dragonstalker\'s Greaves', 'https://classic.wowhead.com/item=16941'),
new Item('Broodlord Lashlayer', 'Head of the Broodlord Lashlayer', 'https://classic.wowhead.com/item=20383'),
new Item('Broodlord Lashlayer', 'Heartstriker', 'https://classic.wowhead.com/item=19350'),
new Item('Broodlord Lashlayer', 'Judgement Sabatons', 'https://classic.wowhead.com/item=16957'),
new Item('Broodlord Lashlayer', 'Lifegiving Gem', 'https://classic.wowhead.com/item=19341'),
new Item('Broodlord Lashlayer', 'Maladath, Runed Blade of the Black Flight', 'https://classic.wowhead.com/item=19351'),
new Item('Broodlord Lashlayer', 'Nemesis Boots', 'https://classic.wowhead.com/item=16927'),
new Item('Broodlord Lashlayer', 'Netherwind Boots', 'https://classic.wowhead.com/item=16912'),
new Item('Broodlord Lashlayer', 'Sabatons of Wrath', 'https://classic.wowhead.com/item=16965'),
new Item('Broodlord Lashlayer', 'Stormrage Boots', 'https://classic.wowhead.com/item=16898'),
new Item('Broodlord Lashlayer', 'Venomous Totem', 'https://classic.wowhead.com/item=19342'),
new Item('Firemaw', 'Black Ash Robe', 'https://classic.wowhead.com/item=19399'),
new Item('Firemaw', 'Claw of the Black Drake', 'https://classic.wowhead.com/item=19365'),
new Item('Firemaw', 'Cloak of Firemaw', 'https://classic.wowhead.com/item=19398'),
new Item('Firemaw', 'Firemaw\'s Clutch', 'https://classic.wowhead.com/item=19400'),
new Item('Firemaw', 'Legguards of the Fallen Crusader', 'https://classic.wowhead.com/item=19402'),
new Item('Firemaw', 'Primalist\'s Linked Legguards', 'https://classic.wowhead.com/item=19401'),
new Item('Firemaw', 'Scrolls of Blinding Light', 'https://classic.wowhead.com/item=19343'),
new Item('Ebonroc', 'Aegis of Preservation', 'https://classic.wowhead.com/item=19345'),
new Item('Ebonroc', 'Band of Forced Concentration', 'https://classic.wowhead.com/item=19403'),
new Item('Ebonroc', 'Dragonbreath Hand Cannon', 'https://classic.wowhead.com/item=19368'),
new Item('Ebonroc', 'Drake Fang Talisman', 'https://classic.wowhead.com/item=19406'),
new Item('Ebonroc', 'Ebony Flame Gloves', 'https://classic.wowhead.com/item=19407'),
new Item('Ebonroc', 'Malfurion\'s Blessed Bulwark', 'https://classic.wowhead.com/item=19405'),
new Item('Flamegor', 'Circle of Applied Force', 'https://classic.wowhead.com/item=19432'),
new Item('Flamegor', 'Dragon\'s Touch', 'https://classic.wowhead.com/item=19367'),
new Item('Flamegor', 'Emberweave Leggings', 'https://classic.wowhead.com/item=19433'),
new Item('Flamegor', 'Herald of Woe', 'https://classic.wowhead.com/item=19357'),
new Item('Flamegor', 'Shroud of Pure Thought', 'https://classic.wowhead.com/item=19430'),
new Item('Flamegor', 'Styleen\'s Impeding Scarab', 'https://classic.wowhead.com/item=19431'),
new Item('Chromaggus', 'Angelista\'s Grasp', 'https://classic.wowhead.com/item=19388'),
new Item('Chromaggus', 'Ashjre\'thul, Crossbow of Smiting', 'https://classic.wowhead.com/item=19361'),
new Item('Chromaggus', 'Bloodfang Spaulders', 'https://classic.wowhead.com/item=16832'),
new Item('Chromaggus', 'Chromatic Boots', 'https://classic.wowhead.com/item=19387'),
new Item('Chromaggus', 'Chromatically Tempered Sword', 'https://classic.wowhead.com/item=19352'),
new Item('Chromaggus', 'Claw of Chromaggus', 'https://classic.wowhead.com/item=19347'),
new Item('Chromaggus', 'Dragonstalker\'s Spaulders', 'https://classic.wowhead.com/item=16937'),
new Item('Chromaggus', 'Elementium Reinforced Bulwark', 'https://classic.wowhead.com/item=19349'),
new Item('Chromaggus', 'Elementium Threaded Cloak', 'https://classic.wowhead.com/item=19386'),
new Item('Chromaggus', 'Empowered Leggings', 'https://classic.wowhead.com/item=19385'),
new Item('Chromaggus', 'Girdle of the Fallen Crusader', 'https://classic.wowhead.com/item=19392'),
new Item('Chromaggus', 'Judgement Spaulders', 'https://classic.wowhead.com/item=16953'),
new Item('Chromaggus', 'Nemesis Spaulders', 'https://classic.wowhead.com/item=16932'),
new Item('Chromaggus', 'Netherwind Mantle', 'https://classic.wowhead.com/item=16917'),
new Item('Chromaggus', 'Pauldrons of Transcendence', 'https://classic.wowhead.com/item=16924'),
new Item('Chromaggus', 'Pauldrons of Wrath', 'https://classic.wowhead.com/item=16961'),
new Item('Chromaggus', 'Primalist\'s Linked Waistguard', 'https://classic.wowhead.com/item=19393'),
new Item('Chromaggus', 'Shimmering Geta', 'https://classic.wowhead.com/item=19391'),
new Item('Chromaggus', 'Stormrage Pauldrons', 'https://classic.wowhead.com/item=16902'),
new Item('Chromaggus', 'Taut Dragonhide Gloves', 'https://classic.wowhead.com/item=19390'),
new Item('Chromaggus', 'Taut Dragonhide Shoulderpads', 'https://classic.wowhead.com/item=19389'),
new Item('Nefarian', 'Archimtiros\' Ring of Reckoning', 'https://classic.wowhead.com/item=19376'),
new Item('Nefarian', 'Ashkandi, Greatsword of the Brotherhood', 'https://classic.wowhead.com/item=19364'),
new Item('Nefarian', 'Bloodfang Chestpiece', 'https://classic.wowhead.com/item=16905'),
new Item('Nefarian', 'Boots of the Shadow Flame', 'https://classic.wowhead.com/item=19381'),
new Item('Nefarian', 'Breastplate of Wrath', 'https://classic.wowhead.com/item=16966'),
new Item('Nefarian', 'Cloak of the Brood Lord', 'https://classic.wowhead.com/item=19378'),
new Item('Nefarian', 'Crul\'shorukh, Edge of Chaos', 'https://classic.wowhead.com/item=19363'),
new Item('Nefarian', 'Dragonstalker\'s Breastplate', 'https://classic.wowhead.com/item=16942'),
new Item('Nefarian', 'Head of Nefarian', 'https://classic.wowhead.com/item=19003'),
new Item('Nefarian', 'Judgement Breastplate', 'https://classic.wowhead.com/item=16958'),
new Item('Nefarian', 'Lok\'amir il Romathis', 'https://classic.wowhead.com/item=19360'),
new Item('Nefarian', 'Mish\'undare, Circlet of the Mind Flayer', 'https://classic.wowhead.com/item=19375'),
new Item('Nefarian', 'Neltharion\'s Tear', 'https://classic.wowhead.com/item=19379'),
new Item('Nefarian', 'Nemesis Robes', 'https://classic.wowhead.com/item=16931'),
new Item('Nefarian', 'Netherwind Robes', 'https://classic.wowhead.com/item=16916'),
new Item('Nefarian', 'Prestor\'s Talisman of Connivery', 'https://classic.wowhead.com/item=19377'),
new Item('Nefarian', 'Pure Elementium Band', 'https://classic.wowhead.com/item=19382'),
new Item('Nefarian', 'Robes of Transcendence', 'https://classic.wowhead.com/item=16923'),
new Item('Nefarian', 'Staff of the Shadow Flame', 'https://classic.wowhead.com/item=19356'),
new Item('Nefarian', 'Stormrage Chestguard', 'https://classic.wowhead.com/item=16897'),
new Item('Nefarian', 'Therazane\'s Link', 'https://classic.wowhead.com/item=19380'),
new Item('Shared', 'Bloodfang Gloves', 'https://classic.wowhead.com/item=16907'),
new Item('Shared', 'Dragonstalker\'s Gauntlets', 'https://classic.wowhead.com/item=16940'),
new Item('Shared', 'Drake Talon Cleaver', 'https://classic.wowhead.com/item=19353'),
new Item('Shared', 'Drake Talon Pauldrons', 'https://classic.wowhead.com/item=19394'),
new Item('Shared', 'Gauntlets of Wrath', 'https://classic.wowhead.com/item=16964'),
new Item('Shared', 'Handguards of Transcendence', 'https://classic.wowhead.com/item=16920'),
new Item('Shared', 'Judgement Gauntlets', 'https://classic.wowhead.com/item=16956'),
new Item('Shared', 'Nemesis Gloves', 'https://classic.wowhead.com/item=16928'),
new Item('Shared', 'Netherwind Gloves', 'https://classic.wowhead.com/item=16913'),
new Item('Shared', 'Rejuvenating Gem', 'https://classic.wowhead.com/item=19395'),
new Item('Shared', 'Ring of Blackrock', 'https://classic.wowhead.com/item=19397'),
new Item('Shared', 'Shadow Wing Focus Staff', 'https://classic.wowhead.com/item=19355'),
new Item('Shared', 'Stormrage Handguards', 'https://classic.wowhead.com/item=16899'),
new Item('Shared', 'Taut Dragonhide Belt', 'https://classic.wowhead.com/item=19396'),
new Item('Trash', 'Band of Dark Dominion', 'https://classic.wowhead.com/item=19434'),
new Item('Trash', 'Boots of Pure Thought', 'https://classic.wowhead.com/item=19437'),
new Item('Trash', 'Cloak of Draconic Might', 'https://classic.wowhead.com/item=19436'),
new Item('Trash', 'Doom\'s Edge', 'https://classic.wowhead.com/item=19362'),
new Item('Trash', 'Draconic Avenger', 'https://classic.wowhead.com/item=19354'),
new Item('Trash', 'Draconic Maul', 'https://classic.wowhead.com/item=19358'),
new Item('Trash', 'Elementium Ore', 'https://classic.wowhead.com/item=18562'),
new Item('Trash', 'Essence Gatherer', 'https://classic.wowhead.com/item=19435'),
new Item('Trash', 'Interlaced Shadow Jerkin', 'https://classic.wowhead.com/item=19439'),
new Item('Trash', 'Ringo\'s Blizzard Boots', 'https://classic.wowhead.com/item=19438')
];
const ITEMS_AQ40 = [
new Item('The Prophet Skeram', 'Amulet of Foul Warding', 'https://classic.wowhead.com/item=21702'),
new Item('The Prophet Skeram', 'Barrage Shoulders', 'https://classic.wowhead.com/item=21699'),
new Item('The Prophet Skeram', 'Beetle Scaled Wristguards', 'https://classic.wowhead.com/item=21708'),
new Item('The Prophet Skeram', 'Boots of the Fallen Prophet', 'https://classic.wowhead.com/item=21705'),
new Item('The Prophet Skeram', 'Boots of the Redeemed Prophecy', 'https://classic.wowhead.com/item=21704'),
new Item('The Prophet Skeram', 'Boots of the Unwavering Will', 'https://classic.wowhead.com/item=21706'),
new Item('The Prophet Skeram', 'Breastplate of Annihilation', 'https://classic.wowhead.com/item=21814'),
new Item('The Prophet Skeram', 'Cloak of Concentrated Hatred', 'https://classic.wowhead.com/item=21701'),
new Item('The Prophet Skeram', 'Hammer of Ji\'zhi', 'https://classic.wowhead.com/item=21703'),
new Item('The Prophet Skeram', 'Leggings of Immersion', 'https://classic.wowhead.com/item=21698'),
new Item('The Prophet Skeram', 'Pendant of the Qiraji Guardian', 'https://classic.wowhead.com/item=21700'),
new Item('The Prophet Skeram', 'Plans: Thick Obsidian Breastplate', 'https://classic.wowhead.com/item=22222'),
new Item('The Prophet Skeram', 'Ring of Swarming Thought', 'https://classic.wowhead.com/item=21707'),
new Item('The Prophet Skeram', 'Staff of the Qiraji Prophets', 'https://classic.wowhead.com/item=21128'),
new Item('Bug Trio', 'Angelista\'s Touch', 'https://classic.wowhead.com/item=21695'),
new Item('Bug Trio', 'Cape of the Trinity', 'https://classic.wowhead.com/item=21697'),
new Item('Bug Trio', 'Guise of the Devourer', 'https://classic.wowhead.com/item=21693'),
new Item('Bug Trio', 'Robes of the Triumvirate', 'https://classic.wowhead.com/item=21696'),
new Item('Bug Trio', 'Ternary Mantle', 'https://classic.wowhead.com/item=21694'),
new Item('Bug Trio', 'Triad Girdle', 'https://classic.wowhead.com/item=21692'),
new Item('Lord Kri', 'Petrified Scarab', 'https://classic.wowhead.com/item=21685'),
new Item('Lord Kri', 'Ring of the Devoured', 'https://classic.wowhead.com/item=21681'),
new Item('Lord Kri', 'Vest of Swift Execution', 'https://classic.wowhead.com/item=21680'),
new Item('Lord Kri', 'Wand of Qiraji Nobility', 'https://classic.wowhead.com/item=21603'),
new Item('Vem', 'Angelista\'s Charm', 'https://classic.wowhead.com/item=21690'),
new Item('Vem', 'Boots of the Fallen Hero', 'https://classic.wowhead.com/item=21688'),
new Item('Vem', 'Gloves of Ebru', 'https://classic.wowhead.com/item=21689'),
new Item('Vem', 'Ooze-ridden Gauntlets', 'https://classic.wowhead.com/item=21691'),
new Item('Princess Yauj', 'Bile-Covered Gauntlets', 'https://classic.wowhead.com/item=21682'),
new Item('Princess Yauj', 'Mantle of Phrenic Power', 'https://classic.wowhead.com/item=21686'),
new Item('Princess Yauj', 'Mantle of the Desert Crusade', 'https://classic.wowhead.com/item=21683'),
new Item('Princess Yauj', 'Mantle of the Desert\'s Fury', 'https://classic.wowhead.com/item=21684'),
new Item('Princess Yauj', 'Ukko\'s Ring of Darkness', 'https://classic.wowhead.com/item=21687'),
new Item('Battleguard Sartura', 'Badge of the Swarmguard', 'https://classic.wowhead.com/item=21670'),
new Item('Battleguard Sartura', 'Creeping Vine Helm', 'https://classic.wowhead.com/item=21669'),
new Item('Battleguard Sartura', 'Gauntlets of Steadfast Determination', 'https://classic.wowhead.com/item=21674'),
new Item('Battleguard Sartura', 'Gloves of Enforcement', 'https://classic.wowhead.com/item=21672'),
new Item('Battleguard Sartura', 'Leggings of the Festering Swarm', 'https://classic.wowhead.com/item=21676'),
new Item('Battleguard Sartura', 'Legplates of Blazing Light', 'https://classic.wowhead.com/item=21667'),
new Item('Battleguard Sartura', 'Necklace of Purity', 'https://classic.wowhead.com/item=21678'),
new Item('Battleguard Sartura', 'Recomposed Boots', 'https://classic.wowhead.com/item=21648'),
new Item('Battleguard Sartura', 'Robes of the Battleguard', 'https://classic.wowhead.com/item=21671'),
new Item('Battleguard Sartura', 'Sartura\'s Might', 'https://classic.wowhead.com/item=21666'),
new Item('Battleguard Sartura', 'Scaled Leggings of Qiraji Fury', 'https://classic.wowhead.com/item=21668'),
new Item('Battleguard Sartura', 'Silithid Claw', 'https://classic.wowhead.com/item=21673'),
new Item('Battleguard Sartura', 'Thick Qirajihide Belt', 'https://classic.wowhead.com/item=21675'),
new Item('Fankriss the Unyielding', 'Ancient Qiraji Ripper', 'https://classic.wowhead.com/item=21650'),
new Item('Fankriss the Unyielding', 'Barb of the Sand Reaver', 'https://classic.wowhead.com/item=21635'),
new Item('Fankriss the Unyielding', 'Barbed Choker', 'https://classic.wowhead.com/item=21664'),
new Item('Fankriss the Unyielding', 'Cloak of Untold Secrets', 'https://classic.wowhead.com/item=21627'),
new Item('Fankriss the Unyielding', 'Fetish of the Sand Reaver', 'https://classic.wowhead.com/item=21647'),
new Item('Fankriss the Unyielding', 'Hive Tunneler\'s Boots', 'https://classic.wowhead.com/item=21645'),
new Item('Fankriss the Unyielding', 'Libram of Grace', 'https://classic.wowhead.com/item=22402'),
new Item('Fankriss the Unyielding', 'Mantle of Wicked Revenge', 'https://classic.wowhead.com/item=21665'),
new Item('Fankriss the Unyielding', 'Pauldrons of the Unrelenting', 'https://classic.wowhead.com/item=21639'),
new Item('Fankriss the Unyielding', 'Robes of the Guardian Saint', 'https://classic.wowhead.com/item=21663'),
new Item('Fankriss the Unyielding', 'Scaled Sand Reaver Leggings', 'https://classic.wowhead.com/item=21651'),
new Item('Fankriss the Unyielding', 'Silithid Carapace Chestguard', 'https://classic.wowhead.com/item=21652'),
new Item('Fankriss the Unyielding', 'Totem of Life', 'https://classic.wowhead.com/item=22396'),
new Item('Viscidus', 'Gauntlets of Kalimdor', 'https://classic.wowhead.com/item=21624'),
new Item('Viscidus', 'Gauntlets of the Righteous Champion', 'https://classic.wowhead.com/item=21623'),
new Item('Viscidus', 'Idol of Health', 'https://classic.wowhead.com/item=22399'),
new Item('Viscidus', 'Ring of the Qiraji Fury', 'https://classic.wowhead.com/item=21677'),
new Item('Viscidus', 'Scarab Brooch', 'https://classic.wowhead.com/item=21625'),
new Item('Viscidus', 'Sharpened Silithid Femur', 'https://classic.wowhead.com/item=21622'),
new Item('Viscidus', 'Slime-coated Leggings', 'https://classic.wowhead.com/item=21626'),
new Item('Princess Huhuran', 'Cloak of the Golden Hive', 'https://classic.wowhead.com/item=21621'),
new Item('Princess Huhuran', 'Gloves of the Messiah', 'https://classic.wowhead.com/item=21619'),
new Item('Princess Huhuran', 'Hive Defiler Wristguards', 'https://classic.wowhead.com/item=21618'),
new Item('Princess Huhuran', 'Huhuran\'s Stinger', 'https://classic.wowhead.com/item=21616'),
new Item('Princess Huhuran', 'Ring of the Martyr', 'https://classic.wowhead.com/item=21620'),
new Item('Princess Huhuran', 'Wasphide Gauntlets', 'https://classic.wowhead.com/item=21617'),
new Item('Ouro', 'Burrower Bracers', 'https://classic.wowhead.com/item=21611'),
new Item('Ouro', 'Don Rigoberto\'s Lost Hat', 'https://classic.wowhead.com/item=21615'),
new Item('Ouro', 'Jom Gabbar', 'https://classic.wowhead.com/item=23570'),
new Item('Ouro', 'Larvae of the Great Worm', 'https://classic.wowhead.com/item=23557'),
new Item('Ouro', 'Ouro\'s Intact Hide', 'https://classic.wowhead.com/item=20927'),
new Item('Ouro', 'Skin of the Great Sandworm', 'https://classic.wowhead.com/item=20931'),
new Item('Ouro', 'The Burrower\'s Shell', 'https://classic.wowhead.com/item=23558'),
new Item('Ouro', 'Wormscale Blocker', 'https://classic.wowhead.com/item=21610'),
new Item('Twin Emperors', 'Amulet of Vek\'nilash', 'https://classic.wowhead.com/item=21608'),
new Item('Twin Emperors', 'Belt of the Fallen Emperor', 'https://classic.wowhead.com/item=21606'),
new Item('Twin Emperors', 'Boots of Epiphany', 'https://classic.wowhead.com/item=21600'),
new Item('Twin Emperors', 'Bracelets of Royal Redemption', 'https://classic.wowhead.com/item=21604'),
new Item('Twin Emperors', 'Formula: Enchant Cloak - Subtlety', 'https://classic.wowhead.com/item=20735', QUALITY_RARE),
new Item('Twin Emperors', 'Formula: Enchant Gloves - Threat', 'https://classic.wowhead.com/item=20726', QUALITY_RARE),
new Item('Twin Emperors', 'Gloves of the Hidden Temple', 'https://classic.wowhead.com/item=21605'),
new Item('Twin Emperors', 'Grasp of the Fallen Emperor', 'https://classic.wowhead.com/item=21607'),
new Item('Twin Emperors', 'Kalimdor\'s Revenge', 'https://classic.wowhead.com/item=21679'),
new Item('Twin Emperors', 'Qiraji Execution Bracers', 'https://classic.wowhead.com/item=21602'),
new Item('Twin Emperors', 'Regenerating Belt of Vek\'nilash', 'https://classic.wowhead.com/item=21609'),
new Item('Twin Emperors', 'Ring of Emperor Vek\'lor', 'https://classic.wowhead.com/item=21601'),
new Item('Twin Emperors', 'Royal Qiraji Belt', 'https://classic.wowhead.com/item=21598'),
new Item('Twin Emperors', 'Royal Scepter of Vek\'lor', 'https://classic.wowhead.com/item=21597'),
new Item('Twin Emperors', 'Vek\'lor\'s Diadem', 'https://classic.wowhead.com/item=20930'),
new Item('Twin Emperors', 'Vek\'lor\'s Gloves of Devastation', 'https://classic.wowhead.com/item=21599'),
new Item('Twin Emperors', 'Vek\'nilash\'s Circlet', 'https://classic.wowhead.com/item=20926'),
new Item('C\'Thun', 'Belt of Never-ending Agony', 'https://classic.wowhead.com/item=21586'),
new Item('C\'Thun', 'Carapace of the Old God', 'https://classic.wowhead.com/item=20929'),
new Item('C\'Thun', 'Cloak of Clarity', 'https://classic.wowhead.com/item=21583'),
new Item('C\'Thun', 'Cloak of the Devoured', 'https://classic.wowhead.com/item=22731'),
new Item('C\'Thun', 'Dark Edge of Insanity', 'https://classic.wowhead.com/item=21134'),
new Item('C\'Thun', 'Dark Storm Gauntlets', 'https://classic.wowhead.com/item=21585'),
new Item('C\'Thun', 'Death\'s Sting', 'https://classic.wowhead.com/item=21126'),
new Item('C\'Thun', 'Eye of C\'Thun', 'https://classic.wowhead.com/item=21221'),
new Item('C\'Thun', 'Eyestalk Waist Cord', 'https://classic.wowhead.com/item=22730'),
new Item('C\'Thun', 'Gauntlets of Annihilation', 'https://classic.wowhead.com/item=21581'),
new Item('C\'Thun', 'Grasp of the Old God', 'https://classic.wowhead.com/item=21582'),
new Item('C\'Thun', 'Husk of the Old God', 'https://classic.wowhead.com/item=20933'),
new Item('C\'Thun', 'Mark of C\'Thun', 'https://classic.wowhead.com/item=22732'),
new Item('C\'Thun', 'Ring of the Godslayer', 'https://classic.wowhead.com/item=21596'),
new Item('C\'Thun', 'Scepter of the False Prophet', 'https://classic.wowhead.com/item=21839'),
new Item('C\'Thun', 'Vanquished Tentacle of C\'Thun', 'https://classic.wowhead.com/item=21579'),
new Item('Shared', 'Formula: Enchant Cloak - Dodge', 'https://classic.wowhead.com/item=20736', QUALITY_RARE),
new Item('Shared', 'Formula: Enchant Cloak - Stealth', 'https://classic.wowhead.com/item=20734', QUALITY_RARE),
new Item('Shared', 'Formula: Enchant Gloves - Fire Power', 'https://classic.wowhead.com/item=20729', QUALITY_RARE),
new Item('Shared', 'Formula: Enchant Gloves - Frost Power', 'https://classic.wowhead.com/item=20728', QUALITY_RARE),
new Item('Shared', 'Formula: Enchant Gloves - Healing Power', 'https://classic.wowhead.com/item=20730', QUALITY_RARE),
new Item('Shared', 'Formula: Enchant Gloves - Shadow Power', 'https://classic.wowhead.com/item=20727', QUALITY_RARE),
new Item('Shared', 'Formula: Enchant Gloves - Superior Agility', 'https://classic.wowhead.com/item=20731', QUALITY_RARE),
new Item('Shared', 'Imperial Qiraji Armaments', 'https://classic.wowhead.com/item=21232'),
new Item('Shared', 'Imperial Qiraji Regalia', 'https://classic.wowhead.com/item=21237'),
new Item('Shared', 'Qiraji Bindings of Command', 'https://classic.wowhead.com/item=20928'),
new Item('Shared', 'Qiraji Bindings of Dominance', 'https://classic.wowhead.com/item=20932'),
new Item('Trash', 'Anubisath Warhammer', 'https://classic.wowhead.com/item=21837'),
new Item('Trash', 'Garb of Royal Ascension', 'https://classic.wowhead.com/item=21838'),
new Item('Trash', 'Gloves of the Immortal', 'https://classic.wowhead.com/item=21888'),
new Item('Trash', 'Gloves of the Redeemed Prophecy', 'https://classic.wowhead.com/item=21889'),
new Item('Trash', 'Neretzek, The Blood Drinker', 'https://classic.wowhead.com/item=21856'),
new Item('Trash', 'Ritssyn\'s Ring of Chaos', 'https://classic.wowhead.com/item=21836'),
new Item('Trash', 'Shard of the Fallen Star', 'https://classic.wowhead.com/item=21891')
];
const ITEMS_NAXX_SPIDER_WING = [
new Item('Anub\'Rekhan', 'Band of Unanswered Prayers', 'https://classic.wowhead.com/item=22939'),
new Item('Anub\'Rekhan', 'Cryptfiend Silk Cloak', 'https://classic.wowhead.com/item=22938'),
new Item('Anub\'Rekhan', 'Gem of Nerubis', 'https://classic.wowhead.com/item=22937'),
new Item('Anub\'Rekhan', 'Touch of Frost', 'https://classic.wowhead.com/item=22935'),
new Item('Anub\'Rekhan', 'Wristguards of Vengeance', 'https://classic.wowhead.com/item=22936'),
new Item('Grand Widow Faerlina', 'Icebane Pauldrons', 'https://classic.wowhead.com/item=22940'),
new Item('Grand Widow Faerlina', 'Malice Stone Pendant', 'https://classic.wowhead.com/item=22943'),
new Item('Grand Widow Faerlina', 'Polar Shoulder Pads', 'https://classic.wowhead.com/item=22941'),
new Item('Grand Widow Faerlina', 'The Widow\'s Embrace', 'https://classic.wowhead.com/item=22942'),
new Item('Grand Widow Faerlina', 'Widow\'s Remorse', 'https://classic.wowhead.com/item=22806'),
new Item('Maexxna', 'Crystal Webbed Robe', 'https://classic.wowhead.com/item=23220'),
new Item('Maexxna', 'Desecrated Gauntlets', 'https://classic.wowhead.com/item=22357'),
new Item('Maexxna', 'Desecrated Gloves', 'https://classic.wowhead.com/item=22371'),
new Item('Maexxna', 'Desecrated Handguards', 'https://classic.wowhead.com/item=22364'),
new Item('Maexxna', 'Kiss of the Spider', 'https://classic.wowhead.com/item=22954'),
new Item('Maexxna', 'Maexxna\'s Fang', 'https://classic.wowhead.com/item=22804'),
new Item('Maexxna', 'Pendant of Forgotten Names', 'https://classic.wowhead.com/item=22947'),
new Item('Maexxna', 'Wraith Blade', 'https://classic.wowhead.com/item=22807')
];
const ITEMS_NAXX_PLAGUE_WING = [
new Item('Noth the Plaguebringer', 'Band of the Inevitable', 'https://classic.wowhead.com/item=23031'),
new Item('Noth the Plaguebringer', 'Cloak of the Scourge', 'https://classic.wowhead.com/item=23030'),
new Item('Noth the Plaguebringer', 'Hailstone Band', 'https://classic.wowhead.com/item=23028'),
new Item('Noth the Plaguebringer', 'Hatchet of Sundered Bone', 'https://classic.wowhead.com/item=22816'),
new Item('Noth the Plaguebringer', 'Libram of Light', 'https://classic.wowhead.com/item=23006'),
new Item('Noth the Plaguebringer', 'Noth\'s Frigid Heart', 'https://classic.wowhead.com/item=23029'),
new Item('Noth the Plaguebringer', 'Totem of Flowing Water', 'https://classic.wowhead.com/item=23005'),
new Item('Heigan the Unclean', 'Icebane Helmet', 'https://classic.wowhead.com/item=23019'),
new Item('Heigan the Unclean', 'Icy Scale Coif', 'https://classic.wowhead.com/item=23033'),
new Item('Heigan the Unclean', 'Legplates of Carnage', 'https://classic.wowhead.com/item=23068'),
new Item('Heigan the Unclean', 'Necklace of Necropsy', 'https://classic.wowhead.com/item=23036'),
new Item('Heigan the Unclean', 'Preceptor\'s Hat', 'https://classic.wowhead.com/item=23035'),
new Item('Loatheb', 'Band of Unnatural Forces', 'https://classic.wowhead.com/item=23038'),
new Item('Loatheb', 'Brimstone Staff', 'https://classic.wowhead.com/item=22800'),
new Item('Loatheb', 'Desecrated Leggings', 'https://classic.wowhead.com/item=22366'),
new Item('Loatheb', 'Desecrated Legguards', 'https://classic.wowhead.com/item=22359'),
new Item('Loatheb', 'Desecrated Legplates', 'https://classic.wowhead.com/item=22352'),
new Item('Loatheb', 'Loatheb\'s Reflection', 'https://classic.wowhead.com/item=23042'),
new Item('Loatheb', 'Ring of Spiritual Fervor', 'https://classic.wowhead.com/item=23037'),
new Item('Loatheb', 'The Eye of Nerub', 'https://classic.wowhead.com/item=23039')
];
const ITEMS_NAXX_DEATHKNIGHT_WING = [
new Item('Instructor Razuvious', 'Girdle of the Mentor', 'https://classic.wowhead.com/item=23219'),
new Item('Instructor Razuvious', 'Iblis, Blade of the Fallen Seraph', 'https://classic.wowhead.com/item=23014'),
new Item('Instructor Razuvious', 'Idol of Longevity', 'https://classic.wowhead.com/item=23004'),
new Item('Instructor Razuvious', 'Signet of the Fallen Defender', 'https://classic.wowhead.com/item=23018'),
new Item('Instructor Razuvious', 'Veil of Eclipse', 'https://classic.wowhead.com/item=23017'),
new Item('Instructor Razuvious', 'Wand of the Whispering Dead', 'https://classic.wowhead.com/item=23009'),
new Item('Gothik the Harvester', 'Boots of Displacement', 'https://classic.wowhead.com/item=23073'),
new Item('Gothik the Harvester', 'Glacial Headdress', 'https://classic.wowhead.com/item=23032'),
new Item('Gothik the Harvester', 'Polar Helmet', 'https://classic.wowhead.com/item=23020'),
new Item('Gothik the Harvester', 'Sadist\'s Collar', 'https://classic.wowhead.com/item=23023'),
new Item('Gothik the Harvester', 'The Soul Harvester\s Bindings', 'https://classic.wowhead.com/item=23021'),
new Item('The Four Horsemen', 'Corrupted Ashbringer', 'https://classic.wowhead.com/item=22691'),
new Item('The Four Horsemen', 'Desecrated Breastplate', 'https://classic.wowhead.com/item=22349'),
new Item('The Four Horsemen', 'Desecrated Robe', 'https://classic.wowhead.com/item=22351'),
new Item('The Four Horsemen', 'Desecrated Tunic', 'https://classic.wowhead.com/item=22350'),
new Item('The Four Horsemen', 'Leggings of Apocalypse', 'https://classic.wowhead.com/item=23071'),
new Item('The Four Horsemen', 'Maul of the Redeemed Crusader', 'https://classic.wowhead.com/item=22809'),
new Item('The Four Horsemen', 'Seal of the Damned', 'https://classic.wowhead.com/item=23025'),
new Item('The Four Horsemen', 'Soulstring', 'https://classic.wowhead.com/item=22811'),
new Item('The Four Horsemen', 'Warmth of Forgiveness', 'https://classic.wowhead.com/item=23027')
];
const ITEMS_NAXX_ABOMINATION_WING = [
new Item('Patchwerk', 'Band of Reanimation', 'https://classic.wowhead.com/item=22961'),
new Item('Patchwerk', 'Cloak of Suturing', 'https://classic.wowhead.com/item=22960'),
new Item('Patchwerk', 'Severance', 'https://classic.wowhead.com/item=22815'),
new Item('Patchwerk', 'The Plague Bearer', 'https://classic.wowhead.com/item=22818'),
new Item('Patchwerk', 'Wand of Fates', 'https://classic.wowhead.com/item=22820'),
new Item('Grobbulus', 'Glacial Mantle', 'https://classic.wowhead.com/item=22968'),
new Item('Grobbulus', 'Icy Scale Spaulders', 'https://classic.wowhead.com/item=22967'),
new Item('Grobbulus', 'Midnight Haze', 'https://classic.wowhead.com/item=22803'),
new Item('Grobbulus', 'The End of Dreams', 'https://classic.wowhead.com/item=22988'),
new Item('Grobbulus', 'Toxin Injector', 'https://classic.wowhead.com/item=22810'),
new Item('Gluth', 'Claymore of Unholy Might', 'https://classic.wowhead.com/item=22813'),
new Item('Gluth', 'Death\'s Bargain', 'https://classic.wowhead.com/item=23075'),
new Item('Gluth', 'Digested Hand of Power', 'https://classic.wowhead.com/item=22994'),
new Item('Gluth', 'Gluth\'s Missing Collar', 'https://classic.wowhead.com/item=22981'),
new Item('Gluth', 'Rime Covered Mantle', 'https://classic.wowhead.com/item=22983'),
new Item('Thaddius', 'Desecrated Circlet', 'https://classic.wowhead.com/item=22367'),
new Item('Thaddius', 'Desecrated Headpiece', 'https://classic.wowhead.com/item=22360'),
new Item('Thaddius', 'Desecrated Helmet', 'https://classic.wowhead.com/item=22353'),
new Item('Thaddius', 'Eye of Diminution', 'https://classic.wowhead.com/item=23001'),
new Item('Thaddius', 'Leggings of Polarity', 'https://classic.wowhead.com/item=23070'),
new Item('Thaddius', 'Plated Abomination Ribcage', 'https://classic.wowhead.com/item=23000'),
new Item('Thaddius', 'Spire of Twilight', 'https://classic.wowhead.com/item=22801'),
new Item('Thaddius', 'The Castigator', 'https://classic.wowhead.com/item=22808')
];
const ITEMS_NAXX_FROSTWYRM_LAIR = [
new Item('Sapphiron', 'Claw of the Frost Wyrm', 'https://classic.wowhead.com/item=23242'),
new Item('Sapphiron', 'Cloak of the Necropolis', 'https://classic.wowhead.com/item=23050'),
new Item('Sapphiron', 'Eye of the Dead', 'https://classic.wowhead.com/item=23047'),
new Item('Sapphiron', 'Fortitude of the Scourge', 'https://classic.wowhead.com/item=23549'),
new Item('Sapphiron', 'Glyph of Deflection', 'https://classic.wowhead.com/item=23040'),
new Item('Sapphiron', 'Might of the Scourge', 'https://classic.wowhead.com/item=23548'),
new Item('Sapphiron', 'Power of the Scourge', 'https://classic.wowhead.com/item=23545'),
new Item('Sapphiron', 'Resilience of the Scourge', 'https://classic.wowhead.com/item=23547'),
new Item('Sapphiron', 'Sapphiron\'s Left Eye', 'https://classic.wowhead.com/item=23049'),
new Item('Sapphiron', 'Sapphiron\'s Right Eye', 'https://classic.wowhead.com/item=23048'),
new Item('Sapphiron', 'Shroud of Dominion', 'https://classic.wowhead.com/item=23045'),
new Item('Sapphiron', 'Slayer\'s Crest', 'https://classic.wowhead.com/item=23041'),
new Item('Sapphiron', 'The Face of Death', 'https://classic.wowhead.com/item=23043'),
new Item('Sapphiron', 'The Restrained Essence of Sapphiron', 'https://classic.wowhead.com/item=23046'),
new Item('Kel\'Thuzad', 'Bonescythe Ring', 'https://classic.wowhead.com/item=23060'),
new Item('Kel\'Thuzad', 'Doomfinger', 'https://classic.wowhead.com/item=22821'),
new Item('Kel\'Thuzad', 'Frostfire Ring', 'https://classic.wowhead.com/item=23062'),
new Item('Kel\'Thuzad', 'Gem of Trapped Innocents', 'https://classic.wowhead.com/item=23057'),
new Item('Kel\'Thuzad', 'Gressil, Dawn of Ruin', 'https://classic.wowhead.com/item=23054'),
new Item('Kel\'Thuzad', 'Hammer of the Twisting Nether', 'https://classic.wowhead.com/item=23056'),
new Item('Kel\'Thuzad', 'Kingsfall', 'https://classic.wowhead.com/item=22802'),
new Item('Kel\'Thuzad', 'Might of Menethil', 'https://classic.wowhead.com/item=22798'),
new Item('Kel\'Thuzad', 'Nerubian Slavemaker', 'https://classic.wowhead.com/item=22812'),
new Item('Kel\'Thuzad', 'Plagueheart Ring', 'https://classic.wowhead.com/item=23063'),
new Item('Kel\'Thuzad', 'Ring of Faith', 'https://classic.wowhead.com/item=23061'),
new Item('Kel\'Thuzad', 'Ring of Redemption', 'https://classic.wowhead.com/item=23066'),
new Item('Kel\'Thuzad', 'Ring of the Cryptstalker', 'https://classic.wowhead.com/item=23067'),
new Item('Kel\'Thuzad', 'Ring of the Dreadnaught', 'https://classic.wowhead.com/item=23059'),
new Item('Kel\'Thuzad', 'Ring of the Dreamwalker', 'https://classic.wowhead.com/item=23064'),
new Item('Kel\'Thuzad', 'Shield of Condemnation', 'https://classic.wowhead.com/item=22819'),
new Item('Kel\'Thuzad', 'Soulseeker', 'https://classic.wowhead.com/item=22799'),
new Item('Kel\'Thuzad', 'Stormrage\'s Talisman of Seething', 'https://classic.wowhead.com/item=23053'),
new Item('Kel\'Thuzad', 'The Hungering Cold', 'https://classic.wowhead.com/item=23577'),
new Item('Kel\'Thuzad', 'The Phylactery of Kel\'Thuzad', 'https://classic.wowhead.com/item=22520')
];
const ITEMS_NAXX_TRASH_AND_TIER = [
new Item('Shared', 'Desecrated Belt', 'https://classic.wowhead.com/item=22370'),
new Item('Shared', 'Desecrated Bindings', 'https://classic.wowhead.com/item=22369'),
new Item('Shared', 'Desecrated Boots', 'https://classic.wowhead.com/item=22365'),
new Item('Shared', 'Desecrated Bracers', 'https://classic.wowhead.com/item=22355'),
new Item('Shared', 'Desecrated Girdle', 'https://classic.wowhead.com/item=22363'),
new Item('Shared', 'Desecrated Pauldrons', 'https://classic.wowhead.com/item=22354'),
new Item('Shared', 'Desecrated Sabatons', 'https://classic.wowhead.com/item=22358'),
new Item('Shared', 'Desecrated Sandals', 'https://classic.wowhead.com/item=22372'),
new Item('Shared', 'Desecrated Shoulderpads', 'https://classic.wowhead.com/item=22368'),
new Item('Shared', 'Desecrated Spaulders', 'https://classic.wowhead.com/item=22361'),
new Item('Shared', 'Desecrated Waistguard', 'https://classic.wowhead.com/item=22356'),
new Item('Shared', 'Desecrated Wristguards', 'https://classic.wowhead.com/item=22362'),
new Item('Trash', 'Belt of the Grand Crusader', 'https://classic.wowhead.com/item=23666'),
new Item('Trash', 'Ghoul Skin Tunic', 'https://classic.wowhead.com/item=23226'),
new Item('Trash', 'Harbinger of Doom', 'https://classic.wowhead.com/item=23044'),
new Item('Trash', 'Leggings of the Grand Crusader', 'https://classic.wowhead.com/item=23668'),
new Item('Trash', 'Misplaced Servo Arm', 'https://classic.wowhead.com/item=23221'),
new Item('Trash', 'Necro-Knight\'s Garb', 'https://classic.wowhead.com/item=23069'),
new Item('Trash', 'Ring of the Eternal Flame', 'https://classic.wowhead.com/item=23237'),
new Item('Trash', 'Spaulders of the Grand Crusader', 'https://classic.wowhead.com/item=23667'),
new Item('Trash', 'Stygian Buckler', 'https://classic.wowhead.com/item=23238')
];
const CONFIGS = {
BWL: {
spreadsheetId: '1l_ak2mtbyc1qWAhNnn7gh0pQ9Vu87QVSr8xcZRU9aeU',
range: 'Log!A3223:H',
logBlocks: 2,
sections: [
{ name: 'Blackwing Lair', items: ITEMS_BWL },
{ name: 'Molten Core', items: ITEMS_MC }
]
},
AQ40: {
spreadsheetId: '1rHYx2Sjc5gh8q7WynWovDk1P7xvLakoKfcxUmFKs4Y4',
range: 'Log!A3540:H',
logBlocks: 1,
sections: [
{ name: 'Temple of Ahn\'Qiraj', items: ITEMS_AQ40 }
]
},
NAXX: {
spreadsheetId: '1s_Ja3ae3QePMox_8gMdkIfjLAVcxsLMVSAUdpbdP2to',
range: 'Log!A4114:H',
logBlocks: 1,
sections: [
{ name: 'Spider Wing', items: ITEMS_NAXX_SPIDER_WING },
{ name: 'Plague Wing', items: ITEMS_NAXX_PLAGUE_WING },
{ name: 'Deathknight Wing', items: ITEMS_NAXX_DEATHKNIGHT_WING },
{ name: 'Abomination Wing', items: ITEMS_NAXX_ABOMINATION_WING },
{ name: 'Frostwyrm Lair', items: ITEMS_NAXX_FROSTWYRM_LAIR },
{ name: 'Trash and Tier 3 items', items: ITEMS_NAXX_TRASH_AND_TIER },
]
},
NAXX2: {
spreadsheetId: '1ZV_9iUlfEY64OKTsuDgxcibha3ptaY0mh8cZaKHK-04',
range: 'Log!A4349:H',
logBlocks: 1,
sections: [
{ name: 'Spider Wing', items: ITEMS_NAXX_SPIDER_WING },
{ name: 'Plague Wing', items: ITEMS_NAXX_PLAGUE_WING },
{ name: 'Deathknight Wing', items: ITEMS_NAXX_DEATHKNIGHT_WING },
{ name: 'Abomination Wing', items: ITEMS_NAXX_ABOMINATION_WING },
{ name: 'Frostwyrm Lair', items: ITEMS_NAXX_FROSTWYRM_LAIR },
{ name: 'Trash and Tier 3 items', items: ITEMS_NAXX_TRASH_AND_TIER },
]
}
};
//const config = CONFIGS.BWL;
//const config = CONFIGS.NAXX;
const urlParams = new URLSearchParams(window.location.search);
const urlParamRaid = urlParams.get('raid');
console.log(`URL Params: raid=${urlParamRaid}`);
const paramRaid = (CONFIGS[urlParamRaid]) ? urlParamRaid : 'NAXX';
const config = CONFIGS[paramRaid];
const linkId = `link-${paramRaid.toLowerCase()}`;
document.getElementById(linkId).classList.add('active');
let gapiInited = false;
let srDataJson;
let srDataLua;
function srDataJsonToLua(srData) {
let out = 'local srData = {\n'
let count = 0;
for (const itemId in srData) {
if (Object.hasOwnProperty.call(srData, itemId)) {
count += 1;
if (count > 1) {
out += `,\n`;
}
out += `\t[${itemId}] = {\n`;
let players = srData[itemId];
let count2 = 0;
for (const i in players) {
if (Object.hasOwnProperty.call(players, i)) {
count2 += 1;
let sr = players[i];
if (count2 > 1) {
out += ',\n';
}
out += `\t\t{\n`;
out += `\t\t\t["num"] = ${sr['num']},\n`;
out += `\t\t\t["date"] = "${sr['date']}",\n`;
out += `\t\t\t["name"] = "${sr['name']}",\n`;
out += `\t\t\t["class"] = "${sr['class']}",\n`;
out += `\t\t\t["itemId"] = ${sr['itemId']},\n`;
out += `\t\t\t["points"] = ${sr['points']}\n`;
out += `\t\t}`;
}
}
out += `\n\t}`;
}
}
out += '\n};\n'
return out;
}
/**
* Callback after api.js is loaded.
*/
function gapiLoaded() {
console.log('GApi loaded');
gapi.load('client', initializeGapiClient);
}
/**
* Callback after the API client is loaded. Loads the
* discovery doc to initialize the API.
*/
async function initializeGapiClient() {
await gapi.client.init({
apiKey: API_KEY,
discoveryDocs: [DISCOVERY_DOC],
});
gapiInited = true;
console.log('Client initialized');
fetchAndProcessData();
}
function showMessage(message) {
document.getElementById('message').innerText = message;
}
async function fetchAndProcessData() {
let response;
try {
response = await gapi.client.sheets.spreadsheets.values.get({
spreadsheetId: config.spreadsheetId,
range: config.range
});
const range = response.result;
if (!range || !range.values || range.values.length == 0) {
showMessage('Data fetched: no data found');
console.log('Data fetched: no data found');
} else {
console.log(`Data fetched: ${range.values.length} rows`);
processRange(range);
}
} catch (err) {
showMessage(`Error fetching data: ${err.message}`);
console.log(`Error fetching data: ${err.message}`);
}
}
function getIndexOrThrow(arr, val, message) {
const idx = arr.indexOf(val);
if (idx < 0) {
throw message;
}
return idx;
}
class HeaderMeta {
constructor(headerRow) {
this.headerRow = headerRow;
this.num = getIndexOrThrow(headerRow, '#', `Cannot get index of column: '#'`);
this.date = getIndexOrThrow(headerRow, 'Date', `Cannot get index of column: 'Date'`);
this.name = getIndexOrThrow(headerRow, 'Name', `Cannot get index of column: 'Name'`);
this.class = getIndexOrThrow(headerRow, 'Class', `Cannot get index of column: 'Class'`);
this.itemId = getIndexOrThrow(headerRow, 'Item', `Cannot get index of column: 'Item'`);
this.points = getIndexOrThrow(headerRow, 'New Points', `Cannot get index of column: 'New Points'`);
}
}
class SoftRes {
constructor(num, date, name, clazz, itemId, points) {
this.num = num;
this.date = date;
this.name = name;
this.class = clazz;
this.itemId = itemId;
this.points = points;
}
}
function readLogBlock(rows, blockNumFromBottom, srData) {
console.log(`Reading block ${blockNumFromBottom}`);
// get header row
let headerRowIdx = -1;
let blocksFound = 0;
for (let i = rows.length - 1; i >= 0; i--) {
const row = rows[i];
if (row.length > 0 && row[0] == '#') {
blocksFound++;
if (blocksFound == blockNumFromBottom) {
headerRowIdx = i;
break;
}
}
}
if (headerRowIdx === -1) {
//console.log('Error: Header row not found');
throw 'Error: Header row not found';
}
const headerRow = rows[headerRowIdx];
console.log(`headerRowIdx: ${headerRowIdx}, header: ${headerRow}`);
const header = new HeaderMeta(headerRow);
// read block data
let recordsFound = 0;
for (let i = headerRowIdx + 1; i < rows.length; i++) {
const row = rows[i];
if (row.length == 0) {
break;
}
srData.push(new SoftRes(
Number(row[header.num]),
row[header.date],
row[header.name],
row[header.class],
row[header.itemId],
Number(row[header.points])
));
recordsFound++;
}
console.log(`SrData items added: ${recordsFound}, total: ${srData.length}`);
}
function processRange(range) {
console.log(`Range requested: ${range.range}`);
const rows = range.values;
// read blocks
const srData = [];
for (let i = 1; i <= config.logBlocks; i++) {
readLogBlock(rows, i, srData);
}
if (srData.length == 0) {
showMessage('Parse error: no softres rows found');
return;
}
showMessage(`Raid date: ${srData[0].date}, log records found: ${srData.length}`);
// count by item
const groupByItem = {};
for (let i = 0; i < srData.length; i++) {
const sr = srData[i];
if (!groupByItem[sr.itemId]) {
groupByItem[sr.itemId] = [];
}
groupByItem[sr.itemId].push(sr);
}
console.log(`GroupByItem keys: ${Object.keys(groupByItem).length}`);
const groupByItemCollisionsOnly = {};
for (const itemId in groupByItem) {
if (Object.hasOwnProperty.call(groupByItem, itemId)) {
const srList = groupByItem[itemId];
if (srList.length > 1) {
groupByItemCollisionsOnly[itemId] = srList;
}
}
}
console.log(`groupByItemCollisionsOnly keys: ${Object.keys(groupByItemCollisionsOnly).length}`);
srDataJson = groupByItemCollisionsOnly;
srDataLua = srDataJsonToLua(srDataJson);
// clean everything
const sectionsContainer = document.getElementById('sections-container');
sectionsContainer.innerHTML = '';
for (let i = 0; i < config.sections.length; i++) {
const section = config.sections[i];
doTheLayout(sectionsContainer, section.name, section.items, groupByItemCollisionsOnly);
}
// create json export button
let btnJson = document.createElement('button');
btnJson.innerHTML = 'Json export';
btnJson.addEventListener("click", () => {
const json = JSON.stringify(srDataJson, null, 4);
console.log(`${json}`);
navigator.clipboard.writeText(json);
});
sectionsContainer.appendChild(btnJson);
// create lua export button
let btnLua = document.createElement('button');
btnLua.innerHTML = 'Lua export';
btnLua.addEventListener("click", () => {
console.log(`${srDataLua}`);
navigator.clipboard.writeText(srDataLua);
});
sectionsContainer.appendChild(btnLua);
}
function addClass(elem, clazz) {
if (typeof clazz === 'string') {
elem.classList.add(clazz);
} else if (Array.isArray(clazz)) {
for (let i = 0; i < clazz.length; i++) {
elem.classList.add(clazz[i]);
}
}
}
function createElementA(href, text, title, clazz) {
const a = document.createElement('a');
a.appendChild(document.createTextNode(text));
a.href = href;
if (title) {
a.title = title;
}
addClass(a, clazz);
return a;
}
function createElementSpan(text, clazz) {
const span = document.createElement('span');
span.appendChild(document.createTextNode(text));
addClass(span, clazz);
return span;
}
function doTheLayout(root, sectionName, sectionItems, groupByItemCollisionsOnly) {
// layout items
let children = [];
for (let i = 0; i < sectionItems.length; i++) {
const item = sectionItems[i];
const players = groupByItemCollisionsOnly[item.id];
if (players) {
let itemBlock = document.createElement('p');
itemBlock.classList.add('contested-item');
let divItemName = document.createElement('div');
divItemName.appendChild(createElementA(item.link, item.name, null, ['item-name', 'q' + item.quality]));
let divBoss = document.createElement('div');
divBoss.appendChild(document.createTextNode('Source: ' + item.boss));
divBoss.classList.add('item-source');
itemBlock.appendChild(divItemName);
itemBlock.appendChild(divBoss);
itemBlock.appendChild(document.createElement('hr'));
// sort players by points desc
players.sort((a, b) => b.points - a.points);
const maxPoints = players[0].points;
let resultSuppliers = [];
for (let j = 0; j < players.length; j++) {
const sr = players[j];
let name = createElementSpan(sr.name, sr.class.toLowerCase());
let label = document.createElement('label');
let input = document.createElement('input');
let span = document.createElement('span');
label.appendChild(document.createTextNode(`: ${sr.points} + `));
span.innerHTML = ` = ${sr.points} points`;