Special Filters

New way of catagorized filters

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

  1. // ==UserScript==
  2. // @name Special Filters
  3. // @namespace http://tampermonkey.net/
  4. // @version 0.10.2
  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 Mythologicals = ["theunicorn","hippocampunicorn","battleunicorn","leprechaun","dwarfleprechaun","goblinleprechaun","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"];
  23. var RetiredMyths = ["retiredunicorn","retiredleprechaun","retireddragon","retiredyeti","retiredfaun","retiredhydra","retiredpegasus","retiredcyclops","retiredmermaid","retiredfairy","retiredbanshee","retirednymph"];
  24. var AlternaMyths = ["cherub","chimera","fairygodmother","firepegasus","gnomeleprechaun","gorgon","icedragon","motherearth","ogre","rainbowunicorn","sasquatchyeti","siren"];
  25. var ModernMyths = ["aphrodite","glasses","shell-phone","poseidon","trident","lifebuoy","hades","bident","firestarter"];
  26. var FancyFlats = ["beachflatrob","coldflatrob","tuxflatrob","face-offflatmatt","footyflatmatt","matt'erupflatmatt","internationellesflatlou","polkadotflatlou","teamgbflatlou"];
  27. var PhantomFlats = ["phantomflatrob", "phantomflatmatt", "phantomflatlou"];
  28. 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"];
  29. var ZombiePouchs = ["zombietuli","zombievesi","zombiemuru","zombiepimedus","zombiepuffle","zombiemagnetus","zombieelekter"];
  30. var Nomads = ["nomad","nomadvirtual","nomadmystery","jewelthiefnomad","bellhopnomad","piratenomad","warriornomad","travelernomad","seasonalnomad","virtualflatnomad","coupechampionnomad","virtualzeecretagentnomad","zeecretagentnomad","virtualgamingnomad","gamingnomad","virtualjewelthiefnomad","virtualwarriornomad","virtualbellhopnomad","jason4zeesnomad","killermask"];
  31. var FunfinityStones = ["akvamariin","ametust","oniks","roosa","rubiin","safiir","smaragd","teemant","topaas","tsitriin","vikerkaar"];
  32. 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"];
  33. 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"];
  34. var Destinations = ["skyland1","skyland2","skyland3","skyland4","skyland5","skyland6","skyland7","skyland8","skyland9","skyland10","treehouse1","treehouse2","treehouse3","treehouse4","treehouse5","treehouse6","treehouse7","treehouse8","treehouse9","treehouse10"];
  35. var EvoBouncers = ["boxjellyfish","goldenjellyfish","pb&jellyfish","limebutterfly","monarchbutterfly","morphobutterfly","poisondartfrog","tomatofrog","treefrog","seaturtle","snappingturtle","taekwondotortoise","honeybee","queenbee","wallabee"];
  36. 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"];
  37.  
  38. function sleep(ms) {
  39. return new Promise(resolve => setTimeout(resolve, ms));
  40. }
  41.  
  42. async function restructureImages() {
  43.  
  44. //Wait until the progressbar is hidden
  45. while ($("#map-box-special-loading").is(':visible'))
  46. {
  47. isMapLoaded = true;
  48. //wait
  49. await sleep(500);
  50. }
  51.  
  52. if (!isMapLoaded)
  53. {
  54. return;
  55. }
  56. else
  57. {
  58. isMapLoaded = false;
  59. }
  60.  
  61. //remove original filter_all button
  62. $('#filter_all').remove();
  63.  
  64. filterImgs = $('#filterimgs');
  65. filterImgs.prev().remove(); //Filters label removed
  66. imgs = filterImgs[0].getElementsByTagName('img');
  67.  
  68. AddCategory("Myths", Mythologicals);
  69. AddCategory("Retired Myths", RetiredMyths);
  70. AddCategory("AlternaMyths", AlternaMyths);
  71. AddCategory("Modern Myths", ModernMyths);
  72. AddCategory("F.Flats", FancyFlats);
  73. AddCategory("Phantoms", PhantomFlats);
  74. AddCategory("Pouches", PouchCreations);
  75. AddCategory("Zombies", ZombiePouchs);
  76. AddCategory("Nomads", Nomads);
  77. AddCategory("F.Stones", FunfinityStones);
  78. AddCategory("MechZ", MechZBouncers);
  79. AddCategory("Gnomes", GardenGnomes);
  80. AddCategory("Destinations", Destinations);
  81. AddCategory("EvoBouncers", EvoBouncers);
  82. AddCategory("Scatters", Scatters);
  83.  
  84. AddCategory("UnCategorized");
  85.  
  86.  
  87.  
  88. filterImgs.empty();
  89. filterImgs.html(filterHelper);
  90. filterHelper = "";
  91.  
  92. //Add to all img the click eventListener
  93. imgs = filterImgs[0].getElementsByTagName('img');
  94.  
  95. Array.from(imgs).forEach(function(img) {
  96. img.addEventListener('click', FilterImgClick);
  97. img.setAttribute("style", "cursor:pointer");
  98. img.setAttribute("title", img.currentSrc.substring(img.currentSrc.lastIndexOf("/")+1,img.currentSrc.lastIndexOf(".")));
  99. });
  100.  
  101. //Add to all category checkbox the click eventListener
  102. filterimgcategchboxes = filterImgs[0].getElementsByClassName('filterimgcategchbox');
  103.  
  104. Array.from(filterimgcategchboxes).forEach(function(filterimgcategchbox) {
  105. filterimgcategchbox.addEventListener('click', FilterImgCategChBoxClick);
  106. });
  107.  
  108. //refresh
  109. refreshMap();
  110. }
  111.  
  112. function AddCategory(categName, array = null)
  113. {
  114. //Div
  115. var categDIV = document.createElement('DIV');
  116. categDIV.setAttribute("id", categName+"_Category");
  117. categDIV.setAttribute("class", "filterImgDiv");
  118. categDIV.setAttribute("style", "border: solid 1px darkgray; padding: 2px; display: inline-block; width: fit-content;");
  119.  
  120. //CheckBox show/hide all
  121. var categChBox = document.createElement('INPUT');
  122. categChBox.setAttribute("id", categName+'_ChBox');
  123. categChBox.setAttribute("type", "checkbox");
  124. categChBox.setAttribute("class", "filterimgcategchbox");
  125. categChBox.setAttribute("checked", "checked");
  126.  
  127. //Label
  128. var categLabel = document.createElement('LABEL');
  129. categLabel.setAttribute("id", categName+'_Label');
  130. categLabel.setAttribute("style", "padding-left: 10px");
  131. categLabel.innerText = categName + ": ";
  132.  
  133. categDIV.appendChild(categChBox);
  134. categDIV.appendChild(categLabel);
  135.  
  136. var addedAtLeatOne = false;
  137.  
  138. if (array != null)
  139. {
  140. for (let a = 0; a < array.length; a++)
  141. {
  142. for (let i = 0; i < imgs.length; i++)
  143. {
  144. if (imgs[i].src == imgPrefix + array[a] + ".png")
  145. {
  146. categDIV.appendChild(imgs[i]);
  147. addedAtLeatOne = true;
  148. }
  149. }
  150. }
  151. }
  152. else
  153. {
  154. for (let i = imgs.length-1; i >= 0; i--)
  155. {
  156. categDIV.appendChild(imgs[i]);
  157. addedAtLeatOne = true;
  158. }
  159. }
  160.  
  161. if (addedAtLeatOne)
  162. {
  163. filterHelper += categDIV.outerHTML;
  164. }
  165. }
  166.  
  167. function FilterImgClick(sender)
  168. {
  169. if (sender.target.classList.contains("filterdisabled"))
  170. {
  171. enableFilter(sender.target);
  172. }
  173. else
  174. {
  175. disableFilter(sender.target);
  176. }
  177.  
  178. if (needMapRefresh)
  179. {
  180. refreshMap();
  181. }
  182. }
  183.  
  184. function FilterImgCategChBoxClick(sender)
  185. {
  186. needMapRefresh = false;
  187.  
  188. imgs = sender.target.closest("div").getElementsByTagName('img');
  189. if (sender.target.checked)
  190. {
  191. Array.from(imgs).forEach(function(img) {
  192. if (img.classList.contains("filterdisabled"))
  193. {
  194. enableFilter(img);
  195. }
  196. });
  197. }
  198. else
  199. {
  200. Array.from(imgs).forEach(function(img) {
  201. if (!img.classList.contains("filterdisabled"))
  202. {
  203. disableFilter(img);
  204. }
  205. });
  206. }
  207.  
  208. needMapRefresh = true;
  209.  
  210. refreshMap();
  211. }
  212.  
  213. function enableFilter(target)
  214. {
  215. target.classList.remove("filterdisabled");
  216.  
  217. var pos = disabledFilterImgs.indexOf(target.src);
  218. if (pos >= 0)
  219. {
  220. disabledFilterImgs.splice(pos, 1);
  221. }
  222. }
  223.  
  224. function disableFilter(target)
  225. {
  226. target.classList.add("filterdisabled");
  227.  
  228. if (disabledFilterImgs.indexOf(target.src) < 0)
  229. {
  230. disabledFilterImgs.push(target.src);
  231. }
  232. }
  233.  
  234. function refreshMap()
  235. {
  236. for (var mID in mapMarkers)
  237. {
  238. if (disabledFilterImgs.indexOf(mapMarkers[mID].munzee_logo) == -1)
  239. {
  240. $( "[data-index='" + mID + "']" ).show();
  241. }
  242. else
  243. {
  244. $( "[data-index='" + mID + "']" ).hide();
  245. }
  246. }
  247. }
  248.  
  249. $(document).ajaxSuccess(restructureImages);