Special Filters

New way of catagorized filters

当前为 2021-10-18 提交的版本,查看 最新版本

  1. // ==UserScript==
  2. // @name Special Filters
  3. // @namespace http://tampermonkey.net/
  4. // @version 21.10.18.001
  5. // @description New way of catagorized filters
  6. // @author CzPeet
  7. // @match https://www.munzee.com/specials*
  8. // @icon https://www.google.com/s2/favicons?domain=munzee.com
  9. // @update https://greasyfork.org/en/scripts/433078-special-filters
  10. // @grant none
  11. // ==/UserScript==
  12.  
  13. var imgs = [];
  14. var filterimgcategchboxes = [];
  15. var imgPrefix = "https://munzee.global.ssl.fastly.net/images/pins/";
  16. var filterHelper = "";
  17. var filterImgs = null;
  18. var disabledFilterImgs = [];
  19. var needMapRefresh = true;
  20. var isMapLoaded = false;
  21.  
  22. var Seasonals = ["backstitchsisters", "dr.acula", "frankeinstein", "fabiooooooo", "h3adl3ssh0rs3man"];
  23. var Mythologicals = ["theunicorn","hippocampunicorn","battleunicorn","candycornunicorn","leprechaun","dwarfleprechaun","goblinleprechaun","leprecorn","dragon","chinesedragon","wyverndragon","yeti","reptoidyeti","lycanthropeyeti","faun","centaurfaun","krampusfaun","hydra","cerberushydra","cthulhuhydra","pegasus","alicornpegasus","griffinpegasus","cyclops","balorcyclops","minotaurcyclops","mermaid","hotspringmermaid","melusinemermaid","fairy","dryadfairy","wildfirefairy","banshee","harpybanshee","witchbanshee","nymph","elfnymph","vampirenymph"];
  24. var RetiredMyths = ["retiredunicorn","retiredleprechaun","retireddragon","retiredyeti","retiredfaun","retiredhydra","retiredpegasus","retiredcyclops","retiredmermaid","retiredfairy","retiredbanshee","retirednymph"];
  25. var AlternaMyths = ["cherub","chimera","fairygodmother","firepegasus","gnomeleprechaun","gorgon","icedragon","motherearth","ogre","rainbowunicorn","sasquatchyeti","siren"];
  26. var ModernMyths = ["aphrodite","glasses","shell-phone","poseidon","trident","lifebuoy","hades","bident","firestarter"];
  27. var FancyFlats = ["beachflatrob","coldflatrob","tuxflatrob","face-offflatmatt","footyflatmatt","matt'erupflatmatt","internationellesflatlou","polkadotflatlou","teamgbflatlou"];
  28. var PhantomFlats = ["phantomflatrob", "phantomflatmatt", "phantomflatlou"];
  29. var PouchCreations = ["tuli","tuliferno","tulimber","gleamingtuli","gleamingtuliferno","gleamingtulimber","vesi","vesial","vesisaur","gleamingvesi","gleamingvesial","gleamingvesisaur","muru","muruchi","murutain","gleamingmuru","gleamingmuruchi","gleamingmurutain","mitmegu","jootmegu","lokemegu","rohimegu","murinmegu","ohkmegu","urgasmegu","koobas","kartus","kabuhirm","pimedus","puffle","puflawn","pufrain","magnetus","elekjoud","elekter","elektrivool","hadavale"];
  30. var ZombiePouchs = ["zombietuli","zombievesi","zombiemuru","zombiepimedus","zombiepuffle","zombiemagnetus","zombieelekter"];
  31. var Nomads = ["nomad","nomadvirtual","nomadmystery","jewelthiefnomad","bellhopnomad","piratenomad","warriornomad","travelernomad","seasonalnomad","virtualflatnomad","coupechampionnomad","virtualzeecretagentnomad","zeecretagentnomad","virtualgamingnomad","gamingnomad","virtualjewelthiefnomad","virtualwarriornomad","virtualbellhopnomad","jason4zeesnomad","killermask"];
  32. var FunfinityStones = ["akvamariin","ametust","oniks","roosa","rubiin","safiir","smaragd","teemant","topaas","tsitriin","vikerkaar"];
  33. var MechZBouncers = ["arcticlasershark","botwurst","carafeborg","cybersaurusrex","cyborgsanta","dronut","fr057y","geologgersrumbot","gingermechman","goldenlasershark","goldncoinsrumbot","kingc0g","lasershark","mechanic4k3","monk3y","mumm33","negsrumbot","prim8","rud01ph","s4rc0ph4gus","sc4rab","scgsrumbot","spyderbot","steinbot","krampbot","31f","reindroid"];
  34. var GardenGnomes = ["10thmunzeebirthdayhat","archerygardengnome","astronautgardengnome","aussieexplorergardengnome","awardshowgardengnome","baseballgardengnome","basketballgardengnome","cricketgardengnome","footballgardengnome","gardengnome","gnomearcheryhood","gnomeastronauthelmet","gnomebearskinhat","gnomecatcherscap","gnomeclubcap","gnomeexplorerhat","gnomeheaderhat","gnomeheadphones","gnomeheelfliphat","gnomehockeyhelmet","gnomeminerhat","gnomenogginnet","gnometouchdowntopper","goldminergardengnome","icehockeygardengnome","queen'sguardsmangardengnome","runninggardengnome","skateboardinggardengnome","soccergardengnome","cyclinggardengnome","cyclingcasquette"];
  35. var Destinations = ["skyland1","skyland2","skyland3","skyland4","skyland5","skyland6","skyland7","skyland8","skyland9","skyland10","treehouse1","treehouse2","treehouse3","treehouse4","treehouse5","treehouse6","treehouse7","treehouse8","treehouse9","treehouse10"];
  36. var EvoBouncers = ["boxjellyfish","goldenjellyfish","pb&jellyfish","limebutterfly","monarchbutterfly","morphobutterfly","poisondartfrog","tomatofrog","treefrog","seaturtle","snappingturtle","taekwondotortoise","honeybee","queenbee","wallabee"];
  37. var Scatters = ["fire","frozengreenie","waterdroplet","feather","goldenfeather","charge","tree","redapple","cherryblossom","peach","pear","pecan","acorn","deadbranch","cardinalfeather","blackhole","planet","spaceship","lostkey","lostsock","meteor","satellite","scattered","boulder","flamingarrow","sc4rab","ankhartifact","ouroborosartifact","djedartifact","scarabartifact","eyeofraartifact","shenartifact","canopicjarartifact","sesenartifact","wasscepterartifact","sistrumartifact","sistrumartifact","tyetartifact","eyeofhorusartifact","sweettreats","scgsresellerpackage","geologgersresellerpackage","gold'ncoinsresellerpackage","negsresellerpackage","cloverleaf","goldenclover","snowball","dossier","infraredvirtual","lasertrail1","lasertrail2","lasertrail3","pixelpresent","undercoveragent","liaisonagent","maplepawn","mapleknight","maplebishop","maplerook","maplequeen","mapleking","walnutpawn","walnutknight","walnutbishop","walnutrook","walnutqueen","walnutking","leapfrog","munch-man","runzeerob","goldcoin","fly","ghostzee","1stroll","bowling-1stroll","2ndroll","bowling-2ndroll","trickortreat"];
  38.  
  39. function sleep(ms) {
  40. return new Promise(resolve => setTimeout(resolve, ms));
  41. }
  42.  
  43. async function restructureImages() {
  44.  
  45. //Wait until the progressbar is hidden
  46. while ($("#map-box-special-loading").is(':visible'))
  47. {
  48. isMapLoaded = true;
  49. //wait
  50. await sleep(500);
  51. }
  52.  
  53. if (!isMapLoaded)
  54. {
  55. return;
  56. }
  57. else
  58. {
  59. isMapLoaded = false;
  60. }
  61.  
  62. //remove original filter_all button
  63. $('#filter_all').remove();
  64.  
  65. filterImgs = $('#filterimgs');
  66. filterImgs.prev().remove(); //Filters label removed
  67. imgs = filterImgs[0].getElementsByTagName('img');
  68.  
  69. AddCategory("Seasonals", Seasonals);
  70. AddCategory("Myths", Mythologicals);
  71. AddCategory("Retired Myths", RetiredMyths);
  72. AddCategory("AlternaMyths", AlternaMyths);
  73. AddCategory("Modern Myths", ModernMyths);
  74. AddCategory("F.Flats", FancyFlats);
  75. AddCategory("Phantoms", PhantomFlats);
  76. AddCategory("Pouches", PouchCreations);
  77. AddCategory("Zombies", ZombiePouchs);
  78. AddCategory("Nomads", Nomads);
  79. AddCategory("F.Stones", FunfinityStones);
  80. AddCategory("MechZ", MechZBouncers);
  81. AddCategory("Gnomes", GardenGnomes);
  82. AddCategory("Destinations", Destinations);
  83. AddCategory("EvoBouncers", EvoBouncers);
  84. AddCategory("Scatters", Scatters);
  85.  
  86. AddCategory("UnCategorized");
  87.  
  88.  
  89.  
  90. filterImgs.empty();
  91. filterImgs.html(filterHelper);
  92. filterHelper = "";
  93.  
  94. //Add to all img the click eventListener
  95. imgs = filterImgs[0].getElementsByTagName('img');
  96.  
  97. Array.from(imgs).forEach(function(img) {
  98. img.addEventListener('click', FilterImgClick);
  99. img.setAttribute("style", "cursor:pointer");
  100. img.setAttribute("title", img.currentSrc.substring(img.currentSrc.lastIndexOf("/")+1,img.currentSrc.lastIndexOf(".")));
  101. });
  102.  
  103. //Add to all category checkbox the click eventListener
  104. filterimgcategchboxes = filterImgs[0].getElementsByClassName('filterimgcategchbox');
  105.  
  106. Array.from(filterimgcategchboxes).forEach(function(filterimgcategchbox) {
  107. filterimgcategchbox.addEventListener('click', FilterImgCategChBoxClick);
  108. });
  109.  
  110. //refresh
  111. refreshMap();
  112. }
  113.  
  114. function AddCategory(categName, array = null)
  115. {
  116. //Div
  117. var categDIV = document.createElement('DIV');
  118. categDIV.setAttribute("id", categName+"_Category");
  119. categDIV.setAttribute("class", "filterImgDiv");
  120. categDIV.setAttribute("style", "border: solid 1px darkgray; padding: 2px; display: inline-block; width: fit-content;");
  121.  
  122. //CheckBox show/hide all
  123. var categChBox = document.createElement('INPUT');
  124. categChBox.setAttribute("id", categName+'_ChBox');
  125. categChBox.setAttribute("type", "checkbox");
  126. categChBox.setAttribute("class", "filterimgcategchbox");
  127. categChBox.setAttribute("checked", "checked");
  128.  
  129. //Label
  130. var categLabel = document.createElement('LABEL');
  131. categLabel.setAttribute("id", categName+'_Label');
  132. categLabel.setAttribute("style", "padding-left: 10px");
  133. categLabel.innerText = categName + ": ";
  134.  
  135. categDIV.appendChild(categChBox);
  136. categDIV.appendChild(categLabel);
  137.  
  138. var addedAtLeatOne = false;
  139.  
  140. if (array != null)
  141. {
  142. for (let a = 0; a < array.length; a++)
  143. {
  144. for (let i = 0; i < imgs.length; i++)
  145. {
  146. if (imgs[i].src == imgPrefix + array[a] + ".png")
  147. {
  148. categDIV.appendChild(imgs[i]);
  149. addedAtLeatOne = true;
  150. }
  151. }
  152. }
  153. }
  154. else
  155. {
  156. for (let i = imgs.length-1; i >= 0; i--)
  157. {
  158. categDIV.appendChild(imgs[i]);
  159. addedAtLeatOne = true;
  160. }
  161. }
  162.  
  163. if (addedAtLeatOne)
  164. {
  165. filterHelper += categDIV.outerHTML;
  166. }
  167. }
  168.  
  169. function FilterImgClick(sender)
  170. {
  171. if (sender.target.classList.contains("filterdisabled"))
  172. {
  173. enableFilter(sender.target);
  174. }
  175. else
  176. {
  177. disableFilter(sender.target);
  178. }
  179.  
  180. if (needMapRefresh)
  181. {
  182. refreshMap();
  183. }
  184. }
  185.  
  186. function FilterImgCategChBoxClick(sender)
  187. {
  188. needMapRefresh = false;
  189.  
  190. imgs = sender.target.closest("div").getElementsByTagName('img');
  191. if (sender.target.checked)
  192. {
  193. Array.from(imgs).forEach(function(img) {
  194. if (img.classList.contains("filterdisabled"))
  195. {
  196. enableFilter(img);
  197. }
  198. });
  199. }
  200. else
  201. {
  202. Array.from(imgs).forEach(function(img) {
  203. if (!img.classList.contains("filterdisabled"))
  204. {
  205. disableFilter(img);
  206. }
  207. });
  208. }
  209.  
  210. needMapRefresh = true;
  211.  
  212. refreshMap();
  213. }
  214.  
  215. function enableFilter(target)
  216. {
  217. target.classList.remove("filterdisabled");
  218.  
  219. var pos = disabledFilterImgs.indexOf(target.src);
  220. if (pos >= 0)
  221. {
  222. disabledFilterImgs.splice(pos, 1);
  223. }
  224. }
  225.  
  226. function disableFilter(target)
  227. {
  228. target.classList.add("filterdisabled");
  229.  
  230. if (disabledFilterImgs.indexOf(target.src) < 0)
  231. {
  232. disabledFilterImgs.push(target.src);
  233. }
  234. }
  235.  
  236. function refreshMap()
  237. {
  238. for (var mID in mapMarkers)
  239. {
  240. if (disabledFilterImgs.indexOf(mapMarkers[mID].munzee_logo) == -1)
  241. {
  242. $( "[data-index='" + mID + "']" ).show();
  243. }
  244. else
  245. {
  246. $( "[data-index='" + mID + "']" ).hide();
  247. }
  248. }
  249. }
  250.  
  251. $(document).ajaxSuccess(restructureImages);