Primel Dozenator

Converts the site-generated numbers on Dozensonline into side-by-side dozenal and decimal, Rosetta Stone like.

当前为 2015-11-08 提交的版本,查看 最新版本

  1. // ==UserScript==
  2. // @name Primel Dozenator
  3. // @namespace http://userscripts.org/users/322169
  4. // @version 0.9.0
  5. // @description Converts the site-generated numbers on Dozensonline into side-by-side dozenal and decimal, Rosetta Stone like.
  6. // @include http://z13.invisionfree.com/DozensOnline/*
  7. // @copyright 2015, John Volan
  8. // ==/UserScript==
  9.  
  10. (function() {
  11. var dChars = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9'];
  12. var zChars = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'Ӿ', 'Ɛ'];
  13. var intPrefix = '';
  14. var fractPrefix = ''
  15. var point = '.';
  16. var dozenal = '<sub>z</sub>';
  17. var decimal = '<sub>d</sub>';
  18. var annotateSingleDigit = false;
  19. // 'd' for "decimal".
  20. function toDozenal(dText) {
  21. dText += '';
  22. var number = 0;
  23. for (var i = 0; i < dText.length; i++) {
  24. if (dText[i] == ',') continue;
  25. number *= 10;
  26. number += dChars.indexOf(dText[i]);
  27. }
  28. if (number < 10) return number + '';
  29. var text = '';
  30. var pow = Math.floor(Math.log(number) / (Math.log(12) || 1));
  31. do {
  32. var digit = Math.floor(number / Math.pow(12, pow));
  33. text += zChars[digit];
  34. number -= digit * Math.pow(12, pow--);
  35. }
  36. while (pow >= 0 || number > 0);
  37. return text;
  38. }
  39. function addCommas(text) {
  40. text += '';
  41. var withCommas = '';
  42. var end = text.length-1;
  43. for (var i = 0; i < end; i++) {
  44. withCommas += text[i];
  45. if ((end-i) % 3 == 0) {
  46. withCommas += ',';
  47. }
  48. }
  49. withCommas += text[end];
  50. return withCommas;
  51. }
  52. function convert(dText) {
  53. if (! annotateSingleDigit && Math.abs(dText) < 10) {
  54. return dText
  55. } else {
  56. return addCommas(toDozenal(dText)) + dozenal + '&nbsp;=&nbsp;' + dText + decimal;
  57. }
  58. }
  59. function convertStacked(dText) {
  60. return addCommas(toDozenal(dText)) + dozenal + '<br>' + dText + decimal;
  61. }
  62. function convertYear(dText) {
  63. return toDozenal(dText) + dozenal + '&nbsp;=&nbsp;' + dText + decimal;
  64. }
  65. function convertFract(dText) {
  66. if (!dText) return '';
  67. dText += '';
  68. var number = 0;
  69. var inFract = false, fractLength = 0;
  70. var isPerCent = false;
  71. for (var i = 0; i < dText.length; i++) {
  72. if (dText[i] == '.') {
  73. inFract = true;
  74. continue;
  75. }
  76. if (dText[i] == '%') {
  77. isPerCent = true;
  78. break;
  79. }
  80. if (inFract) fractLength++;
  81. number *= 10;
  82. number += dChars.indexOf(dText[i]);
  83. }
  84. number /= Math.pow(10, fractLength) * (isPerCent ? 100 : 1);
  85. return createFract(number, fractLength, isPerCent);
  86. }
  87. function createFract(number, fractLength, makePerGross) {
  88. if (makePerGross) number *= 144;
  89. var text = '';
  90. var pow = Math.floor(Math.log(number) / (Math.log(12) || 1));
  91. pow = Math.max(pow, 0);
  92. do {
  93. var digit = Math.floor(number / Math.pow(12, pow));
  94. text += zChars[digit];
  95. number -= digit * Math.pow(12, pow--);
  96. }
  97. while (pow >= 0);
  98. if (fractLength > 0) {
  99. text += point;
  100. }
  101. // Calculate an extra place to use in rounding
  102. for (pow = -1; pow >= -fractLength - 1; pow--) {
  103. var digit = Math.floor(number / Math.pow(12, pow));
  104. text += zChars[digit];
  105. number -= digit * Math.pow(12, pow);
  106. }
  107. return fractPrefix + round(text) + (makePerGross ? '%' : '') + dozenal;
  108. }
  109. // 'z' for "dozenal".
  110. function round(zText) {
  111. if (zText[zText.length - 1] == point)
  112. return round(zText.substr(0, zText.length - 1) + zChars[11]) + point;
  113. else if (zChars.indexOf(zText[zText.length - 1]) >= 6) {
  114. if (zText[zText.length - 2] == zChars[11])
  115. return round(zText.substr(0, zText.length - 1)) + zChars[0];
  116. else {
  117. if (zText[zText.length - 2] == point)
  118. return zText.substr(0, zText.length - 3) + zChars[zChars.indexOf(zText[zText.length - 3]) + 1] + point;
  119. else
  120. return zText.substr(0, zText.length - 2) + zChars[zChars.indexOf(zText[zText.length - 2]) + 1];
  121. }
  122. }
  123. else {
  124. return zText.substr(0, zText.length - 1);
  125. }
  126. }
  127. // 's' for "sexagesimal".
  128. function convertTime(sText, am) {
  129. sText += '';
  130. var hour = sText.substr(0, 2) % 12 + (am == 'AM' ? 0 : 12);
  131. var minute = sText.substr(3, 2) * 1;
  132. var minutes = hour * 60 + minute;
  133. var trices = Math.round(minutes * 60 / 50);
  134. var breathers = Math.floor(trices / 12);
  135. var dwells = Math.floor(breathers / 12);
  136. var trice = trices % 12;
  137. var breather = breathers % 12;
  138. var dwell = dwells % 12;
  139. return zChars[dwell] + zChars[breather] + zChars[trice];
  140. }
  141. function convertDateWithSeparator(dText, separator) {
  142. dText += '';
  143. var month = dText.match(/\b[A-Za-z]{3}/);
  144. var day = dText.match(/\b\d\d?(?=[ a-z])/);
  145. var zDay = toDozenal(day);
  146. if (day < 12) zDay = '0' + zDay;
  147. if (day < 10) day = '0' + day;
  148. var year = dText.match(/\d{4}/);
  149. var zDate = '(' + month + ' ' + zDay + ' ' + toDozenal(year) + ')' + dozenal;
  150. var dDate = '(' + month + ' ' + day + ' ' + year + ')' + decimal;
  151. return zDate + separator + dDate;
  152. }
  153. function convertDate(dText) {
  154. return convertDateWithSeparator(dText, '&nbsp;=&nbsp;');
  155. }
  156. function convertDateStacked(dText) {
  157. return convertDateWithSeparator(dText, '<br>');
  158. }
  159. // 's' for "sexagesimal".
  160. function convertDateTimeWithSep(dText, separator) {
  161. dText += '';
  162. var month = dText.match(/[A-Za-z]{3}/);
  163. var day = dText.match(/\b\d\d?(?=[ a-z])/);
  164. var zDay = toDozenal(day);
  165. if (day < 12) zDay = '0' + zDay;
  166. if (day < 10) day = '0' + day;
  167. var year = dText.match(/\d{4}/);
  168. var time = dText.match(/\b\d\d:\d\d/);
  169. var am = dText.match(/[AP]M/);
  170. var zDateTime = '(' + month + ' ' + zDay + ' ' + toDozenal(year) + ', trice ' + convertTime(time, am) + ')' + dozenal;
  171. var dDateTime = '(' + month + ' ' + day + ' ' + year + ', ' + time + ' ' + am + ')' + decimal;
  172. return zDateTime + separator + dDateTime;
  173. }
  174. // 's' for "sexagesimal".
  175. function convertDateTime(dText) {
  176. return convertDateTimeWithSep(dText, '&nbsp;=&nbsp;')
  177. }
  178. // 's' for "sexagesimal".
  179. function convertDateTimeStacked(dText) {
  180. return convertDateTimeWithSep(dText, '<br>')
  181. }
  182. function elConvert(element, pattern) {
  183. element.innerHTML = element.innerHTML.replace(pattern, convert(element.innerHTML.match(pattern)));
  184. }
  185. function elConvertStacked(element, pattern) {
  186. element.innerHTML = element.innerHTML.replace(pattern, convertStacked(element.innerHTML.match(pattern)));
  187. }
  188. function elConvertFract(element, pattern) {
  189. element.innerHTML = element.innerHTML.replace(pattern, convertFract(element.innerHTML.match(pattern)));
  190. }
  191. function toDozenalMultifield(text, pattern) {
  192. try {
  193. text += '';
  194. var matches = text.match(pattern);
  195. var startPos = 0;
  196. for (var i = 0; i < matches.length; i++) {
  197. var match = matches[i];
  198. startPos += text.substring(startPos).search(pattern);
  199. var split = [text.substr(0, startPos), text.substr(startPos, match.length), text.substr(startPos + match.length)];
  200. var result = toDozenal(match);
  201. text = split[0] + result + split[2];
  202. startPos += result.length;
  203. }
  204. } catch (e) {
  205. console.log(e);
  206. }
  207. return text;
  208. }
  209. function elConvertMultifield(element, pattern) {
  210. element.innerHTML = element.innerHTML + decimal + '=' + toDozenalMultifield(element.innerHTML, pattern);
  211. }
  212. function elConvertGlobal(element, pattern) {
  213. var matches = element.innerHTML.match(pattern);
  214. var startPos = 0;
  215. for (var i = 0; i < matches.length; i++) {
  216. var match = matches[i];
  217. startPos += element.innerHTML.substring(startPos).search(pattern);
  218. var split = [element.innerHTML.substr(0, startPos), element.innerHTML.substr(startPos, match.length), element.innerHTML.substr(startPos + match.length)];
  219. var result = convert(match);
  220. element.innerHTML = split[0] + result + split[2];
  221. startPos += result.length;
  222. }
  223. }
  224. function elCreateFract(element, pattern, number, fractLength, makePerGross) {
  225. var dFract = element.innerHTML.match(pattern);
  226. var zFract = createFract(number, fractLength, makePerGross);
  227. var fract = zFract + '&nbsp;=&nbsp;' + dFract + decimal;
  228. element.innerHTML = element.innerHTML.replace(pattern, fract);
  229. }
  230. function elConvertTime(element, pattern) {
  231. var match = element.innerHTML.match(pattern) + '';
  232. element.innerHTML = element.innerHTML.replace(match, convertTime(match.substr(0, 5), match.substr(6) == 'AM'));
  233. }
  234. function elConvertDate(element, pattern) {
  235. var match = element.innerHTML.match(pattern) + '';
  236. element.innerHTML = element.innerHTML.replace(match, convertDate(match));
  237. }
  238. function elConvertDateTime(element, pattern) {
  239. var match = element.innerHTML.match(pattern) + '';
  240. element.innerHTML = element.innerHTML.replace(match, convertDateTime(match));
  241. }
  242. function elConvertDateTimeStacked(element, pattern) {
  243. var match = element.innerHTML.match(pattern) + '';
  244. element.innerHTML = element.innerHTML.replace(match, convertDateTimeStacked(match));
  245. }
  246. function elConvertYear(element) {
  247. var pattern = /\d{4}(?= )/;
  248. element.innerHTML = element.innerHTML.replace(pattern, convertYear(element.innerHTML.match(pattern)));
  249. }
  250. function txtConvert(textNode, pattern) {
  251. textNode.textContent = textNode.textContent.replace(pattern, convert(textNode.textContent.match(pattern)));
  252. }
  253. (function() {
  254. var el, els, i;
  255. // Common elements:
  256. // Inbox count:
  257. el = document.querySelector('b+a');
  258. elConvert(el);
  259.  
  260. // Page creation time (in the footer (class=row4), in a <b> tag)
  261. el = document.querySelector('.row4[align=center]>b');
  262. var creationTimeSeconds = parseFloat(el.innerHTML);
  263. var creationTimeJiffs = creationTimeSeconds / 50 * 1728;
  264. el.innerHTML = el.innerHTML.replace(/.+/, creationTimeSeconds + decimal);
  265. el = document.querySelector('.row4[align=center][style]');
  266. el.innerHTML = el.innerHTML.replace('seconds', 'seconds = <b>' + createFract(creationTimeJiffs, 4) + '</b> jiffs');
  267.  
  268. // Invision copyright year
  269. elConvertYear(el, /\d{4}(?= )/);
  270. // Terms of use update date (second hyperlink in footer)
  271. el = document.querySelector('.row4[align=center]>a:nth-of-type(2)');
  272. var match = el.innerHTML.match(/\d+\/\d+\/\d+\b/);
  273. el.innerHTML = el.innerHTML.replace(match, match + decimal + ' = ' + toDozenalMultifield(match, /\d+\b/g) + dozenal);
  274. if (document.location.search == '?act=idx' || (document.location.search == '' && document.title.indexOf(' ') == -1)) {
  275. // Main page
  276. // Last Visit Date
  277. el = document.querySelector('#navstrip+br+div');
  278. elConvertDateTime(el, /\b[A-Za-z]{3} \d\d? \d{4}, \d\d:\d\d [AP]M/);
  279. // Topic and Reply Counts
  280. els = document.querySelectorAll('.row2[align]');
  281. for (i = 0; i < els.length; i++)
  282. elConvertStacked(els[i], /.+/);
  283. // Last Post Date
  284. els = document.querySelectorAll('.row2[nowrap]');
  285. for (i = 0; i < els.length; i++) {
  286. elConvertDateTimeStacked(els[i], /\b[A-Za-z]{3} \d\d? \d{4}, \d\d:\d\d [AP]M/);
  287. }
  288. // el = document.querySelector('div>a+a+a');
  289. // el.innerHTML = el.innerHTML.replace('10', zChars[10] + dozenal);
  290. el = document.querySelector('.pformstrip');
  291. elConvert(el, /\d+/);
  292. el.innerHTML = el.innerHTML.replace('15 minutes', '16<sub>z</sub> trices = 15<sub>d</sub> minutes');
  293. // Board Statistics
  294. els = document.querySelectorAll('.row4:last-child>b');
  295. for (i = 0; i < els.length - 1; i++) {
  296. el = els[i];
  297. if (el.innerHTML.match(/[0-9,]+/) == el.innerHTML)
  298. elConvert(el, /.+/);
  299. if (el.innerHTML.match(/\b[A-Za-z]{3} \d\d? \d{4}, \d\d:\d\d [AP]M/) == el.innerHTML)
  300. elConvertDateTime(els[i], /\b[A-Za-z]{3} \d\d? \d{4}, \d\d:\d\d [AP]M/);
  301. }
  302. }
  303. else if (document.location.search.indexOf('showforum=') != -1 || document.location.search.indexOf('act=SF') != -1) {
  304. // Topic list
  305. // Replies/Views counts
  306. els = document.querySelectorAll('.row4:nth-child(5)>a, .row4:nth-child(6), .row2:nth-child(6)');
  307. for (i = 0; i < els.length; i++)
  308. if (els[i].innerHTML.indexOf('-') == -1)
  309. elConvertStacked(els[i], /.+/);
  310. // Last Post Date
  311. els = document.querySelectorAll('.row4:nth-child(7), .row2:nth-child(7)');
  312. for (i = 0; i < els.length; i++) {
  313. elConvertDateTimeStacked(els[i], /\b\d\d?[a-z]{2} [A-Za-z]+ \d{4} - \d\d:\d\d [AP]M/);
  314. }
  315. // Subforum List
  316. // Topics/Replies counts
  317. els = document.querySelectorAll('.row2:nth-child(3), .row2:nth-child(4)');
  318. for (i = 0; i < els.length; i++)
  319. elConvertStacked(els[i], /\d+(?! )/);
  320. // Last Post Info Date
  321. els = document.querySelectorAll('.row2:nth-child(5)');
  322. for (i = 0; i < els.length; i++) {
  323. elConvertDateTimeStacked(els[i], /\b[A-Za-z]+ \d\d? \d{4}, \d\d:\d\d [AP]M/);
  324. }
  325. // Showing x of y topics sorted by ...
  326. els = document.querySelectorAll('.darkrow2');
  327. el = els[els.length - 1];
  328. var dCount = el.innerHTML.match(/\d+ of \d+/);
  329. dCount += '';
  330. if (dCount) {
  331. var x = el.innerHTML.match(/\b\d+(?= of)/);
  332. var y = el.innerHTML.match(/\b\d+(?= topics)/);
  333. var zCount = '(' + toDozenal(x) + ' of ' + toDozenal(y) + ')' + dozenal;
  334. dCount = '(' + dCount + ')' + decimal;
  335. el.innerHTML = el.innerHTML.replace(/\d+ of \d+/, zCount + ' = ' + dCount);
  336. }
  337.  
  338. // Users/Guests/Anonymous browsing this forum
  339. el = els[els.length - 2];
  340. elConvertGlobal(el, /\d+(?= )/g);
  341.  
  342. // Multi-page breadcrumb:
  343. // Non-links: (total) [current]
  344. els = document.querySelectorAll('[width="20%"]');
  345. for (i = 0; i < els.length; i++) {
  346. el = els[i];
  347. // Make sure to include only digits that are followed by ] or ) but not );
  348. elConvertGlobal(el, /\d+(?=[\)\]](?!;))/g);
  349. }
  350. // Page links:
  351. els = document.querySelectorAll('[width="20%"]>a');
  352. for (i = 0; i < els.length; i++) {
  353. el = els[i];
  354. elConvert(el, /\d+/);
  355. }
  356. // Individual topic page links
  357. els = document.querySelectorAll('.row4>span>a');
  358. for (i = 0; i < els.length; i++) {
  359. el = els[i];
  360. elConvert(el, /\d+/);
  361. }
  362. // els = document.querySelectorAll('.row2:nth-child(3)');
  363. // for (i = 0; i < els.length; i++)
  364. // elConvert(els[i], /.+/);
  365. // els = document.querySelectorAll('.row2:nth-child(4)');
  366. // for (i = 0; i < els.length; i++)
  367. // if (els[i].innerHTML != els[i].innerText)
  368. // break;
  369. // else
  370. // elConvert(els[i], /.+/);
  371. }
  372. else if (document.location.search.indexOf('showtopic=') != -1 || document.location.search.indexOf('act=ST') != -1) {
  373. // Topic Thread
  374. // Message posted date
  375. els = document.querySelectorAll('.row4>.postdetails');
  376. for (i = 0; i < els.length; i++) {
  377. el = els[i];
  378. elConvertDateTime(el, /\b[A-Za-z]{3} \d\d? \d{4}, \d\d:\d\d [AP]M/);
  379. }
  380. // Message author stats
  381. els = document.querySelectorAll('.post1>.postdetails, .post2>.postdetails');
  382. for (i = 0; i < els.length; i++) {
  383. el = els[i];
  384. var postCount = el.innerHTML.match(/Posts: [\d,]+/) + '';
  385. postCount = postCount.match(/[\d,]+/);
  386. postCount = 'Posts: ' + convert(postCount);
  387. el.innerHTML = el.innerHTML.replace(/Posts: [\d,]+/, postCount);
  388. var memberNum = el.innerHTML.match(/Member No\.: [\d,]+/) + '';
  389. memberNum = memberNum.match(/[\d,]+/);
  390. memberNum = 'Member No.: ' + convert(memberNum);
  391. el.innerHTML = el.innerHTML.replace(/Member No\.: [\d,]+/, memberNum);
  392. var joinedDate = el.innerHTML.match(/\d\d?-[A-Za-z]+ \d\d<br>/) + '';
  393. joinedDate = joinedDate.replace(' ', ' 20').replace('-', ' ');
  394. joinedDate = '<br>' + convertDateStacked(joinedDate);
  395. el.innerHTML = el.innerHTML.replace(/\d\d?-[A-Za-z]+ \d\d/, joinedDate);
  396. }
  397. // Multi-page breadcrumb:
  398. // Non-links: (total) [current]
  399. els = document.querySelectorAll('[width="20%"]');
  400. for (i = 0; i < els.length; i++) {
  401. el = els[i];
  402. // Make sure to include only digits that are followed by ] or ) but not );
  403. if (el.innerHTML.match(/\d+(?=[\)\]](?!;))/)) {
  404. elConvertGlobal(el, /\d+(?=[\)\]](?!;))/g);
  405. }
  406. }
  407. // Page links:
  408. els = document.querySelectorAll('[width="20%"]>a');
  409. console.log('2 els.length=' + els.length);
  410. for (i = 0; i < els.length; i++) {
  411. el = els[i];
  412. if (el.innerHTML.match(/Topic Options/)) {
  413. continue; // skip
  414. }
  415. if (el.innerHTML.match(/\d+/)) {
  416. elConvert(el, /\d+/);
  417. }
  418. }
  419. // Quote banners
  420. els = document.querySelectorAll('td:only-child:not([id])');
  421. for (i = 0; i < els.length; i++) {
  422. el = els[i];
  423. elConvertDateTime(el, /\b[A-Za-z]{3} \d\d? \d{4}, \d\d:\d\d [AP]M/);
  424. }
  425. // Survey
  426. els = document.querySelectorAll('.tablepad');
  427. if (els.length == 2) {
  428. // Votes
  429. els = document.querySelectorAll('.tablepad>*>*>*>.row1>b');
  430. var votes = new Array(els.length);
  431. for (i = 0; i < els.length; i++) {
  432. el = els[i];
  433. votes[i] = parseInt(el.innerHTML.match(/\d+/));
  434. elConvert(el, /\d+/);
  435. }
  436. // Total Votes
  437. el = document.querySelector('.tablepad>*>*>*>.row1:only-child');
  438. var totalVotes = parseInt(el.innerHTML.match(/\d+/));
  439. elConvert(el, /\d+/);
  440. if (totalVotes == 0)
  441. totalVotes = 1;
  442. els = document.querySelectorAll('.tablepad>*>*>*>.row1:last-child:not(:first-child)');
  443. for (i = 0; i < els.length; i++) {
  444. el = els[i];
  445. elCreateFract(el, /\d{1,3}\.\d\d%(?=])/, votes[i] / totalVotes, 2, true);
  446. }
  447. }
  448. // Active Users Strip
  449. el = document.querySelector('.activeuserstrip');
  450. elConvertGlobal(el, /\d+/g);
  451. // Where is this used?
  452. els = document.querySelectorAll('.edit');
  453. for (i = 0; i < els.length; i++) {
  454. el = els[i];
  455. elConvertDateTime(el, /\b[A-Za-z]{3} \d\d? \d{4}, \d\d:\d\d [AP]M/);
  456. }
  457. }
  458. else if (document.location.search.indexOf('act=Post') != -1 || document.title.substr(0, 28) == 'Dozensonline -> Replying in ') {
  459. // Editing a new reply or an existing post, with or without Quote
  460. els = document.querySelectorAll('td.row4:last-child');
  461. for (i = 0; i < els.length; i++) {
  462. el = els[i];
  463. elConvertDateTime(el, /\b[A-Za-z]{3} \d\d? \d{4}, \d\d:\d\d [AP]M/);
  464. }
  465. els = document.querySelectorAll('div.pformstrip');
  466. for (i = 0; i < els.length; i++) {
  467. if (els[i].innerHTML == 'Last 10 Posts [ In reverse order ]') {
  468. el = els[i];
  469. elConvert(el, /\d\d?/);
  470. break;
  471. }
  472. }
  473. // Quote banners
  474. els = document.querySelectorAll('td:only-child:not([id])');
  475. for (i = 0; i < els.length; i++) {
  476. el = els[i];
  477. elConvertDateTime(el, /\b[A-Za-z]{3} \d\d? \d{4}, \d\d:\d\d [AP]M/);
  478. }
  479. }
  480. else if (document.location.search.indexOf('showuser=') != -1) {
  481. // Viewing a user's profile
  482. els = document.querySelectorAll('.row1>b');
  483. // Total Cumulative Posts
  484. el = els[0];
  485. elConvert(els[0], /[\d,]+/);
  486. // Percentage of total forum posts
  487. el = el.parentNode;
  488. var percentagePosts = el.innerHTML.match(/\d{1,3}\.\d\d%/) + '';
  489. percentagePosts = parseFloat(percentagePosts) / 100;
  490. elCreateFract(el, /\d{1,3}\.\d\d%/, percentagePosts, 2, true);
  491. // Posts per day
  492. el = els[1];
  493. var postsPerDay = el.innerHTML.match(/\d+\.\d+/) + '';
  494. postsPerDay = parseFloat(postsPerDay);
  495. elCreateFract(el, /\d+\.\d+/, postsPerDay, 1, false);
  496. // Joined date
  497. el = els[2];
  498. var joinedDate = el.innerHTML.match(/\d\d?-[A-Za-z]+ \d\d/) + '';
  499. joinedDate = joinedDate.replace(' ', ' 20').replace('-', ' ');
  500. joinedDate = convertDate(joinedDate);
  501. el.innerHTML = el.innerHTML.replace(/\d\d?-[A-Za-z]+ \d\d/, joinedDate);
  502. els = document.querySelectorAll('.row1');
  503. // Last Activity
  504. el = els[3];
  505. elConvertDateTime(el, /\b[A-Za-z]{3} \d\d? \d{4}, \d\d:\d\d [AP]M/);
  506. // User's local time
  507. el = els[4];
  508. elConvertDateTime(el, /\b[A-Za-z]{3} \d\d? \d{4}, \d\d:\d\d [AP]M/);
  509. // Birthday
  510. el = els[12];
  511. elConvertDate(el, /\d\d? [A-Za-z]+ \d{4}/);
  512.  
  513. }
  514. else if (document.location.search.indexOf('act=Search') != -1) {
  515. // Find all topisc by this member
  516. // Replies/Views counts
  517. els = document.querySelectorAll('.row4:nth-child(6), .row2:nth-child(7)');
  518. for (i = 0; i < els.length; i++) {
  519. el = els[i];
  520. elConvertStacked(els[i], /.+/);
  521. }
  522. // Last Action date
  523. els = document.querySelectorAll('.row2:nth-child(8)');
  524. for (i = 0; i < els.length; i++) {
  525. el = els[i];
  526. elConvertDateTimeStacked(el, /\b[A-Za-z]{3} \d\d? \d{4}, \d\d:\d\d [AP]M/);
  527. }
  528. // Page links:
  529. els = document.querySelectorAll('a[title="Jump to page..."]');
  530. console.log('els.length=' + els.length);
  531. for (i = 0; i < els.length; i++) {
  532. el = els[i];
  533. console.log('els['+i+']=' + el.innerHTML);
  534. el = el.parentNode;
  535. // Make sure to include only digits that are followed by ] or ) but not );
  536. if (el.innerHTML.match(/\d+(?=[\)\]](?!;))/)) {
  537. elConvertGlobal(el, /\d+(?=[\)\]](?!;))/g);
  538. }
  539. // Page links:
  540. var links = el.querySelectorAll('a');
  541. for (var j = 0; j < links.length; j++) {
  542. var link = links[j];
  543. if (link.innerHTML.match(/Pages|Last/)) {
  544. continue; // skip
  545. }
  546. if (link.innerHTML.match(/\d+/)) {
  547. elConvert(link, /\d+/);
  548. }
  549. }
  550. }
  551. // Topic Page links:
  552. els = document.querySelectorAll('.row4>table>tbody>tr>td>span>a');
  553. for (i = 0; i < els.length; i++) {
  554. el = els[i];
  555. console.log('els['+i+']=' + el.innerHTML);
  556. elConvert(el, /\d+/);
  557. }
  558. }
  559. else if (document.location.search.indexOf('act=Msg') != -1) {
  560. // Private Message
  561. // Not sure it has anything to convert.
  562.  
  563. // els = document.querySelectorAll('.row1');
  564. // for (i = 0; i < els.length; i++)
  565. // elConvertFract(els[i], /\d{1,3}%/);
  566. // els = document.querySelectorAll('.dlight>td:nth-child(4)');
  567. // for (i = 0; i < els.length; i++) {
  568. // el = els[i];
  569. // elConvert(el, /\d\d?/);
  570. // elConvert(el, /\d{4}/);
  571. // if (tgmTime)
  572. // elConvertTime(el, /\d\d:\d\d [AP]M/);
  573. // }
  574. // elConvertGlobal(document.querySelector('i'), /\d+/g)
  575. }
  576. })();
  577. })();