Sleazy Fork is available in English.

Chaturbate Age-Filter & Locations

Age filter, Locations under each thumbnail, Locations list with links, and more!

Od 10.01.2017.. Pogledajte najnovija verzija.

  1. // ==UserScript==
  2. // @name Chaturbate Age-Filter & Locations
  3. // @version 1.03
  4. // @namespace Frank_Einstein@greasyfork.org
  5. // @description Age filter, Locations under each thumbnail, Locations list with links, and more!
  6. // @include /^https?:\/\/(\w+\.)?chaturbate\.com(\/.*)?/
  7. // @run-at document-end
  8. // @grant none
  9. // @icon data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/4gKgSUNDX1BST0ZJTEUAAQEAAAKQbGNtcwQwAABtbnRyUkdCIFhZWiAH3wAKAAgABAAwAAdhY3NwQVBQTAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA9tYAAQAAAADTLWxjbXMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAtkZXNjAAABCAAAADhjcHJ0AAABQAAAAE53dHB0AAABkAAAABRjaGFkAAABpAAAACxyWFlaAAAB0AAAABRiWFlaAAAB5AAAABRnWFlaAAAB+AAAABRyVFJDAAACDAAAACBnVFJDAAACLAAAACBiVFJDAAACTAAAACBjaHJtAAACbAAAACRtbHVjAAAAAAAAAAEAAAAMZW5VUwAAABwAAAAcAHMAUgBHAEIAIABiAHUAaQBsAHQALQBpAG4AAG1sdWMAAAAAAAAAAQAAAAxlblVTAAAAMgAAABwATgBvACAAYwBvAHAAeQByAGkAZwBoAHQALAAgAHUAcwBlACAAZgByAGUAZQBsAHkAAAAAWFlaIAAAAAAAAPbWAAEAAAAA0y1zZjMyAAAAAAABDEoAAAXj///zKgAAB5sAAP2H///7ov///aMAAAPYAADAlFhZWiAAAAAAAABvlAAAOO4AAAOQWFlaIAAAAAAAACSdAAAPgwAAtr5YWVogAAAAAAAAYqUAALeQAAAY3nBhcmEAAAAAAAMAAAACZmYAAPKnAAANWQAAE9AAAApbcGFyYQAAAAAAAwAAAAJmZgAA8qcAAA1ZAAAT0AAACltwYXJhAAAAAAADAAAAAmZmAADypwAADVkAABPQAAAKW2Nocm0AAAAAAAMAAAAAo9cAAFR7AABMzQAAmZoAACZmAAAPXP/bAEMACAYGBwYFCAcHBwkJCAoMFA0MCwsMGRITDxQdGh8eHRocHCAkLicgIiwjHBwoNyksMDE0NDQfJzk9ODI8LjM0Mv/bAEMBCQkJDAsMGA0NGDIhHCEyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMv/AABEIAQABAAMBIgACEQEDEQH/xAAcAAEAAgMBAQEAAAAAAAAAAAAABgcDBAUCAQj/xABNEAABAwMDAQUFAgcLCgcAAAABAAIDBAURBhIhMQcTQVFhInGBkaEUMhUWIzNCUrEXYnKCkqLBw9HS8CQlQ1NWc5SywtMIREZjZIOT/8QAGgEBAAIDAQAAAAAAAAAAAAAAAAMEAQIFBv/EAC8RAAICAQIFAwIGAwEBAAAAAAABAgMRBCEFEjFBURNhcYGRFCKhsdHwI8Hx4TL/2gAMAwEAAhEDEQA/AL/REQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAfEXEv2qLVp2AS19QGvcPYhZ7T3+5vlx1OB6qO6V15NqfU8tFHStgomU75G7jukc4OaASeg4PT6lbxqm4uSWyIZX1xmoN7snyIi0Jj58F8JIUI1D2k2myyvpqYGvqmHDmxOAY0+Rfzz7gfI4UYl7T9SvkcYLPTsi/Ra+KRxx79wz8lI6mll4S93gr/iI5ajlteE3+xbwQ/JVjbe1gCeKG9219MTjdNFkgeuw849xJ9Cp7Pd6CntTrpJVxCi7sSd9uy0tPTHnnoB1J4WHXJY26m0boSzv069sHRymVV1Z2tSyzPZaLO6aNp/OTOOT/ABWjj5roWHtNpbnXNoLlSuoJ3kNY8vyxzj4HIBb4Y6+8LPpS/vX7Gq1Ne2+z74ePuWGiDoijLAREygCIiAIiID4iLlXy+0Onrc6sr5CyMHDWtGXPd4NaPP6LKTbwjWUlFZfQ6gKdVVL+1iull30diLqcEjLnucT8QMD6qS6U19Q6lqTSOidR12CWwvfuDwOu13GSOpGB8cHGzrlu/HX2Io6ittLPXps1kmaIi0JwiIgCIiAIiIAixSSMhjc97msY0FznE4AA6kleKWqp62Bk9NPHPC8ZbJG4OafcQhjKzgoSkt81ylfdbxK+eec78POSfLPwxgdAOPdu2S5R6d19S1UzhFR1Le6e7AAa0jbyT0AIaT6LWtd3huFPHHvDZ2Nw5h4z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ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA=
  10. // ==/UserScript==
  11.  
  12.  
  13. console.log("Loading: " + GM_info.script.name + " " + GM_info.script.version);
  14.  
  15.  
  16. // MAIN SCRIPT FUNCTION
  17.  
  18. (function() {
  19.  
  20. // CURRENT URL //
  21. var _URL = location.href;
  22.  
  23. //====================================================================================================
  24.  
  25. // OPTIONS VARIABLES
  26. var AgeMin = 18;
  27. var AgeMax = 99;
  28. var AlwaysHideMales = 0;
  29. var AlwaysHideTrans = 0;
  30. var AlwaysHideGirls = 0;
  31. var AlwaysHideCouples = 0;
  32. var Filter_Interval = 2000;
  33. var Remove_Ads = 1;
  34.  
  35. //====================================================================================================
  36.  
  37. // GLOBAL VARIABLES
  38.  
  39. // AGE FILTER
  40. var AgeMin_Label;
  41. var AgeMin_Textbox;
  42. var AgeMax_Label;
  43. var AgeMax_Textbox;
  44.  
  45. // LOCATIONS
  46. var Locations_List;
  47. var CSS_Mod;
  48.  
  49. // LOCATION WINDOW
  50. var Locations_List_Text;
  51. var Locations_List_Link;
  52. var Locations_List_Window;
  53. var Locations_List_Window_ID;
  54. var Locations_List_Button;
  55. var Locations_List_Div;
  56.  
  57. // ID OF THE LOCATION WINDOW //
  58. Locations_List_Window_ID = "Locations_List_Window";
  59.  
  60. //====================================================================================================
  61.  
  62. // MAIN SCRIPT CODE
  63.  
  64. // Show_Profile_Locations();
  65.  
  66. var Pattern_Main = /^https?:\/\/(\w+\.)?chaturbate\.com(\/|\/\?page)?$/;
  67. var Pattern_Followed = /^https?:\/\/(\w+\.)?chaturbate\.com\/followed\-cams(\/.*)?$/;
  68. var Pattern_Exhibition = /^https?:\/\/(\w+\.)?chaturbate\.com\/exhibitionist\-cams(\/.*)?$/;
  69. var Pattern_Female = /^https?:\/\/(\w+\.)?chaturbate\.com\/female\-cams(\/.*)?$/;
  70. var Pattern_Male = /^https?:\/\/(\w+\.)?chaturbate\.com\/male\-cams(\/.*)?$/;
  71. var Pattern_Couple = /^https?:\/\/(\w+\.)?chaturbate\.com\/couple\-cams(\/.*)?$/;
  72. var Pattern_Trans = /^https?:\/\/(\w+\.)?chaturbate\.com\/trans\-cams(\/.*)?$/;
  73. var Pattern_Spy = /^https?:\/\/(\w+\.)?chaturbate\.com\/spy\-on\-cams(\/.*)?$/;
  74.  
  75. // Not seems to be needed here...
  76. // Patern = Pattern.source.replace(/\^http/g,'http').replace(/:/g,'%3A').replace(/\\\//g,'%2F').replace(/\//g,'%2F');
  77.  
  78. if ( Pattern_Main.test(_URL) ||
  79. Pattern_Exhibition.test(_URL) ||
  80. Pattern_Female.test(_URL) ||
  81. Pattern_Male.test(_URL) ||
  82. Pattern_Couple.test(_URL) ||
  83. Pattern_Trans.test(_URL) ||
  84. Pattern_Spy.test(_URL) ) {
  85. // MAIN PAGES //
  86. console.log("[" + GM_info.script.name + " " + GM_info.script.version + "] " + "MAIN PAGE");
  87. // REMOVE ADS //
  88. if (Remove_Ads) { Hide_Ads(); }
  89. Append_Age_Inputs();
  90. Age_Filter();
  91. Clone_Pages_Numbers();
  92. Show_All_Locations();
  93. var Filter_Loop = setInterval(function() {
  94. Show_Profile_Locations();
  95. Age_Filter();
  96. }, Filter_Interval);
  97.  
  98. } else {
  99. // WEBCAM PAGES //
  100. // REMOVE ADS //
  101. if (Remove_Ads) { Hide_Ads(); }
  102. }
  103.  
  104. //====================================================================================================
  105. // FUNCTIONS
  106. //====================================================================================================
  107.  
  108. function Hide_Ads() {
  109. Hide_This_Node(".ad");
  110. Hide_This_Node(".remove_ads");
  111. }
  112.  
  113. //====================================================================================================
  114.  
  115. function Show_All_Locations() {
  116. // LOCATIONS-LIST BUTTON //
  117. // Append the new controls inside this node.
  118. var Target = document.querySelector(".sub-nav");
  119. // NEW LINE BREAK
  120. Append_BR(Target);
  121. // Create & Append AgeMin DIV
  122. // function Append_Button(TARGET_NODE, NEW_TEXTBOX_ID, NEW_BUTTON_DISPLAY, NEW_TEXTBOX_CAPTION)
  123. Locations_List_Button = Append_Button(Target, "AgeMin_Label", "inline");
  124. Locations_List_Button.innerHTML = "Locations List";
  125. Locations_List_Button.style.margin = "10px";
  126. Locations_List_Button.addEventListener("click", Show_All_Locations_Click);
  127. }
  128.  
  129. //====================================================================================================
  130.  
  131. function Show_All_Locations_Click() {
  132. // LOCATIONS-LIST BUTTON //
  133. var Current_Location;
  134. var All_Locations = document.querySelectorAll("li.location");
  135. var i;
  136. Locations_List = [];
  137. Locations_List_Text = "";
  138. for (i = 0; i < All_Locations.length; i++) {
  139. // console.log("DEBUG: Show_Profile_Locations();");
  140. if (All_Locations[i].parentNode.childNodes.length < 7 ) {
  141. Current_Location = All_Locations[i].innerHTML;
  142. Locations_List[i] = Current_Location;
  143. Locations_List_Text += Current_Location + "\n";
  144. // DEBUG
  145. // console.log("Location = " + Location);
  146. }
  147. }
  148. // CHECK IF "LOCATIONS_LIST_WINDOW" IS ALREADY CREATED
  149. if (Locations_List_Window) {
  150.  
  151. Locations_List_Window.style.display = "block";
  152. } else {
  153. // NEW CUSTOM WINDOW FOR LOCATIONS LIST
  154. // function Custom_Window(WINDOW_ID, TITLE, WIDTH, HEIGHT, POS_LEFT, POS_TOP) {
  155. Locations_List_Window = Custom_Window(Locations_List_Window_ID, "Locations", "512px", "720px", "250px", "50px");
  156. // SET "LOCATIONS_LIST_WINDOW" ON CENTER OF THE SCREEN
  157. Locations_List_Window.style.position = "fixed"; // Bad if the screen is too small
  158. Locations_List_Window.style.position = "absolute"; // Good if the screen is too small
  159. // HORIZONTAL POSITION (SIMPLE - NOT CENTERED) //
  160. // Locations_List_Window.style.left = "33%";
  161. // OPEN THE CUSTOM WINDOW IN THE CENTER //
  162. // IT WORKS ALSO WITH THE DRAGGING CODE //
  163. var Win_Width = parseInt(Locations_List_Window.style.width);
  164. var Calc_Center = (parseInt(window.innerWidth) / 2) - (Win_Width / 2);
  165. Locations_List_Window.style.left = Calc_Center + "px";
  166. // OLD CENTER CODES //
  167. // MANUAL CALCULATION //
  168. // BREAKS THE DRAGGING CODE... (marginLeft) //
  169. // Locations_List_Window.style.marginLeft = "-256px";
  170. // FULL AUTOMATIC //
  171. // BREAKS THE DRAGGING CODE... (marginLeft) //
  172. /*
  173. // ((WIDTH / 2) * -1) //
  174. var Calc_Width;
  175. Calc_Width = Locations_List_Window.style.width;
  176. Calc_Width = parseInt(Calc_Width) / 2 * -1;
  177. Locations_List_Window.style.marginLeft = calc_width + "px";
  178. */
  179. }
  180. // BUILD AND INSERT THE LOCATIONS IN LOCATIONS_LIST_WINDOW
  181. Fill_Locations_List_Window();
  182. // DEBUG
  183. // alert(Locations_List_Text);
  184. }
  185.  
  186. //====================================================================================================
  187.  
  188. function Fill_Locations_List_Window() {
  189. // LOOP FOR BUILDING THE LOCATIONS LIST
  190. var i;
  191. var Current_Link;
  192. var Current_Location;
  193. var Link_Position_Top;
  194. // QUERY ALL LOCATIONS
  195. Locations_List_Link = document.querySelectorAll(".details .title a");
  196. if (Locations_List_Div) {
  197. Locations_List_Div.innerHTML = "";
  198. } else {
  199. Locations_List_Div = document.createElement( 'div' );
  200. }
  201. // LOOP: BUILD LOCATIONS LIST
  202. // console.log("DEBUG: Building the Locations List");
  203. for (i = 0; i < Locations_List.length; i++) {
  204. Current_Link = Locations_List_Link[i].outerHTML;
  205. Current_Location = Locations_List[i];
  206. Locations_List_Div.innerHTML += Current_Location + ' : ';
  207. Locations_List_Div.innerHTML += Current_Link + '<br>\n';
  208. //console.log('Locations_List_Link[i].outerHTML = ' + Locations_List_Link[i].outerHTML);
  209. }
  210. // APPEND LOCATIONS_LIST_DIV
  211. Locations_List_Window.appendChild(Locations_List_Div);
  212. // CALCULATE THE HEIGHT OF "LOCATIONS_LIST_DIV"
  213. var tmp_height = Locations_List_Window.style.height;
  214. Locations_List_Div.style.position = "relative";
  215. Locations_List_Div.style.display = "block";
  216. Locations_List_Div.style.top = "10px";
  217. Locations_List_Div.style.height = (parseInt(tmp_height) - 50) + "px";
  218. Locations_List_Div.style.overflowY = "scroll";
  219. Locations_List_Div.style.margin = "5px";
  220. }
  221.  
  222. //====================================================================================================
  223.  
  224. function Show_Profile_Locations() {
  225. // VARIABLES //
  226. var Target;
  227. var Location;
  228. var Div_Location;
  229. var Test;
  230. // LOCATION LOOP //
  231. var All_Locations = document.querySelectorAll("li.location");
  232. var i;
  233. if (!CSS_Mod) {
  234. Injection_CSS(".list li { max-height: 255px; } .details { min-height: 110px; }");
  235. CSS_Mod = 1;
  236. }
  237. for (i = 0; i < All_Locations.length; i++) {
  238. // console.log("DEBUG: Show_Profile_Locations();");
  239. if (All_Locations[i].parentNode.childNodes.length < 6 ) {
  240. Target = All_Locations[i].parentNode;
  241. Location = All_Locations[i].innerHTML;
  242. Div_Location = document.createElement( 'div' );
  243. Div_Location.innerHTML = "Location: " + Location;
  244. Target.appendChild(Div_Location);
  245. // Div_Location.setAttribute("class") = "ShowLocation"; // BAD
  246. // Div_Location.style.margin = "10px";
  247. // Div_Location.style.display="inline";
  248. }
  249. }
  250. }
  251.  
  252. //====================================================================================================
  253.  
  254. function Age_SetValue() {
  255. // AGE MIN //
  256. localStorage.setItem( 'CUB.AgeMin', AgeMin_Textbox.value );
  257. AgeMin = AgeMin_Textbox.value;
  258. // AGE MAX //
  259. localStorage.setItem( 'CUB.AgeMax', AgeMax_Textbox.value );
  260. AgeMax = AgeMax_Textbox.value;
  261. // HIDE YOUR MOM //
  262. Age_Filter();
  263. // Capturing the Enter Key (Not needed here, but it can be useful)
  264. //
  265. // var key = e.which || e.keyCode;
  266. //
  267. // 13 = Enter Key
  268. // if (key === 13) { ... }
  269. }
  270.  
  271. //====================================================================================================
  272.  
  273. function Append_Age_Inputs() {
  274. // APPEND THE NEW CONTROLS INSIDE THIS NODE.
  275. var Target = document.querySelector(".sub-nav");
  276. // NEW LINE BREAKS //
  277. Append_BR(Target);
  278. Append_BR(Target);
  279. // CREATE & APPEND THE AGE-MIN LABEL
  280. AgeMin_Label = Append_Div(Target, "AgeMin_Label", "inline");
  281. AgeMin_Label.innerHTML = "Age Min: ";
  282. AgeMin_Label.style.margin = "10px";
  283. // CREATE & APPEND AGE-MIN TEXTBOX (INPUT)
  284. AgeMin_Textbox = Append_Textbox(Target, "AgeMin_Textbox", "inline");
  285. AgeMin_Textbox.setAttribute("type", "text");
  286. AgeMin_Textbox.maxLength = 2;
  287. AgeMin_Textbox.style.width = "30px";
  288. // CREATE & APPEND THE AGE-MAX LABEL
  289. AgeMax_Label = Append_Div(Target, "AgeMax_Textbox", "inline");
  290. AgeMax_Label.innerHTML = "Age Max: ";
  291. AgeMax_Label.style.margin = "10px";
  292. // CREATE & APPEND AGE-MAX TEXTBOX (INPUT)
  293. AgeMax_Textbox = Append_Textbox(Target, "AgeMax_Textbox", "inline");
  294. AgeMax_Textbox.setAttribute("type", "text");
  295. AgeMax_Textbox.maxLength = 2;
  296. AgeMax_Textbox.style.width = "30px";
  297. // TEMPORARY VARIABLES //
  298. var tmp_AgeMin;
  299. var tmp_AgeMax;
  300. // GET THE STORED AGE-MIN //
  301. tmp_AgeMin = localStorage.getItem('CUB.AgeMin');
  302. console.log("localStorage.getItem('CUB.AgeMin') = " + tmp_AgeMin); // DEBUG
  303. if (tmp_AgeMin !== null) {
  304. AgeMin = tmp_AgeMin;
  305. }
  306.  
  307. // GET THE STORED AGE-MAX //
  308. tmp_AgeMax = localStorage.getItem('CUB.AgeMax');
  309. console.log("localStorage.getItem('CUB.AgeMax') = " + tmp_AgeMax); // DEBUG
  310. if (tmp_AgeMax !== null) {
  311. AgeMax = tmp_AgeMax;
  312. }
  313.  
  314. // SET VALUE FOR AGE INPUTS //
  315. AgeMin_Textbox.value = AgeMin;
  316. AgeMax_Textbox.value = AgeMax;
  317. // INPUTS CHANGE EVENTS //
  318. AgeMin_Textbox.addEventListener("change", Age_SetValue);
  319. AgeMax_Textbox.addEventListener("change", Age_SetValue);
  320. }
  321.  
  322. //====================================================================================================
  323.  
  324. function Age_Filter() {
  325.  
  326. var span = document.querySelectorAll("SPAN");
  327. var age_class;
  328. var i;
  329.  
  330. for (i = 0; i < span.length; i++) {
  331. age_class = span[i].getAttribute("class");
  332. if (
  333. age_class === "age genderc" ||
  334. age_class === "age genderf" ||
  335. age_class === "age genderm" ||
  336. age_class === "age genders"
  337. ) {
  338.  
  339. age = span[i].innerHTML;
  340. Parent = span[i].parentNode.parentNode.parentNode;
  341. if (age < AgeMin || age > AgeMax) {
  342. Parent.style.display = "none";
  343. } else if (AlwaysHideMales === 1 && age_class === "age genderm") {
  344. Parent.style.display = "none";
  345. } else if (AlwaysHideTrans === 1 && age_class === "age genders") {
  346. Parent.style.display = "none";
  347. } else if (AlwaysHideGirls === 1 && age_class === "age genderf") {
  348. Parent.style.display = "none";
  349. } else if (AlwaysHideCouples === 1 && age_class === "age genderc") {
  350. Parent.style.display = "none";
  351. } else {
  352. Parent.style.display = "block";
  353. }
  354.  
  355. }
  356.  
  357. }
  358.  
  359. }
  360.  
  361. //====================================================================================================
  362.  
  363. function Clone_Pages_Numbers() {
  364.  
  365. // Get the last <li> element ("Milk") of <ul> with id="myList2"
  366. var itm = document.querySelector("ul.paging");
  367.  
  368. // Copy the <li> element and its child nodes
  369. var cln = itm.cloneNode(true);
  370.  
  371. // Append the cloned <li> element to <ul> with id="myList1"
  372. document.querySelector("div.top-section").appendChild(cln);
  373. }
  374.  
  375. //====================================================================================================
  376.  
  377.  
  378.  
  379.  
  380.  
  381. //====================================================================================================
  382. // FUNCTIONS MODULES
  383. //====================================================================================================
  384.  
  385.  
  386. //====================================================================================================
  387. // MODULE
  388. // CODE INJECTIONS
  389. //====================================================================================================
  390.  
  391. function Injection_CSS(STR_CSS, CSS_ID, WhereToInject) {
  392. // REFERENCE:
  393. // http://stackoverflow.com/questions/11833759/add-stylesheet-to-head-using-javascript-in-body
  394.  
  395.  
  396. // if (BOOL_BODY == true) {
  397. // var Inject_Section = document.body;
  398. // } else {
  399. // var Inject_Section = document.head;
  400. // }
  401.  
  402.  
  403. var Inject_Section;
  404. if (WhereToInject != null) {
  405. Inject_Section = WhereToInject;
  406. } else {
  407. Inject_Section = document.head;
  408. }
  409. var style_css = document.createElement('style');
  410. if (CSS_ID != '') { style_css.id = CSS_ID; }
  411. // style_css.href = '{url}';
  412. style_css.type = 'text/css';
  413. style_css.rel = 'stylesheet';
  414. style_css.innerHTML = STR_CSS;
  415. Inject_Section.appendChild(style_css);
  416. //document.head.appendChild(style_css);
  417. }
  418.  
  419. //====================================================================================================
  420.  
  421.  
  422. //====================================================================================================
  423. // MODULE: HIDE_THIS_NODE
  424. // REQUIREMENT: Injection_CSS
  425. //====================================================================================================
  426.  
  427. function Hide_This_Node(Css_Element) {
  428. Injection_CSS(Css_Element + ' { display: none !important; }');
  429. }
  430.  
  431. //====================================================================================================
  432.  
  433.  
  434. //====================================================================================================
  435. // MODULE: ADD CONTROLS
  436. // BR, DIV, WINDOW, BUTTON, TEXTBOX
  437. //====================================================================================================
  438.  
  439. function Append_BR(TARGET_NODE) {
  440. // createElement
  441. var NEW_BR = document.createElement( 'br' );
  442. // appendChild
  443. TARGET_NODE.appendChild(NEW_BR);
  444. // Return Created Node
  445. return NEW_BR;
  446. }
  447.  
  448. //====================================================================================================
  449.  
  450. function Append_Div(TARGET_NODE, NEW_DIV_ID, NEW_DIV_DISPLAY) {
  451. // createElement //
  452. var New_Div = document.createElement( 'div' );
  453. // APPEND PARAMETERS //
  454. if (NEW_DIV_ID) { New_Div.id = NEW_DIV_ID; }
  455. if (NEW_DIV_DISPLAY) { New_Div.style.display = NEW_DIV_DISPLAY; }
  456. // appendChild //
  457. TARGET_NODE.appendChild(New_Div);
  458. return New_Div;
  459. }
  460.  
  461. //====================================================================================================
  462. function Custom_Window(WINDOW_ID, TITLE, WIDTH, HEIGHT, POS_LEFT, POS_TOP) {
  463. // RESET THE POSITION EVERYTIME YOU OPEN THE WINDOW
  464. var Reset_Position = 0;
  465. // NEW_WINDOW //
  466. var New_Window = document.getElementById(WINDOW_ID);
  467. if (New_Window) {
  468. // POSITION RESET //
  469. if (Reset_Position) {
  470. New_Window.style.left = POS_LEFT;
  471. New_Window.style.top = POS_TOP;
  472. }
  473. // UNHIDE //
  474. New_Window.style.display = "block";
  475. // New_Window.style.visibility = "visible";
  476. // return New_Window;
  477. } else {
  478. // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - //
  479. // NEW_WINDOW
  480. // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - //
  481. New_Window = document.createElement( 'div' );
  482. New_Window.id = WINDOW_ID;
  483. // NEW_WINDOW STYLE
  484. New_Window.style.border = "1px solid";
  485. New_Window.style.position = "relative";
  486. New_Window.style.display = "none";
  487. // New_Window.style.visibility = "hidden"; // BAD
  488. // NEW_WINDOW SIZE
  489. New_Window.style.width = WIDTH;
  490. New_Window.style.height = HEIGHT;
  491. // NEW_WINDOW POSITION
  492. New_Window.style.left = POS_LEFT;
  493. New_Window.style.top = POS_TOP;
  494. // NEW_WINDOW BACKGROUND COLOR
  495. New_Window.style.backgroundColor = "white";
  496. // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - //
  497. // Div_Title_Bar
  498. // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - //
  499. var Div_Title_Bar_ID = WINDOW_ID + "_Title";
  500. // function Append_Div(TARGET_NODE, NEW_DIV_ID, NEW_DIV_DISPLAY) {
  501. var Div_Title_Bar = Append_Div(New_Window, Div_Title_Bar_ID, "block");
  502. Div_Title_Bar.style.position = "relative";
  503. Div_Title_Bar.style.top = "5px";
  504. Div_Title_Bar.style.height = "30px";
  505. Div_Title_Bar.style.marginLeft = "5px";
  506. Div_Title_Bar.style.marginRight = "5px";
  507. Div_Title_Bar.style.backgroundColor = "blue";
  508. // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - //
  509. // Div_Title
  510. // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - //
  511. var Div_Title_ID = WINDOW_ID + "_Title";
  512. // function Append_Div(TARGET_NODE, NEW_DIV_ID, NEW_DIV_DISPLAY) {
  513. var Div_Title = Append_Div(Div_Title_Bar, Div_Title_ID, "inline");
  514. Div_Title.innerHTML = TITLE;
  515. Div_Title.style.position = "relative";
  516. Div_Title.style.fontSize = "24px";
  517. Div_Title.style.top = "5px";
  518. Div_Title.style.marginLeft = "5px";
  519. Div_Title.style.color = "white";
  520. // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - //
  521. // Close_Button
  522. // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - //
  523. var Close_Button;
  524. var Close_Button_ID = WINDOW_ID + "_Close_Button";
  525. Close_Button = Append_Button(Div_Title_Bar, Close_Button_ID, "inline");
  526. Close_Button.innerHTML = "X";
  527. Close_Button.style.position = "relative";
  528. Close_Button.style.marginRight = "5px";
  529. Close_Button.style.top = "5px";
  530. Close_Button.style.cssFloat = "right";
  531. // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - //
  532. // CloseButton Click Event
  533. // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - //
  534. Close_Button.addEventListener("click", function() {
  535. New_Window.style.display = "none";
  536. });
  537. // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - //
  538. // Line Breaks
  539. // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - //
  540. //Append_BR(New_Window);
  541. //Append_BR(New_Window);
  542. // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - //
  543. // APPEND NEW_WINDOW TO DOCUMENT
  544. // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - //
  545. New_Window.style.display = "block";
  546. document.body.appendChild(New_Window);
  547. // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - //
  548. // Drag_This
  549. // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - //
  550. Div_Title_Bar.style.cursor = "move";
  551. Drag_This(Div_Title_Bar, New_Window);
  552. }
  553. return New_Window;
  554. }
  555. //====================================================================================================
  556.  
  557. function Append_Button(TARGET_NODE, NEW_BUTTON_ID, NEW_BUTTON_DISPLAY, NEW_BUTTON_CAPTION) {
  558. // createElement //
  559. var NEW_BUTTON = document.createElement( 'BUTTON' );
  560. // PARAMETERS //
  561. if (NEW_BUTTON_ID) { NEW_BUTTON.id = NEW_BUTTON_ID; }
  562. if (NEW_BUTTON_DISPLAY) { NEW_BUTTON.style.display = NEW_BUTTON_DISPLAY; }
  563. // BUTTON CAPTION //
  564. if (NEW_BUTTON_CAPTION) {
  565. var tmp_caption = document.createTextNode(NEW_BUTTON_CAPTION);
  566. NEW_BUTTON.appendChild(tmp_caption);
  567. // var t = document.createTextNode("Click me");
  568. // x.appendChild(t);
  569. }
  570. // appendChild //
  571. TARGET_NODE.appendChild(NEW_BUTTON);
  572. return NEW_BUTTON;
  573. }
  574.  
  575. //====================================================================================================
  576.  
  577.  
  578. function Append_Textbox(TARGET_NODE, NEW_TEXTBOX_ID, NEW_TEXTBOX_DISPLAY) {
  579. // createElement //
  580. var NEW_TEXTBOX = document.createElement( 'input' );
  581. // PARAMETERS //
  582. if (NEW_TEXTBOX_ID) { NEW_TEXTBOX.id = NEW_TEXTBOX_ID; }
  583. if (NEW_TEXTBOX_DISPLAY) { NEW_TEXTBOX.style.display = NEW_TEXTBOX_DISPLAY; }
  584. // appendChild //
  585. TARGET_NODE.appendChild(NEW_TEXTBOX);
  586. // Return Created Node
  587. return NEW_TEXTBOX;
  588. }
  589.  
  590. //====================================================================================================
  591.  
  592.  
  593. //====================================================================================================
  594. // MODULE: DRAGING OBJECTS
  595. // REQUIREMENT: ?
  596. // SOURCE: https://jsfiddle.net/tovic/Xcb8d/
  597. //====================================================================================================
  598.  
  599. var selected = null, // Object of the element to be moved
  600. x_pos = 0, y_pos = 0, // Stores x & y coordinates of the mouse pointer
  601. x_elem = 0, y_elem = 0; // Stores top, left values (edge) of the element
  602.  
  603. // Will be called when user starts dragging an element
  604. function _drag_init(elem) {
  605. // Store the object of the element which needs to be moved
  606. selected = elem;
  607. x_elem = x_pos - selected.offsetLeft;
  608. y_elem = y_pos - selected.offsetTop;
  609. }
  610.  
  611. // Will be called when user dragging an element
  612. function _move_elem(e) {
  613. x_pos = document.all ? window.event.clientX : e.pageX;
  614. y_pos = document.all ? window.event.clientY : e.pageY;
  615. if (selected !== null) {
  616. selected.style.left = (x_pos - x_elem) + 'px';
  617. selected.style.top = (y_pos - y_elem) + 'px';
  618. }
  619. }
  620.  
  621. // Destroy the object when we are done
  622. function _destroy() {
  623. selected = null;
  624. }
  625.  
  626. // Bind the functions...
  627.  
  628. function Drag_This(GRAB_ELEMENT, MOVE_ELEMENT) {
  629. // OR...
  630. // document.querySelector(GRAB_ELEMENT).onmousedown = function () {
  631. GRAB_ELEMENT.onmousedown = function () {
  632. _drag_init(MOVE_ELEMENT);
  633. return false;
  634. };
  635. }
  636.  
  637. // ORIGINAL CODE //
  638. /*
  639. // Bind the functions...
  640. document.getElementById('draggable-element').onmousedown = function () {
  641. _drag_init(this);
  642. return false;
  643. };
  644. */
  645.  
  646. document.onmousemove = _move_elem;
  647. document.onmouseup = _destroy;
  648.  
  649. //====================================================================================================
  650.  
  651.  
  652.  
  653. })();
  654.  
  655. // THE END
  656.  
  657.