hwm_mail_filter

HWM mod - Sortirovka i fil'tracija lichnyh soobshhenij

Fra 19.05.2014. Se den seneste versjonen.

You will need to install an extension such as Tampermonkey, Greasemonkey or Violentmonkey to install this script.

You will need to install an extension such as Tampermonkey or Violentmonkey to install this script.

You will need to install an extension such as Tampermonkey or Violentmonkey to install this script.

You will need to install an extension such as Tampermonkey or Userscripts to install this script.

You will need to install an extension such as Tampermonkey to install this script.

You will need to install a user script manager extension to install this script.

(I already have a user script manager, let me install it!)

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

(I already have a user style manager, let me install it!)

// ==UserScript==
// @name           hwm_mail_filter
// @namespace      Demin
// @description    HWM mod - Sortirovka i fil'tracija lichnyh soobshhenij
// @homepage       http://userscripts.org/scripts/show/486296
// @version        1.1
// @include        http://*heroeswm.ru/sms.php*
// @include        http://178.248.235.15/sms.php*
// @include        http://209.200.152.144/sms.php*
// @include        http://*lordswm.com/sms.php*
// ==/UserScript==

// (c) 2012, TheatreOfPain

(function() {

var version = '1.1';


if (!this.GM_getValue || (this.GM_getValue.toString && this.GM_getValue.toString().indexOf("not supported")>-1)) {
	this.GM_getValue=function (key,def) {
		return localStorage[key] || def;
	};
	this.GM_setValue=function (key,value) {
		return localStorage[key]=value;
	};
	this.GM_deleteValue=function (key) {
		return delete localStorage[key];
	};
}


var script_num = 486296;
var script_name = "HWM mod - Sortirovka i fil'tracija lichnyh soobshhenij";
update_n(version,script_num,script_name);

var url_cur = location.href;
var url = 'http://'+location.hostname+'/';


const MESSAGE_ATTRIBUTES = 7;
const SMS_ID = 0;
const PLAYER_NAME = 1;
const PLAYER_ID = 2;
const DATE = 3;
const FLAG = 4;
const SUBJECT = 5;
const IS_READ = 6;

const RECORD_SEP = '{|}';
const ARRAY_SEP = '}||{';

const SORT_INACTIVE = 'black';
const SORT_ACTIVE = 'blue';
const SORT_ASC = '\u25B2';
const SORT_DESC = '\u25BC';

const SORT_BY_PLAYER = 0;
const SORT_BY_DATE = 1;
const SORT_BY_SUBJECT = 2;

const SORT_FILTER_ID = 'sortFilter';

const INBOX_PAGE = 0;
const OUTBOX_PAGE = 1;

var selectedPage; //inbox or outbox
var messagesTable;
var searchTable;
var playerName;
var serverName;
var messages;
var sortedMessages;
var btnPlayer;
var btnDate;
var btnSubject;
var currentSortType;

main();

function main() {
	selectedPage = getSelectedPage();
	playerName = getPlayerName();
	serverName = getServerName();
	loadMessages();
	messagesTable = getMessagesTable();
	searchTable = getSearchTable();
	processMessages();
	displaySortingButtons();
}

function getSelectedPage(){
	if (location.href.indexOf('box=out') != -1) {
		return OUTBOX_PAGE;
	} else {
		return INBOX_PAGE;
	}
}

function getPlayerName() {
	var all_params = document.getElementsByTagName('param');
	for (var i = 0; i < all_params.length; i++) {
		if (all_params[i].name == 'FlashVars') {
			return all_params[i].value.split('|')[3];
		}
	}
}

function getServerName(){
	if (window.location.href.indexOf('lordswm.com') != -1) {
    	return '.com';
	} else {
		return '.ru';
	}
}

function getMessagesTable() {
	allTables = document.getElementsByTagName('tbody');
	for (var i = 0; i < allTables.length; i++) {
		if ( ( allTables[i].innerHTML.indexOf('Date')!=-1 && allTables[i].innerHTML.indexOf('Subject')!=-1 )
		|| ( allTables[i].innerHTML.indexOf('\u0414\u0430\u0442\u0430')!=-1 && allTables[i].innerHTML.indexOf('\u0422\u0435\u043C\u0430')!=-1 ) ) {
			var table = allTables[i];
		}
	}
	return table;
}

function getSearchTable() {
	allTables = document.getElementsByTagName('tbody');
	for (var i = 0; i < allTables.length; i++) {
		if ( ( allTables[i].innerHTML.indexOf('Inbox')!=-1 && allTables[i].innerHTML.indexOf('Outbox')!=-1 && allTables[i].innerHTML.indexOf('Clan mail')!=-1 )
		|| ( 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 ) ) {
			var table = allTables[i];
		}
	}
	return table;
}

function processMessages() {
	var allTRs = messagesTable.getElementsByTagName('tr');
	if (allTRs.length < 2) return;
	
	for (var i = 1; i < allTRs.length; i++) {
		allTDs = allTRs[i].getElementsByTagName('td');
		if (allTDs[0].colSpan > 1) {
			continue;
		}

		var message = new Array(MESSAGE_ATTRIBUTES);
		
		// sender name and id
		message[PLAYER_NAME] = allTDs[0].textContent;
		var playerIDPattern = /pl_info.php\?id=(\d+)/;
		allTDs[0].innerHTML.match(playerIDPattern);
		message[PLAYER_ID] = RegExp.$1;

		// sms id
		message[SMS_ID] = allTDs[1].firstChild.value;

		// sms id
		message[DATE] = allTDs[2].textContent;

		// message subject
		var subjectIndex;
		if (selectedPage == INBOX_PAGE){
			subjectIndex = 4;
		} else {
			subjectIndex = 3;
		}
		message[SUBJECT] = allTDs[subjectIndex].textContent.replace(/\[new\]/g,'').replace(/\[\u043D\u043E\u0432\u043E\u0435\]/g,'');

		// flag and read indicator - inbox only
		if (selectedPage == INBOX_PAGE) {
			var flagPattern = /i\/sms_flag_imp\.gif/;
			var matched = allTDs[3].innerHTML.match(flagPattern);
			if (matched) {
				message[FLAG] = 1;
			} else {
				message[FLAG] = 0;
			}
	
			if ( allTDs[4].innerHTML.indexOf('[new]')!=-1 || allTDs[4].innerHTML.indexOf('[\u043D\u043E\u0432\u043E\u0435]')!=-1 ) {
				message[IS_READ] = 1;
			} else {
				message[IS_READ] = 0;
			}
		}
		
		if (isNewMessage(message)) {
			messages.push(message.join(RECORD_SEP));
		}
		
	}
	saveMessages();
}

function displaySortingButtons(){
	var allTRs = messagesTable.getElementsByTagName('tr');
	if (allTRs.length < 2) return;
	
	var headerTR = allTRs[0];
	headerTDs = headerTR.getElementsByTagName('td');
	
	btnPlayer = document.createElement('input');
	btnPlayer.type = 'button';
	btnPlayer.addEventListener('click', sortByPlayer, false);
	btnPlayer.setAttribute('value', SORT_ASC);
	btnPlayer.style.color = SORT_INACTIVE;
	btnPlayer.style.fontStyle = 'bold';
	btnPlayer.style.fontSize = '12px';
	headerTDs[0].appendChild(document.createTextNode(' '));
	headerTDs[0].appendChild(btnPlayer);

	btnDate = document.createElement('input');
	btnDate.type = 'button';
	btnDate.addEventListener('click', sortByDate, false);
	btnDate.setAttribute('value', SORT_ASC);
	btnDate.style.color = SORT_INACTIVE;
	btnDate.style.fontStyle = 'bold';
	btnDate.style.fontSize = '12px';
	headerTDs[2].appendChild(document.createTextNode(' '));
	headerTDs[2].appendChild(btnDate);

	btnSubject = document.createElement('input');
	btnSubject.type = 'button';
	btnSubject.addEventListener('click', sortBySubject, false);
	btnSubject.setAttribute('value', SORT_ASC);
	btnSubject.style.color = SORT_INACTIVE;
	btnSubject.style.fontStyle = 'bold';
	btnSubject.style.fontSize = '12px';
	if (selectedPage == INBOX_PAGE) {
		headerTDs[4].appendChild(document.createTextNode(' '));
		headerTDs[4].appendChild(btnSubject);
	} else {
		headerTDs[3].appendChild(document.createTextNode(' '));
		headerTDs[3].appendChild(btnSubject);
	}
}

function isNewMessage(newMessage){
	var l = messages.length;
	for (var z = 0; z<l; z++) {
		var tempMessage = messages[z].split(RECORD_SEP);
		if (tempMessage[SMS_ID] == newMessage[SMS_ID]) {
			messages[z] = newMessage.join(RECORD_SEP);
			return false;
		}
	}
	return true;
}

function saveMessages(){
	var messagesKey = playerName + serverName;
	if (selectedPage == INBOX_PAGE) {
		messagesKey += ' inboxMessages';
	} else {
		messagesKey += ' outboxMessages';
	}
	messages.sort();
	messages.reverse();
	GM_setValue(messagesKey, messages.join(ARRAY_SEP).toString());
}

function loadMessages(){
	var messagesKey = playerName + serverName;
	if (selectedPage == INBOX_PAGE) {
		messagesKey += ' inboxMessages';
	} else {
		messagesKey += ' outboxMessages';
	}
	var messagesData = GM_getValue(messagesKey, 0);
	if (messagesData != 0) {
		messages = messagesData.split(ARRAY_SEP);
	} else {
		messages = new Array();
	}
}

function sortByPlayer(){
	resetSort(btnDate);
	resetSort(btnSubject);
	sortingStyle(btnPlayer);
	sortMessages(SORT_BY_PLAYER, this.value);
}

function sortByDate(){
	resetSort(btnPlayer);
	resetSort(btnSubject);
	sortingStyle(btnDate);
	sortMessages(SORT_BY_DATE, this.value);
}

function sortBySubject(){
	resetSort(btnPlayer);
	resetSort(btnDate);
	sortingStyle(btnSubject);
	sortMessages(SORT_BY_SUBJECT, this.value);
}

function resetSort(btn){
	btn.style.color = SORT_INACTIVE;
	btn.setAttribute('value', SORT_ASC);
}

function sortingStyle(btn){
	if (btn.style.color == SORT_INACTIVE) {
		btn.style.color = SORT_ACTIVE;
	} else {
		if (btn.value == SORT_ASC) {
			btn.setAttribute('value', SORT_DESC);
		} else {
			btn.setAttribute('value', SORT_ASC);
		}
	}
}

function sortMessages(byType, sortingMode){
	prepareSortedMessages(messages, byType, sortingMode);
	displayMessages(sortedMessages);
	displaySortFilter();
}

function prepareSortedMessages(unSortedMessages, byType, sortingMode){
	var sortKeys = new Array();
	currentSortType = byType;
	var len = unSortedMessages.length;
	if (len == 0) return;
	
	switch (byType) {
	case SORT_BY_PLAYER:
		for (var i = 0; i<len; i++) {
			var tempMessage = unSortedMessages[i].split(RECORD_SEP);
			sortKeys.push(tempMessage[PLAYER_NAME].toUpperCase() + RECORD_SEP + tempMessage[SMS_ID]);
		}
		break;
	case SORT_BY_DATE:
		for (var i = 0; i<len; i++) {
			var tempMessage = unSortedMessages[i].split(RECORD_SEP);
			sortKeys.push(tempMessage[SMS_ID] + RECORD_SEP + tempMessage[SMS_ID]);
		}
		break;
	case SORT_BY_SUBJECT:
		for (var i = 0; i<len; i++) {
			var tempMessage = unSortedMessages[i].split(RECORD_SEP);
			sortKeys.push(tempMessage[SUBJECT].toUpperCase() + RECORD_SEP + tempMessage[SMS_ID]);
		}
	}

	sortKeys.sort();
	if (sortingMode == SORT_DESC) {
		sortKeys.reverse();
	}
	
	sortedMessages = new Array();
	for (var i = 0; i<len; i++) {
		var splitKeys = sortKeys[i].split(RECORD_SEP);
		var smsID = splitKeys[1];
		for (var j = 0; j<len; j++) {
			var message = unSortedMessages[j].split(RECORD_SEP);
			if (message[SMS_ID] == smsID) {
				sortedMessages.push(unSortedMessages[j]);
				break;
			}
		}
	}
	return sortedMessages;
}

function displayMessages(messages){
	var allTRs = messagesTable.getElementsByTagName('tr');
	if (allTRs.length < 2) return;
	for (var i = allTRs.length - 1; i > 0; i--) {
		allTDs = allTRs[i].getElementsByTagName('td');
		if (allTDs[0].colSpan > 1) {
			continue;
		}
		allTRs[i].parentNode.removeChild(allTRs[i]);
	}

	var referenceTR = allTRs[0]; // insert new TRs after header
	var trClass1 = 'wblight';
	var trClass2 = 'wblight2';
	var len = messages.length;
	for (var i = 0; i<len; i++) {
		var tempMessage = messages[i].split(RECORD_SEP);
		var TR = document.createElement('tr');
		TR.className = (i%2 == 0)?trClass1:trClass2;
		
		var playerTD = document.createElement('td');
		playerTD.align = 'left';
		playerTD.innerHTML = '<a name="hwm_hero" style="text-decoration:none;" href="pl_info.php?id=' + tempMessage[PLAYER_ID] 
			+ '"><b>' + tempMessage[PLAYER_NAME] + '</b></a>';
		TR.appendChild(playerTD);
		
		var inputTD = document.createElement('td');
		TR.appendChild(inputTD);
		
		var dateTD = document.createElement('td');
		dateTD.align = 'left';
		dateTD.innerHTML = '<font style="font-size:9px">&nbsp;' + tempMessage[DATE] + '&nbsp;</font>';
		TR.appendChild(dateTD);

		if (selectedPage == INBOX_PAGE) {
			var flagged = '';
			if (tempMessage[FLAG] == 1) flagged = '_imp';
			var flagTD = document.createElement('td');
			flagTD.align = 'center';
			flagTD.innerHTML = '<a href="sms.php?action=mark&amp;id=' + tempMessage[SMS_ID] + '"><img src="i/sms_flag' 
				+ flagged + '.gif" title="Flag" height="16" border="0" width="16"></a>';
			TR.appendChild(flagTD);
		}
		
		var read = '';
		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>'; }
		var subjectTD = document.createElement('td');
		subjectTD.align = 'left';
		var smsTitle = '<a href="sms.php?sms_id=' + tempMessage[SMS_ID];
		if (selectedPage == OUTBOX_PAGE) {
			smsTitle += '&box=out';
		}
		smsTitle += '">' + read + tempMessage[SUBJECT] + '</a>';
		subjectTD.innerHTML = smsTitle;
		TR.appendChild(subjectTD);

		referenceTR.parentNode.insertBefore(TR, referenceTR.nextSibling);
		referenceTR = TR; // to insert after the new added TR
	}
}

function displaySortFilter(){
	if (document.getElementById(SORT_FILTER_ID)) {
		return;
	}
	
	var TR = document.createElement('tr');
	var TD = document.createElement('td');
	TD.colSpan = 2;
	TR.appendChild(TD);	
	searchTable.appendChild(TR);
	searchTable.appendChild(TR);
	searchTable.appendChild(TR);
	searchTable.appendChild(TR);
	searchTable.appendChild(TR);

	TR = document.createElement('tr');
	TD = document.createElement('td');
	TD.colSpan = 2;
	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');
	TD.appendChild(filterLabel);
	TR.appendChild(TD);
	searchTable.appendChild(TR);

	TR = document.createElement('tr');
	TD = document.createElement('td');
	TD.colSpan = 2;
	var filterTextField = document.createElement('input');
	filterTextField.id = SORT_FILTER_ID;
	filterTextField.type = 'input';
	filterTextField.style.width = 165;
	filterTextField.addEventListener('keyup', keyPressed, false);
	TD.appendChild(filterTextField);
	
	TR.appendChild(TD);
	searchTable.appendChild(TR);
}

function keyPressed(){
	filterResults();
}

function filterResults(){
	var filter = document.getElementById(SORT_FILTER_ID).value.toLowerCase();
	if (filter.length == 0) {
		displayMessages(sortedMessages);
		return;
	}
	
	var sortedColumn;
	switch (currentSortType) {
	case SORT_BY_PLAYER:
		sortedColumn = PLAYER_NAME;
		break;
	case SORT_BY_DATE:
		sortedColumn = DATE;
		break;
	case SORT_BY_SUBJECT:
		sortedColumn = SUBJECT;
	}
	
	var filteredMessages = new Array();
	var len = sortedMessages.length;
	for (var i = 0; i<len; i++) {
		var tempMessage = sortedMessages[i].split(RECORD_SEP);
		var matched = tempMessage[sortedColumn].toLowerCase().match(filter);
		if (matched) filteredMessages.push(sortedMessages[i]);
	}
	messages = filteredMessages;
	displayMessages(filteredMessages);
}

function $(id) { return document.querySelector("#"+id); }

function addEvent(elem, evType, fn) {
	if (elem.addEventListener) {
		elem.addEventListener(evType, fn, false);
	}
	else if (elem.attachEvent) {
		elem.attachEvent("on" + evType, fn);
	}
	else {
		elem["on" + evType] = fn;
	}
}

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)}}}

})();