hwm_mail_filter

HWM mod - Sortirovka i fil'tracija lichnyh soobshhenij

当前为 2014-07-09 提交的版本,查看 最新版本

  1. // ==UserScript==
  2. // @name hwm_mail_filter
  3. // @namespace Demin
  4. // @description HWM mod - Sortirovka i fil'tracija lichnyh soobshhenij
  5. // @homepage http://userscripts.org/scripts/show/486296
  6. // @version 1.1
  7. // @include http://*heroeswm.ru/sms.php*
  8. // @include http://178.248.235.15/sms.php*
  9. // @include http://209.200.152.144/sms.php*
  10. // @include http://*lordswm.com/sms.php*
  11. // ==/UserScript==
  12.  
  13. // (c) 2012, TheatreOfPain
  14.  
  15. (function() {
  16.  
  17. var version = '1.1';
  18.  
  19.  
  20. if (!this.GM_getValue || (this.GM_getValue.toString && this.GM_getValue.toString().indexOf("not supported")>-1)) {
  21. this.GM_getValue=function (key,def) {
  22. return localStorage[key] || def;
  23. };
  24. this.GM_setValue=function (key,value) {
  25. return localStorage[key]=value;
  26. };
  27. this.GM_deleteValue=function (key) {
  28. return delete localStorage[key];
  29. };
  30. }
  31.  
  32.  
  33. var script_num = 486296;
  34. var script_name = "HWM mod - Sortirovka i fil'tracija lichnyh soobshhenij";
  35. update_n(version,script_num,script_name);
  36.  
  37. var url_cur = location.href;
  38. var url = 'http://'+location.hostname+'/';
  39.  
  40.  
  41. const MESSAGE_ATTRIBUTES = 7;
  42. const SMS_ID = 0;
  43. const PLAYER_NAME = 1;
  44. const PLAYER_ID = 2;
  45. const DATE = 3;
  46. const FLAG = 4;
  47. const SUBJECT = 5;
  48. const IS_READ = 6;
  49.  
  50. const RECORD_SEP = '{|}';
  51. const ARRAY_SEP = '}||{';
  52.  
  53. const SORT_INACTIVE = 'black';
  54. const SORT_ACTIVE = 'blue';
  55. const SORT_ASC = '\u25B2';
  56. const SORT_DESC = '\u25BC';
  57.  
  58. const SORT_BY_PLAYER = 0;
  59. const SORT_BY_DATE = 1;
  60. const SORT_BY_SUBJECT = 2;
  61.  
  62. const SORT_FILTER_ID = 'sortFilter';
  63.  
  64. const INBOX_PAGE = 0;
  65. const OUTBOX_PAGE = 1;
  66.  
  67. var selectedPage; //inbox or outbox
  68. var messagesTable;
  69. var searchTable;
  70. var playerName;
  71. var serverName;
  72. var messages;
  73. var sortedMessages;
  74. var btnPlayer;
  75. var btnDate;
  76. var btnSubject;
  77. var currentSortType;
  78.  
  79. main();
  80.  
  81. function main() {
  82. selectedPage = getSelectedPage();
  83. playerName = getPlayerName();
  84. serverName = getServerName();
  85. loadMessages();
  86. messagesTable = getMessagesTable();
  87. searchTable = getSearchTable();
  88. processMessages();
  89. displaySortingButtons();
  90. }
  91.  
  92. function getSelectedPage(){
  93. if (location.href.indexOf('box=out') != -1) {
  94. return OUTBOX_PAGE;
  95. } else {
  96. return INBOX_PAGE;
  97. }
  98. }
  99.  
  100. function getPlayerName() {
  101. var all_params = document.getElementsByTagName('param');
  102. for (var i = 0; i < all_params.length; i++) {
  103. if (all_params[i].name == 'FlashVars') {
  104. return all_params[i].value.split('|')[3];
  105. }
  106. }
  107. }
  108.  
  109. function getServerName(){
  110. if (window.location.href.indexOf('lordswm.com') != -1) {
  111. return '.com';
  112. } else {
  113. return '.ru';
  114. }
  115. }
  116.  
  117. function getMessagesTable() {
  118. allTables = document.getElementsByTagName('tbody');
  119. for (var i = 0; i < allTables.length; i++) {
  120. if ( ( allTables[i].innerHTML.indexOf('Date')!=-1 && allTables[i].innerHTML.indexOf('Subject')!=-1 )
  121. || ( allTables[i].innerHTML.indexOf('\u0414\u0430\u0442\u0430')!=-1 && allTables[i].innerHTML.indexOf('\u0422\u0435\u043C\u0430')!=-1 ) ) {
  122. var table = allTables[i];
  123. }
  124. }
  125. return table;
  126. }
  127.  
  128. function getSearchTable() {
  129. allTables = document.getElementsByTagName('tbody');
  130. for (var i = 0; i < allTables.length; i++) {
  131. if ( ( allTables[i].innerHTML.indexOf('Inbox')!=-1 && allTables[i].innerHTML.indexOf('Outbox')!=-1 && allTables[i].innerHTML.indexOf('Clan mail')!=-1 )
  132. || ( allTables[i].innerHTML.indexOf('\u0412\u0445\u043E\u0434\u044F\u0449\u0438\u0435')!=-1 && allTables[i].innerHTML.indexOf('\u0418\u0441\u0445\u043E\u0434\u044F\u0449\u0438\u0435')!=-1 && allTables[i].innerHTML.indexOf('\u041A\u043B\u0430\u043D\u043E\u0432\u0430\u044F \u043F\u043E\u0447\u0442\u0430')!=-1 ) ) {
  133. var table = allTables[i];
  134. }
  135. }
  136. return table;
  137. }
  138.  
  139. function processMessages() {
  140. var allTRs = messagesTable.getElementsByTagName('tr');
  141. if (allTRs.length < 2) return;
  142. for (var i = 1; i < allTRs.length; i++) {
  143. allTDs = allTRs[i].getElementsByTagName('td');
  144. if (allTDs[0].colSpan > 1) {
  145. continue;
  146. }
  147.  
  148. var message = new Array(MESSAGE_ATTRIBUTES);
  149. // sender name and id
  150. message[PLAYER_NAME] = allTDs[0].textContent;
  151. var playerIDPattern = /pl_info.php\?id=(\d+)/;
  152. allTDs[0].innerHTML.match(playerIDPattern);
  153. message[PLAYER_ID] = RegExp.$1;
  154.  
  155. // sms id
  156. message[SMS_ID] = allTDs[1].firstChild.value;
  157.  
  158. // sms id
  159. message[DATE] = allTDs[2].textContent;
  160.  
  161. // message subject
  162. var subjectIndex;
  163. if (selectedPage == INBOX_PAGE){
  164. subjectIndex = 4;
  165. } else {
  166. subjectIndex = 3;
  167. }
  168. message[SUBJECT] = allTDs[subjectIndex].textContent.replace(/\[new\]/g,'').replace(/\[\u043D\u043E\u0432\u043E\u0435\]/g,'');
  169.  
  170. // flag and read indicator - inbox only
  171. if (selectedPage == INBOX_PAGE) {
  172. var flagPattern = /i\/sms_flag_imp\.gif/;
  173. var matched = allTDs[3].innerHTML.match(flagPattern);
  174. if (matched) {
  175. message[FLAG] = 1;
  176. } else {
  177. message[FLAG] = 0;
  178. }
  179. if ( allTDs[4].innerHTML.indexOf('[new]')!=-1 || allTDs[4].innerHTML.indexOf('[\u043D\u043E\u0432\u043E\u0435]')!=-1 ) {
  180. message[IS_READ] = 1;
  181. } else {
  182. message[IS_READ] = 0;
  183. }
  184. }
  185. if (isNewMessage(message)) {
  186. messages.push(message.join(RECORD_SEP));
  187. }
  188. }
  189. saveMessages();
  190. }
  191.  
  192. function displaySortingButtons(){
  193. var allTRs = messagesTable.getElementsByTagName('tr');
  194. if (allTRs.length < 2) return;
  195. var headerTR = allTRs[0];
  196. headerTDs = headerTR.getElementsByTagName('td');
  197. btnPlayer = document.createElement('input');
  198. btnPlayer.type = 'button';
  199. btnPlayer.addEventListener('click', sortByPlayer, false);
  200. btnPlayer.setAttribute('value', SORT_ASC);
  201. btnPlayer.style.color = SORT_INACTIVE;
  202. btnPlayer.style.fontStyle = 'bold';
  203. btnPlayer.style.fontSize = '12px';
  204. headerTDs[0].appendChild(document.createTextNode(' '));
  205. headerTDs[0].appendChild(btnPlayer);
  206.  
  207. btnDate = document.createElement('input');
  208. btnDate.type = 'button';
  209. btnDate.addEventListener('click', sortByDate, false);
  210. btnDate.setAttribute('value', SORT_ASC);
  211. btnDate.style.color = SORT_INACTIVE;
  212. btnDate.style.fontStyle = 'bold';
  213. btnDate.style.fontSize = '12px';
  214. headerTDs[2].appendChild(document.createTextNode(' '));
  215. headerTDs[2].appendChild(btnDate);
  216.  
  217. btnSubject = document.createElement('input');
  218. btnSubject.type = 'button';
  219. btnSubject.addEventListener('click', sortBySubject, false);
  220. btnSubject.setAttribute('value', SORT_ASC);
  221. btnSubject.style.color = SORT_INACTIVE;
  222. btnSubject.style.fontStyle = 'bold';
  223. btnSubject.style.fontSize = '12px';
  224. if (selectedPage == INBOX_PAGE) {
  225. headerTDs[4].appendChild(document.createTextNode(' '));
  226. headerTDs[4].appendChild(btnSubject);
  227. } else {
  228. headerTDs[3].appendChild(document.createTextNode(' '));
  229. headerTDs[3].appendChild(btnSubject);
  230. }
  231. }
  232.  
  233. function isNewMessage(newMessage){
  234. var l = messages.length;
  235. for (var z = 0; z<l; z++) {
  236. var tempMessage = messages[z].split(RECORD_SEP);
  237. if (tempMessage[SMS_ID] == newMessage[SMS_ID]) {
  238. messages[z] = newMessage.join(RECORD_SEP);
  239. return false;
  240. }
  241. }
  242. return true;
  243. }
  244.  
  245. function saveMessages(){
  246. var messagesKey = playerName + serverName;
  247. if (selectedPage == INBOX_PAGE) {
  248. messagesKey += ' inboxMessages';
  249. } else {
  250. messagesKey += ' outboxMessages';
  251. }
  252. messages.sort();
  253. messages.reverse();
  254. GM_setValue(messagesKey, messages.join(ARRAY_SEP).toString());
  255. }
  256.  
  257. function loadMessages(){
  258. var messagesKey = playerName + serverName;
  259. if (selectedPage == INBOX_PAGE) {
  260. messagesKey += ' inboxMessages';
  261. } else {
  262. messagesKey += ' outboxMessages';
  263. }
  264. var messagesData = GM_getValue(messagesKey, 0);
  265. if (messagesData != 0) {
  266. messages = messagesData.split(ARRAY_SEP);
  267. } else {
  268. messages = new Array();
  269. }
  270. }
  271.  
  272. function sortByPlayer(){
  273. resetSort(btnDate);
  274. resetSort(btnSubject);
  275. sortingStyle(btnPlayer);
  276. sortMessages(SORT_BY_PLAYER, this.value);
  277. }
  278.  
  279. function sortByDate(){
  280. resetSort(btnPlayer);
  281. resetSort(btnSubject);
  282. sortingStyle(btnDate);
  283. sortMessages(SORT_BY_DATE, this.value);
  284. }
  285.  
  286. function sortBySubject(){
  287. resetSort(btnPlayer);
  288. resetSort(btnDate);
  289. sortingStyle(btnSubject);
  290. sortMessages(SORT_BY_SUBJECT, this.value);
  291. }
  292.  
  293. function resetSort(btn){
  294. btn.style.color = SORT_INACTIVE;
  295. btn.setAttribute('value', SORT_ASC);
  296. }
  297.  
  298. function sortingStyle(btn){
  299. if (btn.style.color == SORT_INACTIVE) {
  300. btn.style.color = SORT_ACTIVE;
  301. } else {
  302. if (btn.value == SORT_ASC) {
  303. btn.setAttribute('value', SORT_DESC);
  304. } else {
  305. btn.setAttribute('value', SORT_ASC);
  306. }
  307. }
  308. }
  309.  
  310. function sortMessages(byType, sortingMode){
  311. prepareSortedMessages(messages, byType, sortingMode);
  312. displayMessages(sortedMessages);
  313. displaySortFilter();
  314. }
  315.  
  316. function prepareSortedMessages(unSortedMessages, byType, sortingMode){
  317. var sortKeys = new Array();
  318. currentSortType = byType;
  319. var len = unSortedMessages.length;
  320. if (len == 0) return;
  321. switch (byType) {
  322. case SORT_BY_PLAYER:
  323. for (var i = 0; i<len; i++) {
  324. var tempMessage = unSortedMessages[i].split(RECORD_SEP);
  325. sortKeys.push(tempMessage[PLAYER_NAME].toUpperCase() + RECORD_SEP + tempMessage[SMS_ID]);
  326. }
  327. break;
  328. case SORT_BY_DATE:
  329. for (var i = 0; i<len; i++) {
  330. var tempMessage = unSortedMessages[i].split(RECORD_SEP);
  331. sortKeys.push(tempMessage[SMS_ID] + RECORD_SEP + tempMessage[SMS_ID]);
  332. }
  333. break;
  334. case SORT_BY_SUBJECT:
  335. for (var i = 0; i<len; i++) {
  336. var tempMessage = unSortedMessages[i].split(RECORD_SEP);
  337. sortKeys.push(tempMessage[SUBJECT].toUpperCase() + RECORD_SEP + tempMessage[SMS_ID]);
  338. }
  339. }
  340.  
  341. sortKeys.sort();
  342. if (sortingMode == SORT_DESC) {
  343. sortKeys.reverse();
  344. }
  345. sortedMessages = new Array();
  346. for (var i = 0; i<len; i++) {
  347. var splitKeys = sortKeys[i].split(RECORD_SEP);
  348. var smsID = splitKeys[1];
  349. for (var j = 0; j<len; j++) {
  350. var message = unSortedMessages[j].split(RECORD_SEP);
  351. if (message[SMS_ID] == smsID) {
  352. sortedMessages.push(unSortedMessages[j]);
  353. break;
  354. }
  355. }
  356. }
  357. return sortedMessages;
  358. }
  359.  
  360. function displayMessages(messages){
  361. var allTRs = messagesTable.getElementsByTagName('tr');
  362. if (allTRs.length < 2) return;
  363. for (var i = allTRs.length - 1; i > 0; i--) {
  364. allTDs = allTRs[i].getElementsByTagName('td');
  365. if (allTDs[0].colSpan > 1) {
  366. continue;
  367. }
  368. allTRs[i].parentNode.removeChild(allTRs[i]);
  369. }
  370.  
  371. var referenceTR = allTRs[0]; // insert new TRs after header
  372. var trClass1 = 'wblight';
  373. var trClass2 = 'wblight2';
  374. var len = messages.length;
  375. for (var i = 0; i<len; i++) {
  376. var tempMessage = messages[i].split(RECORD_SEP);
  377. var TR = document.createElement('tr');
  378. TR.className = (i%2 == 0)?trClass1:trClass2;
  379. var playerTD = document.createElement('td');
  380. playerTD.align = 'left';
  381. playerTD.innerHTML = '<a name="hwm_hero" style="text-decoration:none;" href="pl_info.php?id=' + tempMessage[PLAYER_ID]
  382. + '"><b>' + tempMessage[PLAYER_NAME] + '</b></a>';
  383. TR.appendChild(playerTD);
  384. var inputTD = document.createElement('td');
  385. TR.appendChild(inputTD);
  386. var dateTD = document.createElement('td');
  387. dateTD.align = 'left';
  388. dateTD.innerHTML = '<font style="font-size:9px">&nbsp;' + tempMessage[DATE] + '&nbsp;</font>';
  389. TR.appendChild(dateTD);
  390.  
  391. if (selectedPage == INBOX_PAGE) {
  392. var flagged = '';
  393. if (tempMessage[FLAG] == 1) flagged = '_imp';
  394. var flagTD = document.createElement('td');
  395. flagTD.align = 'center';
  396. flagTD.innerHTML = '<a href="sms.php?action=mark&amp;id=' + tempMessage[SMS_ID] + '"><img src="i/sms_flag'
  397. + flagged + '.gif" title="Flag" height="16" border="0" width="16"></a>';
  398. TR.appendChild(flagTD);
  399. }
  400. var read = '';
  401. if (tempMessage[IS_READ] == 1) { if ( location.hostname.match('lordswm') ) read = '<font color="#5ACE5A"><b>[new]</b></font>'; else read = '<font color="#5ACE5A"><b>[\u043D\u043E\u0432\u043E\u0435]</b></font>'; }
  402. var subjectTD = document.createElement('td');
  403. subjectTD.align = 'left';
  404. var smsTitle = '<a href="sms.php?sms_id=' + tempMessage[SMS_ID];
  405. if (selectedPage == OUTBOX_PAGE) {
  406. smsTitle += '&box=out';
  407. }
  408. smsTitle += '">' + read + tempMessage[SUBJECT] + '</a>';
  409. subjectTD.innerHTML = smsTitle;
  410. TR.appendChild(subjectTD);
  411.  
  412. referenceTR.parentNode.insertBefore(TR, referenceTR.nextSibling);
  413. referenceTR = TR; // to insert after the new added TR
  414. }
  415. }
  416.  
  417. function displaySortFilter(){
  418. if (document.getElementById(SORT_FILTER_ID)) {
  419. return;
  420. }
  421. var TR = document.createElement('tr');
  422. var TD = document.createElement('td');
  423. TD.colSpan = 2;
  424. TR.appendChild(TD);
  425. searchTable.appendChild(TR);
  426. searchTable.appendChild(TR);
  427. searchTable.appendChild(TR);
  428. searchTable.appendChild(TR);
  429. searchTable.appendChild(TR);
  430.  
  431. TR = document.createElement('tr');
  432. TD = document.createElement('td');
  433. TD.colSpan = 2;
  434. if ( location.hostname.match('lordswm') ) var filterLabel = document.createTextNode('Filter messages'); else var filterLabel = document.createTextNode('\u0424\u0438\u043B\u044C\u0442\u0440 \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u0439');
  435. TD.appendChild(filterLabel);
  436. TR.appendChild(TD);
  437. searchTable.appendChild(TR);
  438.  
  439. TR = document.createElement('tr');
  440. TD = document.createElement('td');
  441. TD.colSpan = 2;
  442. var filterTextField = document.createElement('input');
  443. filterTextField.id = SORT_FILTER_ID;
  444. filterTextField.type = 'input';
  445. filterTextField.style.width = 165;
  446. filterTextField.addEventListener('keyup', keyPressed, false);
  447. TD.appendChild(filterTextField);
  448. TR.appendChild(TD);
  449. searchTable.appendChild(TR);
  450. }
  451.  
  452. function keyPressed(){
  453. filterResults();
  454. }
  455.  
  456. function filterResults(){
  457. var filter = document.getElementById(SORT_FILTER_ID).value.toLowerCase();
  458. if (filter.length == 0) {
  459. displayMessages(sortedMessages);
  460. return;
  461. }
  462. var sortedColumn;
  463. switch (currentSortType) {
  464. case SORT_BY_PLAYER:
  465. sortedColumn = PLAYER_NAME;
  466. break;
  467. case SORT_BY_DATE:
  468. sortedColumn = DATE;
  469. break;
  470. case SORT_BY_SUBJECT:
  471. sortedColumn = SUBJECT;
  472. }
  473. var filteredMessages = new Array();
  474. var len = sortedMessages.length;
  475. for (var i = 0; i<len; i++) {
  476. var tempMessage = sortedMessages[i].split(RECORD_SEP);
  477. var matched = tempMessage[sortedColumn].toLowerCase().match(filter);
  478. if (matched) filteredMessages.push(sortedMessages[i]);
  479. }
  480. messages = filteredMessages;
  481. displayMessages(filteredMessages);
  482. }
  483.  
  484. function $(id) { return document.querySelector("#"+id); }
  485.  
  486. function addEvent(elem, evType, fn) {
  487. if (elem.addEventListener) {
  488. elem.addEventListener(evType, fn, false);
  489. }
  490. else if (elem.attachEvent) {
  491. elem.attachEvent("on" + evType, fn);
  492. }
  493. else {
  494. elem["on" + evType] = fn;
  495. }
  496. }
  497.  
  498. function update_n(a,b,c,d,e){if(e){e++}else{e=1;d=(Number(GM_getValue('last_update_script','0'))||0)}if(e>3){return}var f=new Date().getTime();var g=$('update_demin_script');if(g){if((d+86400000<f)||(d>f)){g=g.innerHTML;if(/100000=1.1/.exec(g)){var h=new RegExp(b+'=(\\d+\\.\\d+)').exec(g);if(a&&h){if(Number(h[1])>Number(a))setTimeout(function(){if(confirm('\u0414\u043E\u0441\u0442\u0443\u043F\u043D\u043E \u043E\u0431\u043D\u043E\u0432\u043B\u0435\u043D\u0438\u0435 \u0441\u043A\u0440\u0438\u043F\u0442\u0430: "'+c+'".\n\u0423\u0441\u0442\u0430\u043D\u043E\u0432\u0438\u0442\u044C \u043E\u0431\u043D\u043E\u0432\u043B\u0435\u043D\u043D\u0443\u044E \u0432\u0435\u0440\u0441\u0438\u044E \u0441\u0435\u0439\u0447\u0430\u0441?\n\nThere is an update available for the script: "'+c+'".\nWould you like install the script now?')){if(typeof GM_openInTab=='function'){GM_openInTab('http://userscripts.org/scripts/show/'+b)}else{window.open('http://userscripts.org/scripts/show/'+b,'_blank')}window.location='http://userscripts.org/scripts/source/'+b+'.user.js'}},500)}GM_setValue('last_update_script',''+f)}else{setTimeout(function(){update_n(a,b,c,d,e)},1000)}}}else{var i=document.querySelector('body');if(i){var j=GM_getValue('array_update_script');if(e==1&&((d+86400000<f)||(d>f)||!j)){if(j){GM_deleteValue('array_update_script')}setTimeout(function(){update_n(a,b,c,d,e)},1000);return}var k=document.createElement('div');k.id='update_demin_script';k.setAttribute('style','position: absolute; width: 0px; height: 0px; top: 0px; left: 0px; display: none;');k.innerHTML='';i.appendChild(k);if((d+86400000<f)||(d>f)||!j){var l=new XMLHttpRequest();l.open('GET','photo_pl_photos.php?aid=1777'+'&rand='+(Math.random()*100),true);l.onreadystatechange=function(){update(l,a,b,c,d,e)};l.send(null)}else{$('update_demin_script').innerHTML=j;setTimeout(function(){update_n(a,b,c,d,e)},10)}}}}function update(a,b,c,d,e,f){if(a.readyState==4&&a.status==200){a=a.responseText;var g=/(\d+=\d+\.\d+)/g;var h='';var i;while((i=g.exec(a))!=null){if(h.indexOf(i[1])==-1){h+=i[1]+' '}};GM_setValue('array_update_script',''+h);var j=$('update_demin_script');if(j){j.innerHTML=h;setTimeout(function(){update_n(b,c,d,e,f)},10)}}}
  499.  
  500. })();