BroniesNL Customizer

Een user script om de interface (achtergrond, banner en kleur accenten) van Bronies.nl aan te passen en enkele problemen met het forum op te lossen.

  1. // ==UserScript==
  2. // @name BroniesNL Customizer
  3. // @namespace Ossie/BroniesNL/Customizer
  4. // @description Een user script om de interface (achtergrond, banner en kleur accenten) van Bronies.nl aan te passen en enkele problemen met het forum op te lossen.
  5. // @include http://www.bronies.nl/*
  6. // @include https://www.bronies.nl/*
  7. // @include http://bronies.nl/*
  8. // @include https://bronies.nl/*
  9. // @exclude /\w*(gif|jpg|jpeg|png)/
  10. // @require http://ajax.googleapis.com/ajax/libs/jquery/1.6.2/jquery.min.js
  11. // @require //cdnjs.cloudflare.com/ajax/libs/datejs/1.0/date.min.js
  12. // @version 2.5
  13. // @grant GM_getValue
  14. // @grant GM_setValue
  15. // ==/UserScript==
  16.  
  17. var settings = {"background":"Official","cusback":"","banner":"Official","cusban":"","theme":"Normal","noimages":0,"limitimages":1,"bettertime":1};
  18. loadSettings();
  19.  
  20. var darkmod = [['body','color','#ddd'],['h2, h3','color','#ccc'],['.forumheader, .forumheader2, .forumheader3, .forumheader4, .fcaption, .finfobar', 'background-color','rgba(16,16,16,0.8)'],['.forumheader, .forumheader2, .forumheader3, .forumheader4, .fcaption, .finfobar', 'border','1px solid #2c65a4'],['#wrapper .smalltext','color','#ddd'],['#wrapper','border-radius','4px'],['.smalltext','color','#ddd'],['a:link, a:visited','color','#3f9aef'],['a:hover','color','#86bcef'],['#navigation','background-color',''],['.indent','background-color','rgba(0,0,0,0.1)'],['#wrapper','background','rgba(16,16,16,0.7)'],['.defaultform','background','rgba(255,255,255,0.1)'],['.npbutton','background','rgb(255,255,255)'],['#footer','background','url()'],['code span','color','#ddd']];
  21. var whitemod = [['body','color','#111'],['h2, h3','color','#222'],['.forumheader, .forumheader2, .forumheader3, .forumheader4, .fcaption, .finfobar', 'background-color','rgba(255,255,255,0.8)'],['.forumheader, .forumheader2, .forumheader3, .forumheader4, .fcaption, .finfobar', 'border','1px solid #AAA'],['#wrapper .smalltext','color','#111'],['#wrapper','border-radius','4px'],['.smalltext','color','#111'],['a:link, a:visited','color','#3f7aef'],['a:hover','color','#86bcef'],['#navigation','background-color',''],['.indent','background-color','rgb(255,255,255)'],['#wrapper','background','rgba(255,255,255,0.5)'],['.defaultform','background','rgba(255,255,255,0.4)'],['.npbutton','background','rgb(255,255,255)'],['#footer','background','url()']];
  22. var normal = [['body','color',''],['.forumheader, .forumheader2, .forumheader3, .forumheader4, .fcaption, .finfobar', 'background-color',''],['.forumheader, .forumheader2, .forumheader3, .forumheader4, .fcaption, .finfobar', 'border',''],['#wrapper .smalltext','color',''],['#wrapper','border-radius',''],['.smalltext','color',''],['a:link, a:visited','color',''],['a:hover','color',''],['#navigation','background-color',''],['.indent','background-color',''],['#wrapper','background',''],['.defaultform','background',''],['.npbutton','background',''],['#footer','background','']];
  23.  
  24. var themes = ["Dark Mod", "White Mod", "Normal"];
  25. var backgrounds = {"Dark Mod":"http://i.imgur.com/rc4ARbY.jpg","Official":"http://www.bronies.nl/e107_themes/leaf/images/background_mlp2.jpg","None - White":"http://i.imgur.com/GHpkydG.png","None - Grey":"http://i.imgur.com/8KvYUOS.png","None - Black":"http://i.imgur.com/7gMwArd.png"};
  26. var banners = {"Dark Mod":"http://i.imgur.com/QKNikxE.jpg","Official":"http://www.bronies.nl/e107_themes/leaf/images/01_header.png","Original":"http://i.imgur.com/Hiu5h1P.png","Rainbow Dash":"http://i.imgur.com/zIDVEHs.png","Luna/Zecora/Chrysalis":"http://i.imgur.com/JBfkwiX.png","Discord":"http://i.imgur.com/L3p8owm.jpg","None":""};
  27.  
  28. var optionsbutton = '<img class="customizerbutton" src="http://i.imgur.com/W3b3Sbv.png" style="position:absolute;right:0px;top:0px;z-index:1000;"></img>';
  29.  
  30. //0
  31. var sback = '';
  32. for(back in backgrounds){
  33. var sel = settings["background"] == back ? 'selected="selected"' : '';
  34. sback += '<option value="'+back+'" '+sel+'>'+back+'</option>';
  35. }
  36.  
  37. //2
  38. var sban = '';
  39. for(ban in banners){
  40. var sel = settings["banner"] == ban ? 'selected="selected"' : '';
  41. sban += '<option value="'+ban+'" '+sel+'>'+ban+'</option>';
  42. }
  43.  
  44. //4
  45. var st = '';
  46. for(t in themes){
  47. var sel = settings["theme"] == themes[t] ? 'selected="selected"' : '';
  48. st += '<option value="'+themes[t]+'" '+sel+'>'+themes[t]+'</option>';
  49. }
  50.  
  51. //5
  52. var sni = settings["noimages"] ? 'checked="yes"' : '';
  53. var sli = settings["limitimages"] ? 'checked="yes"' : '';
  54. var sbt = settings["bettertime"] ? 'checked="yes"' : '';
  55.  
  56. var options = format('<div class="customizeroptions" style="color:#FFF;text-align:left;display:none;position:absolute;right:0px;top:0px;z-index:999;background:rgba(50,50,50,0.6);border:1px solid rgba(150,150,150,0.5);padding:20px;">\
  57. <span>Background:</span>\
  58. <select name="cbackground" id="cbackground">{0}</select><BR>\
  59. <span>Custom Background:</span>\
  60. <input type="text" name="cusback" id="cusback" value="{1}"/><br><br>\
  61. <span>Banner:</span>\
  62. <select name="cbanner" id="cbanner">{2}</select><BR>\
  63. <span>Custom Banner:</span>\
  64. <input type="text" name="cusban" id="cusban" value="{3}"/><br><br>\
  65. <span>Theme:</span><select name="ctheme" id="ctheme">{4}</select><BR>\
  66. <input type="checkbox" name="cnoimages" id="cnoimages" {5}> Disable Images<br>\
  67. <input type="checkbox" name="climitimages" id="climitimages" {6}> Limit Images<br>\
  68. <input type="checkbox" name="cbettertime" id="cbettertime" {7}> Show Thread Age<br>\
  69. <button class="savesettings" value="Save">Save</button></div>',sback, settings["cusback"], sban, settings["cusban"], st, sni, sli, sbt);
  70. showSettingsButton();
  71. applyTheme();
  72. applyBackground();
  73. applyBanner();
  74. fixImages();
  75. fixButtons();
  76. fixSpoiler();
  77. if(settings["bettertime"]) {
  78. betterTime();
  79. }
  80. if(settings["limitimages"]) {
  81. limitImages();
  82. }
  83. if(settings["noimages"]) {
  84. noImages();
  85. }
  86.  
  87. $(document).keydown(function(e) {
  88. if(!e.ctrlKey && e.altKey && e.keyCode >= 49 && e.keyCode <= 56){
  89. var value = e.keyCode - 48;
  90. if($('#post').length != 0) {
  91. $('#post').insertAtCaret('[img width='+value+'00][/img]');
  92. //$('#post').setCaret($('#post').getCursorPosition()-6);
  93. } else if(document.location.href.indexOf('/forum_viewtopic.php') != -1) {
  94. $('.forumheader3 form p .tbox').insertAtCaret('[img width='+value+'00][/img]');
  95. //$('#post').setCaret($('#post').getCursorPosition()-6);
  96. }
  97. }
  98. });
  99.  
  100. $('.customizeroptions span').css('width','130px').css('display','inline-block');
  101. $('.customizerbutton').click(showSettings);
  102. $('.savesettings').click(saveSettings);
  103.  
  104. function showSettingsButton() {
  105. $('body').append(optionsbutton).append(options);
  106. }
  107.  
  108. function showSettings(event) {
  109. if($('.customizeroptions').is(":visible")) {
  110. $('.customizeroptions').hide();
  111. } else {
  112. $('.customizeroptions').show();
  113. }
  114. }
  115.  
  116. function loadSettings() {
  117. var set = GM_getValue('settings');
  118. if(set != null) settings = JSON.parse(set);
  119. }
  120.  
  121. function saveSettings(event) {
  122. settings["background"] = $('#cbackground').find(":selected").text();
  123. settings["cusback"] = $('#cusback').val() != null && $('#cusback').val() != '' ? $('#cusback').val() : '';
  124. settings["banner"] = $('#cbanner').find(":selected").text();
  125. settings["cusban"] = $('#cusban').val() != null && $('#cusban').val() != '' ? $('#cusban').val() : '';
  126. settings["theme"] = $('#ctheme').find(":selected").text();
  127. settings["noimages"] = $('#cnoimages').prop('checked');
  128. settings["limitimages"] = $('#climitimages').prop('checked');
  129. settings["bettertime"] = $('#cbettertime').prop('checked');
  130. GM_setValue('settings',JSON.stringify(settings));
  131. applyBackground();
  132. applyBanner();
  133. applyTheme();
  134. if(settings["noimages"]) {
  135. noImages();
  136. }
  137. }
  138.  
  139. function applyTheme() {
  140. switch(settings["theme"]) {
  141. case("Dark Mod"):
  142. theme = darkmod;
  143. break;
  144. case("White Mod"):
  145. theme = whitemod;
  146. break;
  147. case("Normal"):
  148. theme = normal;
  149. break;
  150. }
  151. for(i = 0; i < theme.length; i++) {
  152. $(theme[i][0]).css(theme[i][1],theme[i][2]);
  153. }
  154.  
  155. }
  156.  
  157. function applyBackground() {
  158. var w = backgrounds[settings["background"]];
  159. if(settings["cusback"] != null && settings["cusback"] != "") w = settings["cusback"];
  160. $('body').css('background-image','url("'+w+'")');
  161. }
  162.  
  163. function applyBanner() {
  164. var b = banners[settings["banner"]];
  165. if(settings["cusban"] != null && settings["cusban"] != "") b = settings["cusban"];
  166. $('#header').css('background','url("'+b+'") no-repeat scroll 0% 0% transparent');
  167. }
  168.  
  169. function fixImages() {
  170. $('.forumheader2 img').each(function(index) {
  171. if($(this).attr('src').indexOf('nonew') != -1) {
  172. $(this).attr('src','http://i.imgur.com/yWQc5MT.png');
  173. } else if($(this).attr('src').indexOf('new.') != -1) {
  174. $(this).attr('src','http://i.imgur.com/FMUM9N9.png');
  175. }
  176. });
  177. $('.forumheader3 img').each(function(index) {
  178. if($(this).attr('src').indexOf('/nonew.png') != -1) {
  179. $(this).attr('src','http://i.imgur.com/yWQc5MT.png');
  180. } else if($(this).attr('src').indexOf('/new.png') != -1) {
  181. $(this).attr('src','http://i.imgur.com/FMUM9N9.png');
  182. } else if($(this).attr('src').indexOf('/sticky.png') != -1) {
  183. $(this).attr('src','http://i.imgur.com/h4cXlGk.png');
  184. } else if($(this).attr('src').indexOf('/announce.png') != -1) {
  185. $(this).attr('src','http://i.imgur.com/AnbFb3V.png');
  186. } else if($(this).attr('src').indexOf('/nonew_popular.png') != -1) {
  187. $(this).attr('src','http://i.imgur.com/8KxcQS7.png');
  188. } else if($(this).attr('src').indexOf('/new_popular.png') != -1) {
  189. $(this).attr('src','http://i.imgur.com/1J9BC2e.png');
  190. } else if($(this).attr('src').indexOf('/sticky_closed.png') != -1) {
  191. $(this).attr('src','http://i.imgur.com/GFh26F5.png');
  192. } else if($(this).attr('src').indexOf('/closed.png') != -1) {
  193. $(this).attr('src','http://i.imgur.com/SRLivKT.png');
  194. } else if($(this).attr('src').indexOf('/nonew_small.png') != -1) {
  195. $(this).attr('src','http://i.imgur.com/yWQc5MT.png');
  196. } else if($(this).attr('src').indexOf('/new_small.png') != -1) {
  197. $(this).attr('src','http://i.imgur.com/FMUM9N9.png');
  198. } else if($(this).attr('src').indexOf('/sticky_small.png') != -1) {
  199. $(this).attr('src','http://i.imgur.com/h4cXlGk.png');
  200. } else if($(this).attr('src').indexOf('/announce_small.png') != -1) {
  201. $(this).attr('src','http://i.imgur.com/AnbFb3V.png');
  202. } else if($(this).attr('src').indexOf('/nonew_popular_small.png') != -1) {
  203. $(this).attr('src','http://i.imgur.com/8KxcQS7.png');
  204. } else if($(this).attr('src').indexOf('/new_popular_small.png') != -1) {
  205. $(this).attr('src','http://i.imgur.com/1J9BC2e.png');
  206. } else if($(this).attr('src').indexOf('/sticky_closed_small.png') != -1) {
  207. $(this).attr('src','http://i.imgur.com/GFh26F5.png');
  208. } else if($(this).attr('src').indexOf('/closed_small.png') != -1) {
  209. $(this).attr('src','http://i.imgur.com/SRLivKT.png');
  210. } else if($(this).attr('src').indexOf('/e.png') != -1) {
  211. $(this).attr('src','http://i.imgur.com/5On2eOu.png');
  212. }
  213. });
  214. $('.forumheader3 img').each(function(index) {
  215. var src = $(this).attr('src');
  216. if(src.indexOf('lev1.') != -1) src = 'http://i.imgur.com/NT2kb0S.png';
  217. else if(src.indexOf('lev2') != -1) src = 'http://i.imgur.com/hDHNQSa.png';
  218. else if(src.indexOf('lev3') != -1) src = 'http://i.imgur.com/S83Bn9u.png';
  219. else if(src.indexOf('lev4') != -1) src = 'http://i.imgur.com/ESAMXeC.png';
  220. else if(src.indexOf('lev5') != -1) src = 'http://i.imgur.com/v8yUi3S.png';
  221. else if(src.indexOf('lev6') != -1) src = 'http://i.imgur.com/rqfI3dR.png';
  222. else if(src.indexOf('lev7') != -1) src = 'http://i.imgur.com/MJhubYv.png';
  223. else if(src.indexOf('lev8') != -1) src = 'http://i.imgur.com/jCy7qZR.png';
  224. else if(src.indexOf('lev9') != -1) src = 'http://i.imgur.com/pKd6f15.png';
  225. else if(src.indexOf('lev10') != -1) src = 'http://i.imgur.com/HM4MyzB.png';
  226. $(this).attr('src',src);
  227. });
  228. $('table tbody tr td a img').each(function(index) {
  229. if($(this).attr('src').indexOf('reply.') != -1) {
  230. $(this).attr('src','http://i.imgur.com/ppch3ZE.png');
  231. } else if($(this).attr('src').indexOf('newthread.') != -1) {
  232. $(this).attr('src','http://i.imgur.com/lpuuHS9.png');
  233. }
  234. });
  235. }
  236.  
  237. function fixButtons() {
  238. $('#navigation ul li a')
  239. .css('top','32px')
  240. .css('background','rgba(255,255,255,0.3)')
  241. .css('border','1px solid rgba(127,127,127,0.7)')
  242. .css('width','102px')
  243. .css('height','23px')
  244. .css('line-height','23px');
  245. $('.nav1_onpage a, .nav2_onpage a, .nav3_onpage a, .nav4_onpage a, .nav5_onpage a')
  246. .css('top','32px')
  247. .css('background','rgba(255,255,255,0.4)')
  248. .css('border','1px solid rgba(127,127,127,0.7)')
  249. .css('width','102px')
  250. .css('height','23px')
  251. .css('line-height','23px')
  252. .css('margin','0px');
  253. }
  254.  
  255. function betterTime() {
  256. var now = new Date();
  257. if(document.location.href.indexOf('/forum.php') != -1) {
  258. $('.forumheader3 .smallblacktext').each(function(index) {
  259. var t = $(this).text();
  260. console.log('1');
  261. if(t.indexOf('Edited') == -1) {
  262. console.log('2');
  263. if(t.indexOf(':') != -1) {
  264. var d = Date.parseExact(t.substring(4,t.indexOf(':')+5),'MMM dd yyyy, hh:mmtt');
  265. console.log(t.substring(4,t.indexOf(':')+5));
  266. var dif = Math.floor(Math.abs(now - d)/1000/60);
  267. if(dif>100800) dif = ">10w";
  268. else if(dif>1440) dif = Math.floor(dif/1440) + "d";
  269. else if(dif>60) dif = Math.floor(dif/60) + "h";
  270. else dif = dif + "m";
  271. $(this).html($(this).html() + " ("+dif+")");
  272. }
  273. }
  274. });
  275. }
  276. if(document.location.href.indexOf('viewforum') != -1) {
  277. $('.forumheader3').each(function(index) {
  278. if ( $(this).children().length != 2 ) { return; }
  279. var t = $(this).text();
  280. if(t.indexOf(':') != -1 && t.indexOf('Goto page:') == -1 && $(this).html().indexOf('mediumtext') == -1 && $(this).html().indexOf('smalltext') == -1) {
  281. var d = Date.parseExact(t.substring(t.length - 20),'MMM dd yyyy, hh:mmtt');
  282. console.log(t.substring(t.length - 20));
  283. var dif = Math.floor(Math.abs(now - d)/1000/60);
  284. if(dif>100800) dif = ">10w";
  285. else if(dif>1440) dif = Math.floor(dif/1440) + "d";
  286. else if(dif>60) dif = Math.floor(dif/60) + "h";
  287. else dif = dif + "m";
  288. var h = $(this).html();
  289. var p = h.indexOf('</a>')+4;
  290. $(this).html(h.substr(0,p) + " ("+dif+")" + h.substr(p));
  291. }
  292. });
  293. }
  294. }
  295.  
  296. function limitImages() {
  297. if(document.location.href.indexOf('viewtopic') != -1) {
  298. $('.forumheader3 img').each(function(index) {
  299. $(this).css('max-width',800);
  300. });
  301. }
  302. }
  303.  
  304. function fixSpoiler() {
  305. $('#dataform .forumheader2 img').each(function(index) {
  306. if($(this).attr('src').indexOf('/spoiler.png') != -1) {
  307. $(this).attr('onclick',"addtext('[spoiler][/spoiler]')");
  308. }
  309. });
  310. }
  311.  
  312. function noImages() {
  313. if(document.location.href.indexOf('viewforum') != -1) {
  314. $('img:not(.customizerbutton,table tbody tr td a img, .forumheader2 img, .forumheader3 img)').remove();
  315. } else {
  316. $('img:not(.customizerbutton,table tbody tr td a img, .forumheader2 img)').remove();
  317. }
  318. $('.smalltext img').remove();
  319. $('h2, h3, .contentbody').css('background','url()');
  320. $('embed').attr('src','');
  321. }
  322.  
  323. function format() {
  324. var s = arguments[0];
  325. for (var i = 0; i < arguments.length - 1; i++) {
  326. var reg = new RegExp("\\{" + i + "\\}", "gm");
  327. s = s.replace(reg, arguments[i + 1]);
  328. }
  329. return s;
  330. }
  331.  
  332. jQuery.fn.extend({
  333. insertAtCaret: function(myValue){
  334. return this.each(function(i) {
  335. if (this.selectionStart || this.selectionStart == '0') {
  336. var startPos = this.selectionStart;
  337. var endPos = this.selectionEnd;
  338. var scrollTop = this.scrollTop;
  339. this.value = this.value.substring(0, startPos)+myValue+this.value.substring(endPos,this.value.length);
  340. this.focus();
  341. this.selectionStart = startPos + myValue.length;
  342. this.selectionEnd = startPos + myValue.length;
  343. this.scrollTop = scrollTop;
  344. } else {
  345. this.value += myValue;
  346. this.focus();
  347. }
  348. })
  349. }
  350. });
  351.  
  352. $.fn.setCaret = function(pos) {
  353. return this.each(function() {
  354. if (this.setSelectionRange) {
  355. this.focus();
  356. this.setSelectionRange(pos, pos);
  357. } else if (this.createTextRange) {
  358. var range = this.createTextRange();
  359. range.collapse(true);
  360. range.moveEnd('character', pos);
  361. range.moveStart('character', pos);
  362. range.select();
  363. }
  364. });
  365. };
  366.  
  367. (function ($, undefined) {
  368. $.fn.getCursorPosition = function() {
  369. var el = $(this).get(0);
  370. var pos = 0;
  371. if('selectionStart' in el) {
  372. pos = el.selectionStart;
  373. } else if('selection' in document) {
  374. el.focus();
  375. var Sel = document.selection.createRange();
  376. var SelLength = document.selection.createRange().text.length;
  377. Sel.moveStart('character', -el.value.length);
  378. pos = Sel.text.length - SelLength;
  379. }
  380. return pos;
  381. }
  382. })(jQuery);