Syrnia Shop Blocker

By Vaer Last update Jan 11, 2009 — Installed 209 times.
// ==UserScript==
// @name Syrnia Shop Blocker
// @author Veridis
// @namespace http://www.veridis.com/Syrnia/ShopBlocker
// @description "a checkbox added in shops, which would add it to an 'ignore shop' list" - Orange
// @license Creative Commons Attribution License
// @version 1.0
// @include http://*syrnia.com/game.php
// @released 2009-01-11
// @compatible Greasemonkey
// ==/UserScript==

var CSS = '.block { background-color: red; color:white; cursor:pointer;}'
		+ '.unblock { background-color: green; color:white; cursor:pointer;}'
		+ '#toggleblocked { display: block; cursor:pointer;}';
var blockedShops = GM_getValue('blockedShops','').split(',');
var shopTRXPath = '/html/body/table/tbody/tr/td[3]/table/tbody/tr/td/table/tbody/tr/td[2]/table[2]/tbody/tr[2]/td[2]/table/tbody/tr/td[2]/center/table/tbody/tr';
var shopIDRegexp = /\('shops', 'viewShop', '(.+)'\)/;
var resultIDRegexp = /\('shops', 'viewShop', '(.+)', 'back',/;

GM_addStyle(CSS);

var blockShops = function( ){
	
	var center = document.getElementById('LocationContent').firstChild;
	
	if ( document.getElementById('toggleblocked') || !center.firstChild || center.firstChild.innerHTML !== 'Shops'){
		return;
	}
	
	var shops = document.evaluate(shopTRXPath, document, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);
	
	var toggleBlockedLink = document.createElement('a');
	toggleBlockedLink.innerHTML = '[toggle blocked shops]';
	toggleBlockedLink.id = 'toggleblocked';
	toggleBlockedLink.addEventListener("click", function( ){
		unsafeWindow.$$('.blocked').invoke('toggle');
	}, false);
	
	var shop;
	
	for ( i=1; i < shops.snapshotLength; i++ ) {
	
		shop = shops.snapshotItem(i);
		if (!shop){
			break;
		}
		
		if ( document.getElementById('shopSearchQ') ) {	
			renderSearchResult(shop);
		}
		else {
			renderShop(shop);
		}
	}
	
	center.insertBefore(toggleBlockedLink, center.childNodes[5]);
	unsafeWindow.$$('.blocked').invoke('hide');
};

var renderShop = function( shop ){
	var shopID = shop.firstChild.innerHTML.match(shopIDRegexp);
	
	if (!shopID){
		return;
	}
	
	var link = document.createElement('a');
	
	if (blockedShops.indexOf(shopID[1]) !== -1) {
		link.innerHTML = '[--]';
		link.className = 'unblock';
		link.addEventListener("click", function( ){
			unBlockShop(shopID[1]);
			renderShop(shop);
			shop.style.display = 'auto';
		}, false);

		shop.className = 'blocked';
		if (shop.firstChild.firstChild.className) {
			shop.firstChild.removeChild(shop.firstChild.firstChild);
		}
		shop.firstChild.insertBefore(link, shop.firstChild.firstChild);
	}
	else {
		link.innerHTML = '[X]';
		link.className = 'block';
		link.addEventListener("click", function( ){
			blockShop(shopID[1]);
			renderShop(shop);
			shop.style.display = 'none';
		}, false);
	
		shop.className = 'unblocked';
		if (shop.firstChild.firstChild.className) {
			shop.firstChild.removeChild(shop.firstChild.firstChild);
		}
		shop.firstChild.insertBefore(link, shop.firstChild.firstChild);
	}
}

var renderSearchResult = function( shop ){
	var shopID = shop.lastChild.innerHTML.match(resultIDRegexp);
	
	if (!shopID){
		return;
	}
	
	if (blockedShops.indexOf(shopID[1]) !== -1) {
		shop.className = 'blocked';
	}
	else {
		shop.className = 'unblocked';
	}
}

var blockShop = function( shopID ){
	blockedShops.push(shopID);
	GM_setValue('blockedShops',blockedShops.join(','));
};

var unBlockShop = function( shopID ){
	blockedShops.splice(blockedShops.indexOf(shopID), 1);
	GM_setValue('blockedShops',blockedShops.join(','));
};

unsafeWindow.setInterval(blockShops,1000);