// ==UserScript==
// @name        No More Scripts
// @description Removes all scripts, images, iframes, objects, embeds, and applets, that come from a different domain to the page itself.
// @namespace   http://bmky.net/
// @author      szsk
// @version     1.16
// @manual      http://bmky.net/product/nomorescripts/
// ==/UserScript==

( function( nms_debug ) {
	// 設定ファイルが無くてもとりあえず動作させる
	if( window.nms_trusted == undefined )  window.nms_trusted = [];
	if( window.nms_blocked == undefined )  window.nms_blocked = [];
	if( window.nms_disabled == undefined ) window.nms_disabled = [];
	if( window.nms_config == undefined )   window.nms_config = {}
	
	
	
	
	
	// デフォルト値の設定
	nms_config.init = function( key, value ) {
		if( this[ key ] == undefined ) this[ key ] = value;
	}
	
	nms_config.init( "block_images", false );
	nms_config.init( "block_iframe", true );
	nms_config.init( "block_flash", true );
	nms_config.init( "block_applet", true );
	nms_config.init( "block_jsurl", true );
	nms_config.init( "nms_enable_inframe", true );
	nms_config.init( "reload_trusted", true );
	nms_config.init( "show_placeholder", true );
	nms_config.init( "confirm_enabled_object", true );
	nms_config.init( "position_v", "bottom" );
	nms_config.init( "position_h", "right" );
	
	// window.name から変更する設定を取得
	window.name.replace( /\(([^$]+)\$([^)]+)\)/g, function( $0, name, value ) {
		if( nms_config[ name ] != undefined ) {
			nms_config[ name ] = ( value == "true" );
		}
	} );
	
	
	
	
	
	// 条件に該当するならスクリプトを無力化
	if(
	   // （要設定）iframe で表示されたページでは動作させない
	   ( nms_config["nms_enable_inframe"] == true && window.parent != window )
	   // 常にスクリプトを無効化するページ
	|| ( nms_disabled.length > 0 && checkDisablePage( nms_disabled ) )
	   // http 以外のプロトコル上では動作させない
	|| ( location.protocol != "http:" )
	   // head要素が存在しないようなページでは動作させない
	|| ( document.getElementsByTagName( "head" ).length == 0 )
	   // 画像かテキストのみ表示している場合は動作させない
	|| ( location.href.match( /\.(jpe?g|gif|png|bmp|swf|js|txt)$/i ) )
	   // デバッグ用ページでは動作させない
	|| ( window.name.indexOf( "[nmsinfo]" ) != -1 )
	) {
		delete nms_trusted;
		delete nms_blocked;
		delete nms_disabled;
		return;
	}
	
	
	
	
	
	// 許可・ブロックするアドレスを登録
	function Rule( loc, block, visible ) {
		this.location = loc;
		this.block = block;
		this.type = getAddressType( loc )
		this.visible = visible;
	}
	
	var Rules = new Array;
	Rules.add = function( loc, block, visible ) {
		if( loc == "" ) return null;
		
		// 既に存在するなら登録しない
		for( var i = 0, len = this.length; i < len; i++ ) {
			var rule = this[i];
			
			if( rule.location == loc ) {
				if( rule.block == block ) {
					return rule;
				}
				else {
					rule.block = block;
					rule.visible = visible;
					return rule;
				}
			}
		}
		
		var rule = new Rule( loc, block, visible );
		this.push( rule );
		return rule;
	};
	Rules.match = function( url ) {
		for( var i = 0, len = this.length; i < len; i++ ) {
			var rule = this[i];
			
			if( rule.type == "domain" ) {
				var domain = escape_reg( rule.location );
				var reg = new RegExp( "^http://(?:[^\\.]+\\.)?" + domain + "/", "i" );
				if( reg.test( url ) ) {
					rule.visible = true;
					return rule;
				}
			}
			else {
				if( ( rule.type == "url-prefix"
						&& url.indexOf( rule.location.slice( 0, -1 ) ) == 0 )
					||
					( rule.type == "url" && rule.location == url ) ) {
						rule.visible = true;
						return rule;
				}
			}
		}
		
		return this.add( get_sld( url ), true, true );
	}
	
	// 常に許可するロケーションを登録
	each( nms_trusted, function( rule ) {
		Rules.add( rule, false, false );
	} );
	
	// 常にブロックするロケーションを登録
	each( nms_blocked, function( rule ) {
		Rules.add( rule, true, false );
	} );
	
	delete nms_trusted;
	delete nms_blocked;
	delete nms_disabled;
	
	
	
	
	
	var nms_config_description = {
	  block_images           : "\u753B\u50CF\u3092\u30D6\u30ED\u30C3\u30AF\u3059\u308B"
	, block_iframe           : "iframe \u3092\u30D6\u30ED\u30C3\u30AF\u3059\u308B"
	, block_flash            : "Flash \u3092\u30D6\u30ED\u30C3\u30AF\u3059\u308B"
	, block_applet           : "JAVA \u3092\u30D6\u30ED\u30C3\u30AF\u3059\u308B"
	, block_jsurl            : "javascript \u306E URL \u3092\u30D6\u30ED\u30C3\u30AF\u3059\u308B"
	, nms_enable_inframe     : "iframe \u5185\u3067\u3082 No More Scripts \u3092\u6709\u52B9\u306B\u3059\u308B"
	, reload_trusted         : "\u8A31\u53EF\u8A2D\u5B9A\u3092\u5909\u66F4\u3057\u305F\u6642\u306B\u30EA\u30ED\u30FC\u30C9\u3059\u308B"
	, show_placeholder       : "\u30D6\u30ED\u30C3\u30AF\u3057\u305F\u8981\u7D20\u306E\u4EE3\u66FF\u8981\u7D20\u3092\u8868\u793A\u3059\u308B"
	, confirm_enabled_object : "Flash\u7B49\u3092\u30AF\u30EA\u30C3\u30AF\u3057\u3066\u8868\u793A\u3055\u305B\u308B\u969B\u306B\u78BA\u8A8D\u3059\u308B"
	};
	
	// \r\nこのオブジェクトを許可しようとしています。よろしいですか？
	var MSG_CONFIRM          = "\r\n\u3053\u306E\u30AA\u30D6\u30B8\u30A7\u30AF\u30C8\u3092\u8A31\u53EF\u3057\u3088\u3046\u3068\u3057\u3066\u3044\u307E\u3059\u3002\u3088\u308D\u3057\u3044\u3067\u3059\u304B\uFF1F";
	// NoMoreScriptsを停止する
	var MSG_DISABLE_NMS      = "No More Scripts\u3092\u505C\u6B62\u3059\u308B";
	// NoMoreScriptsを再開する
	var MSG_ENABLE_NMS       = "No More Scripts\u3092\u518D\u958B\u3059\u308B";
	// 全てブロックする
	var MSG_BLOCK_ALL        = "\u5168\u3066\u30D6\u30ED\u30C3\u30AF\u3059\u308B";
	// 一時的な設定
	var MSG_INSTANCE_SETTING = "\u4E00\u6642\u7684\u306A\u8A2D\u5B9A";
	
	
	
	
	
	// このスクリプト自体を有効化するか
	var nms_enable       = ( window.name.indexOf( "[disable]" ) == -1 );
	// ブロックしたコンテンツ
	var blocked_contents = new Array;
	
	if( nms_debug ) {
		document.title = document.title + " " + window.name;
	}
	
	
	
	
	
	// 管理メニュー用のCSS
	addStyle(
		'#nms, #nms *{list-style-type:none !important;font-size:12px !important;color:#000 !important;margin:0 !important;padding:0 !important;float:none !important;max-width:100% !important;min-width:0 !important;max-height:100% !important;min-height:0 !important;text-align:left !important;}#nms{position:fixed !important;border:1px solid #aaa !important;background-color:#fff !important;z-index:1024 !important;opacity:0.3 !important;line-height:24px !important;}#nms:hover{opacity:1.0 !important;}#nms #nms-icon{width:24px !important;height:24px !important;background-position:4px 4px !important;background-repeat:no-repeat !important;}#nms:hover #nms-icon{display:none !important;}#nms .nms-domains{display:none !important;border-bottom:1px solid #ddd !important;background-position:left top !important;background-repeat:repeat-x !important;height:24px !important;line-height:24px !important;font-family:monospace !important;}#nms:hover .nms-domains{display:block !important;}#nms .nms-domains.current{font-weight:bold !important;}#nms .nms-domains span{display:block !important;background-position:4px 4px !important;background-repeat:no-repeat !important;height:24px !important;line-height:24px !important;margin-right:8px !important;padding-left:24px !important;}#nms .nms-domains:hover{background-color:#eef !important;background-image:none !important;cursor:pointer !important;text-decoration:underline !important;}.nms-placeholder{background-color:grey !important;border:3px dotted lightgreen !important;color:white !important;text-decoration:none !important;overflow:hidden !important;}#nms_setting{display:none;position:fixed !important;border:1px solid #aaa !important;background-color:#fff !important;z-index:1024 !important;}#nms_setting:hover{display:block !important;}#nms_setting li{padding:0px 4px !important;}#nms_setting li:first-child{border-top-width:0px !important;}#nms_setting li input{height:20px !important;}#nms_setting li label{line-height:20px !important;letter-spacing:1px !important;margin-left:4px !important;}#nms_setting li label:hover{cursor:pointer !important;text-decoration:underline !important;}#nms .nms-domains{background-image:url( data:image/gif;base64,R0lGODlhAQAYAIQWAPPz8/P09PT09PT19PX19fb29vf39vf39/j39/n4+Pn5+Pn5+fn5+vr6+vr7+vv7+/z7+/z8/P39/f79/v7+/v///v///////////////////////////////////////yH5BAEKAB8ALAAAAAABABgAAAUUIBAIA1EUxoEkysI0zgNFkjRRVQgAOw== ) !important;}#nms .nms-domains.instance_setting span{background-image:url( data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAOVSURBVHjaYvz//z8DJQAggBjRBerqZgR+//7lfnd3ydWWlrltioqyka9evb589+7tNVOmNCwDKvkJxP9g6gECiAWhcbqkgAB/j5WVYdT9+0+ep6XVzFJUlImPjHQV/fXrr3ROToUCUNlhIH4CxN9g+gACiBnGcHUNWmZrax5iZqbBoKQkz2toqOtgYqLBzcbGzMDCwsTw8eMPnnfvPgkkJeWlmJk5WBw9ugdk2D+AAAJrLi3t4m5vn3dv69bT/1+9+vL/+/e//0HgL5D69+8/HLx+/fn/799//58/f+t/bGxOF1CrKEAAsRQVtWmKi0uuEhcXERcXF2JgZmZi+PHjN8P9++8YgDYysLGxMIiJ8THIyYkyiIjwgC0UFhYBuuidLyMj40qAAGJhZWWpNjDQ1dHTU2X48+cPAyhSrl69wzBz5qyXr149eW9gYCptZ+fE+w8YbIqKomADli5d9XPTpmXLgUwOgABi9vEJnyAmJsH/D6iClZUZaCM7w4EDh/+2tZVOuHv3+uqjR/fufv/+vay+vpmUtLQoAxMTI9Cif0wvX75ll5aWfw4QQEwfPrxhefv2LcPDhy8ZPn/+BpT8zaCgoMAsLCwmDLThARDvO3fueMaFC+e///sHiXUHBzOmtWvXWIuIiJcABBDzyZMH99y7d4PHxMRKT0JCDKxATEyEQVlZW5uZme2vqqr6Hz09Ey97e3tLFRVZJpBXvn79yfD+/RegN6fcBwggFqCNN3V0TP4ICPACo4uF4devP0BvMDK4u7tyGRjo53z8+CFHUlKcQVZWCij3D+jS5wyvXn0GhtNlhlu3rlwHCCCWyMgkTjk5BS9Q4L1//xkckKDoFQP6ABgzwNCXYmAEuvzHj58MXFwcDF++fGOYNKnt7dGj+05+/vxpF0AAsSxfPu+DtLRMjaSkzKyXL18Bo+4N0PmqQMVc4Cj8+fM3w6dP3xh+//4ODBsZYFSKMrx58/LjixdPVwBtugMQQKCk/P/p0yfLGxsLpb5//ybCwsLMUFHRma6oqMj67dtPhps3bzPcuHGNQV/fiOHfPzaGvXu3/z916sghoL5XQPwYIIBgeeHbq1fPJ4PCD4g5Hzy46X/3roosFxc3Q19f890TJw5s9vIKDgQmHNbt29dv/v37916gumdA/B4ggJBzIyhfsAIxEycnpx0XF48f0Lm6d+/eOgoMlyNA8d9AzAfEH4H4OTRTfQQIMABdD3nQGHebyAAAAABJRU5ErkJggg== ) !important;}#nms .nms-domains.enablescript span{background-image:url( data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAMeSURBVHjaYpRwWfSQk5nx1f2rr9sZ2Jm3MTAx/mBgZWJg+P8PiBkYGNiYGRh+A9kgDiMQswD5f/9B5NnYGAACiNnaPaV7cberDBsPW/iNBx8tf7z//ouBhfE6AyNQByNQHzPQsH8gk4AAxGcCGf4fYiAzMwNAADFL6EbWpkbrMlubyzLYWioosXCzBd1/8snl56fvrxn+/bvPwMbyD58BAAHELK4XVWtgpsZ88SlQnpOTwdJCjtHKQlHuHzNz5Ms3X61/fPzxgYGR8TlQ809sBgAEELOITlStDtCA++8ZGJ68Y2C49wboYqBB+kbyDPqGCorM7KxhL19/svj96dsnoKZbwDD4j2wAQAAxC2hF1cobqDHfA2r+8IOB4dMvBoZnHxkYHgMN/M3ByaCkLcekoaeo+J+FJejj+y/Ov7/+eA004BkwsH+DDAAIIGYezahaQXU15rtvgQZ8hxryk4HhPZB+AbTzIVD8EzMng7SWPLO0mpwC0KDIL+8/G//9+u0jAyvrfYAAYpQJ3vzLNMKH9QHQBYzAmGFkZEAFQP4/oDgoIoE+Y+BhZ2D49vYDw/0z1369vHL1KEAAsYAC+PdfRCBjAyBDgbEPVvcB6MW/jKwMTGwsbEAJDoAAYgFpYgQGLCtQBRMzkq7/CBcwswIxCwPD5zcfGJ5fusHw9vqN47/fvpvCwMGxFiCAWFiAmvm5gKaCNPyDOuM/1FAOiKEfX31muHf88t9nF26e//nhUx8DE8M2oP8/gpwGEEAsIAWCPBAbQKkTBNiA/mQB8l8//8hw88SN/3fP3Dj9/eXbKQzMjCuAGn+D/QQKGGB0AgQQCyhd8AJdwMEOSeYsQPr10y8MZ7dfYbh+4saZL68+TGRgZdnFwM7+iuH/X6gL/8N9ChBALMCoZJAUgwTUk/ufGI5uufn/1L5rF788f9cPzDzrGDjZvgA9gnAeGgAIIBZuDmZGhh/fGXZtuMpwYMvVE5+evp/HwMqwDGjrV3DuIwAAAohRyHnxMw525vfP7rzuBTptHTB1fUBoBGVfJga4C0AYlDv/Q70BdD5AgAEAoLEm4Zth7egAAAAASUVORK5CYII= ) !important;}#nms .nms-domains.blockall span{background-image:url( data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAOaSURBVHjaYvz//z8DJQAggFhAxFJGRoZfDAyaoqpqi4Xs7I0fb1y/7f2bN1F/GRg+goz/w8DAzcnLu0gxLCzo2alTNx5dvhz3j4HhdAPQcoAAYgC5YCFQ81Zjkxsf79z+///5/f8vTpz6v0hC8uBEoMYJDAys04SEd9zff+D/30d3/394eP//AgfHBzUMDKYgvQABBDZgs7rGxU+3gZrntf3/qSn+///edf+fnz3/f5aI6N7J3DxbHh45+v/r4d3/L0qI/X/cUPr/zeNH/6cbGN4F6QUIILABx1LS/v9/eR+omf//JymG/28V2f7/3Ln2/6Ojx//f27///+cDu/5fFOf9f4qT4f8hNub/X69c/L+lpOQ/SC9AADGBwuDxtq27Xtx+xsA2ZT7Db3YOht8/fzG8SIpk4P/4nEGQ8RfDvfAghl9fPzP8ZGRiUJk9k+Hd738MV9auOwHSCxBAYBfMZWAQWSQpdfD5xcv/f+1Y8/+BNNv/OyIM/28ocP2/LM/7/wwvw//DQNufzJ35/xnQqx3KyqeLGBhkQHoBAgjsAmYGhjefnz/z2exgt/s5rxSD4MxlDH94eBl+fPnG8PPzZ4Zf7OwMcjOBrjM0Y5hva3v0xd277qwMDE9AegECsEjHKACAMAwAAy7W///URZvaGsRCtgyB62OcCqVV5DoMZB/Y1RBydHm5psMMGYGl26rz/8EVQGAXAOOZl0NYZL3fjl2+ogw/GB7FhjH8eveB4RcTK8NvZnaG3x+/M1yOiWVgvHOLIfHAAWchKaktQANEQHoBAghsAKeo2ALPVSvdhf5+ZrgfEcTw+8sXhh9A26X7ZjIozFzE8BNk0K/fDKcSEhn+Xr/OELtqlZ2QtPRKkF6AAAIboOjnFySrrsRwJySc4fuHLwzf/zAzKE6ZzfBf34jht5wCg+aiRQy/WFgZfv36xXAgNpaBl4eHQT8iwgmkFyCAwAY8P3Xqzpc/TAxCWakMv9h4GZRnzGBgtLJlWObre3qht/cBRlU1BiOgIT+AGpXi4xkYBAUZ7h49+hSkFyCAwNHYxsBgssDR6f7bRw//f7104f/jixf/dyopnS4E+jOfgYGrRlLy4I3jJ/4/PXf+/9MHD/73+vk9i2VgcADpBQggRhDRBcxMXxgYzCX19RfKObuoX1m18vCLJ08i2RkYngKDAiQnICAqskI/Jtb97rFjD6+dPJkIlNs/D6gXIIAYKc3OAAEGAO4Npy5hgueqAAAAAElFTkSuQmCC ) !important;}#nms .nms-domains.trust span{background-image:url( data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAPESURBVHjaAEEAvv8BAEsbAAAA9QAACfIAAAv+BwDyAD4C8Q9lFwYlPhULGA4CAAEB6+/v8+jp7cj9+v+bAAECvAAFBPcACQcAAP//AAKIEW4A+0cZBq7/XWbKhpFxFqkMDtpODOKCogxAAxhefXjHcPjcCYaFGzYwHD1ycR0DM3spAx/XPYa//xgAAogBbIAnnxxjONPxnA3x/199u/MfF3j37cH/8nm1/1n19a4yaBgoMxgaMwAEEDODCi8Hw7+vE+IiPb0agysZ2Fl5GX4yfGf4x/CfAQT+Mfxl+AXkf2f4yMDA+pfB3FCJ4TPXa9HTB+8oMTAxbwEIIBaGX/9sxDUEY4zsxBm+MHxm+AHUyMXAB9YO0gox5DdQHGLIX6B3DXxYGGR3c/g8PsPoARBAzMzq/F12vtJa/PJfGXhZxRj4WISAiv4AMYj8BdT6Heiir0DyK5D9k+HRz5sMl7/tZWBhZmW4c/KvKEAAsQiIsNmoaosw/P3/g+Hshz0Mf4V+MUixqTKwM/AwMDOwAIOQAWzUD6ABL3/dY7jw4RDD7z9/GFQMeBhEJP8ZAgQQC48wMx+vABsDGxsrwz/G3wzXfh5leMV4j0GIRZqBk5EHqJ0RqPkLw7s/zxne/nrG8Jv5OwMXEy/DHwEmBh4hFnaAABTQwQ3AIBADQZ/viOm/S955oEgBYRpYjbbYF/QITRst5VBh1ovhCC24gW3Bnx/UBdLb1kSaxog4AlBIbikAg0AMjDRK3fvfU5C1FMVHJN8ZBhK2UX1NZrO7eMRLQ5I+kQWIAmxFgPCj03UrlffE5w9aWf0IIKZ3r76ceHLnEwMPUCM7CwcDBzAG2IGYk0EAiIWAWBgoJgQWA2E2oCt5gOqe32BiePP062WAAGL685Fl1sntLxkYf4A0cwIDjhPoAl6gYpgBIM38QMwLdBXQEqAq1r88DCfWv2f4+e3XDIAAYmJgY9p/cd/rtYdXfwQq4wcrYAZikDdAruACGgAykAkoxg42VoDh5PrvDGf3PNkH5G4GCCBmBnnx3wyf2c/cOPrFlY9bUFRLU4qBn5kfqIkbrBwYP0AD/wDZwKT15x/D3rWPGeZ3nL3//f+vGGCAPQEIIGYGPjUGBjb293++/dhx9tBjpbs3PqlzsAIdzs8HjpG///4wfPrwleHciQcM8yacYFg99+yu7z9/xDLwcNwA5UaAAGJkMDVkAKeWr/8YGH794QayPDk42LMkZISNRESA+YSRkeHd2y8/nz9+c+X7tx/TgbGyERjanxk4WcHZGSDAAMyhUSpfaf0ZAAAAAElFTkSuQmCC ) !important;}#nms .nms-domains.block span{background-image:url( data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAN2SURBVHjaYsxhYGD4B8TMQMwORN8ZGOx+MTCkcgoL23GLivIxMDIyfnr9+vO7N29O/GFgmA1UtoeVgeE7UC3DfyAGCCAWBigAGiLzl4GhS11DI9I4KopB2dOTgVdGBqSf4fOzZxw39+zxPbR4se/Fy5fXAdWVMjIw3AMZABBADCAXZDAwyBUwMBzf6eX1//vhw///f//+HwP8/Pn/x4kT/zcHBf2PZWC4GsHAoBwH1AsQQMwmDAwcQBMneOnqenlkZTGwiIgwMPz4AXQS0E3/gXb8Anro40cGhpcvGVh+/mRQA7qK/fFj0QtPnigBXbEFIIBYgP6ykWNgiDECOeftW2AoAH335w9E89evDEA/QAx8/x5sCMObNwwWQMNPMTD43GRg8AAIIGYzZuYuGw4OLQmgZjZBQYgL/gLdBLSN4ds3BoZPnyCaX79mYHj3juHnuXMMX/bsYWBmZma4zsgoChBALPwcHDYqrKwMTB8+MHzesIGBGWgrqxHQPWJiDAxsbJAQ/v0bbPOf8+cZPu/axfAfaLAKLy+DMAuLIUAAsfAxM/PxAm0EKWUC2vYHaAjT6dMMzIqKDAwg14C8AHTBv7t3GX4/ecLAAvQeUISBEagHqJcdIIBYWIAK2IH+5YDGKRtQgvHRIwaGFy9QXMAEDEyQOiYg9w/IAJA4ExMjQACxAMP4y192dk7Oz5/BtjFycTEw8PAA4wZoJDMzNJH8Awck05cvDGxA57MB+T+A8l///fsFEEAsH378OPGYi8tXAuRUkCag38CYkxMSIyAAikqQa5iYGBhBhn3/zvAAKPfyw4fLAAHE9P3Xr1lHgf76xc/PwAAMTLBGbm4GBhBfQICBARgzYDZIDCQHNOgvHx/DQaBXf/74MQMggJhY///ff+7jx7V7hYQgGkCGgGwGaYAZAPMSCwvYdQeFhRlOf/q0j+3//80AAcRsDAyin3//nrn865crh4SEqAJQMTPIAFBYAG0CawKlCaAr/wLDZD8QL3727D4wjcQAPfUEIICYtYFeBNr5/sfv3zsufPyo9ICFRZ0VqJEHaDsL0M//gCH/GYivAv29Ehgzmx8+3PX727dYoPE3QJkJIIAYE6FR8h0YiH/+/we6m8GTjYMjS1xQ0IifjY0DJPfh16+frz58uPLj+/fpQO5GVkbGzxxAQ0EGAAQYALoATpZS+Ly6AAAAAElFTkSuQmCC ) !important;}#nms .nms-domains.disablescript span, #nms #nms-icon.enablescript{background-image:url( data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAJ9SURBVHjaYpRwXnjPyVhK5P////+YGBkY3n3+xb339NM5v779zmQACTAC8f//DEyszP1OJlLZEoKc3//8+/efmZmJ6cCFFx8AAohFTV5Qtr/FheXvPwYGVhYGhis33jMcT1wj/+vDd6AAM9AAJgYGoCQLH4diXrIJq7WpJOuPnwwMHBwMDFH5OzkBAlA4hjgAgwAMPEHY/9+1B6AQZA7ExMwWYKVUnWgvDc8nnRf8E4IFuYohJma8xwd27O+puVMMHeIB94uWAGL59IuB4dxzoCuBKpiBlj1/DdINBExIGOQLIH373X+G30C1f/8ADWJlYPj0g4EBIIBYPgNNu/QSYgUT0Mb3b4EK/kNthxkABP+Bhtx9B9T0EmIAM8gAoOUAAcTyE8h59AHiApB3v30GKmBEtR3mjRdAua9Atf9ABgC9+B1oAEAAsYAs+w9xAFjdP4R6CIAaAHIBTC1MPYgGCCAmNHVg/J8BP0BWCxBATAwUAoAAYmFAchaMzYhDMbp3QWyAAGIBMZih7mBkhrL/Y8csQDkWoJp/0CgHJVKAAGJhB7pBkh+cWsEGfATGLRMjpmaQkBAvA4MIUO3fv5BYeMDGwAAQQGADpIURprJ/h0b9XyS//INQIkADZIQhKRGUkDiAegECiIUDyJAVAVryF5KQWL6hueAfxDBGIC0GtF0WaMAfoAGsQNs5gRgggFg4OZgYVWUhiQNkKssvZgam/8B0+BtqOxPUgP//WWXFmBhU5YAGADMTKzAzcXMwMgIEEMuzx++fz+46KAAMA3B2/vT5JzdQ/imDACfUKQzgAPrHwvR48/Lzf47u4v727++//0zMTIwP7735DBBgAAaE21DiH3bEAAAAAElFTkSuQmCC ) !important;}#nms #nms-icon{background-image:url( data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAALiSURBVHjaYvz//z8DJQAggJgYKAQAAcSA7IIprKzJKzQ0bkkzMkYAuVzIFjwLlMm9ls9zz1CAGUUOIIDABrQyMLDPFRZuex4f/+d/fv7/S/b2Pww4OCYA5YUmqklzvUyVmfR7F+u//3sZ/r9vZfoRosDYB5QTA2JmgABiBBmwVVn5sEtqqg37r18MDM+fMzD8/cvw4917hoQN2zcVZ7JxmnZ+cGV4BnTpLaCWL0D8mYGhso9he8c1hkSAAAI7Q+P5cxv2PXsYGP78YWDg5AQq+srw7egpBn7xf66vJb85MNwFav4NVMgGxF+B+BEDgwkPgz6QpQAQQCwgA359//6LYe9eNoZ79xj+aesyXN6zm2GxDQfD5wlmnFPuPGV4tfk+Q4LWX6BCoOJzQPyDgeHjTwZQ4AkDBBDYgN8QsxkY7t9nOP/8IcPSMmcG4QYtBoFvdxgeMPAzLGSUY7h1/QVD2avvDAIgL3AzMPz7BQ5EJoAAAnthHgND+UmI4xgOWAswCNe5MqgyCjD8/vmPgfXfPwZZWR6G2fxyDIfeMjMwcDAwbDzO8Lb8JsNqoPLvAAEEdsFEBobpR4H2FzIwtP/9+1v55NWFDF8EZBi4+VgZPv5gYth55R/Du9dMDGzfmRga9/+91vSIYeE/BobrQK1PAQIIHAuMjIxAoxl4RBkYlAQjBKaZlctaMPz4zfCHiYNh44W/DN9/AtV8/88g03pz7+NPf5ZBgpHhHhC/BAggWEIBhhDDp9cMDDfuMP+Y9+rRFwZublaGT19+MXz/BbSLg5Hh/8Wf3x5//rsPFFIMENufgOIEIIAYsOQFLkY7lgzjPplXvkd0/jNO1P3PYC15H+jMJqCcDxArMsACHQgAAgibASBX8TNIc3gIxcheY1IXBIYvQyYQewCxKiQOGBhhigECCBYG2AwBpXcJIJYE4j+gAAPiV0D8E4jhtgIEEC4DGKC2gJzKCdXwDZJkUAFAgAEAv0UAkT3j1wsAAAAASUVORK5CYII= ) !important;}#nms .instance_setting:hover + #nms_setting {display : block;}'
		+ "#nms{"
		+ nms_config["position_v"] + ":0 !important;"
		+ nms_config["position_h"] + ":0 !important;"
		+ "border-" + nms_config["position_v"] + "-width : 0 !important;"
		+ "border-" + nms_config["position_h"] + "-width : 0 !important;"
		+ '}' );
	
	if( nms_config["block_images"] ) {
		addStyle( "img { display : none !important }" );
		var css_images = document.styleSheets[document.styleSheets.length-1];
	}
	if( nms_config["block_iframe"] ) {
		addStyle( "iframe { display : none !important }" );
		var css_iframe = document.styleSheets[document.styleSheets.length-1];
	}
	if( nms_config["block_flash"] ) {
		addStyle( "object, embed { display : none !important }" );
		var css_flash = document.styleSheets[document.styleSheets.length-1];
	}
	if( nms_config["block_applet"] ) {
		addStyle( "applet { display : none !important }" );
		var css_applet = document.styleSheets[document.styleSheets.length-1];
	}
	
	if( nms_enable ) {
		// window.name から許可/ブロックするドメインを取得
		window.name.replace( /<([^$]+)\$([^>]+)>/g, function( $0, loc, block ) {
			Rules.add( loc, ( block == "block" ), false );
		} );
		
		// ソースに埋め込まれたスクリプト等をブロックするか
		var block_inline = Rules.match( location.href ).block;
		
		// block external script <script src="...">
		opera.addEventListener( "BeforeExternalScript", function( e ) {
			if( Rules.match( e.element.src ).block ) {
				blocked_contents.push( e.element.src );
				e.preventDefault( );
			}
		}, false );
		
		// block inline script <script>hogehoge( );</script>
		opera.addEventListener( "BeforeScript", function( e ) {
			if( block_inline ) {
				blocked_contents.push( location.href + "#inline_script" );
				e.preventDefault( );
			}
		}, false );
		
		// block javascript url <a href="javascript:...">
		if( nms_config["block_jsurl"] == true ) {
			opera.addEventListener( "'BeforeJavascriptURL", function( e ) {
				if( block_inline ) e.preventDefault( );
			}, false );
		}
	}
	
	document.addEventListener( "DOMContentLoaded", function( ) {
		// block <body onload="...">
		if( block_inline ) {
			document.body.onload = null;
		}
		
		if( nms_enable ) {
			// 画像のブロック
			if( nms_config["block_images"] == true ) blockSrcElements( "//img[@src]" );
			// iframe のブロック
			if( nms_config["block_iframe"] == true ) blockSrcElements( "//iframe[@src]" );
			// JAVA のブロック
			if( nms_config["block_applet"] == true ) blockObjects( "//applet" );
			// Flash のブロック
			if( nms_config["block_flash"] == true ) {
				blockObjects( "//object" );
				blockObjects( "//embed" );
			}
		}
		
		createBlockManager( );
	
		if( nms_config["block_images"] )
			css_images.disabled = true;
		if( nms_config["block_iframe"] )
			css_iframe.disabled = true;
		if( nms_config["block_flash"] )
			css_flash.disabled = true;
		if( nms_config["block_applet"] )
			css_applet.disabled = true;
	}, false );
	
	function createBlockManager( ) {
		// ページ右下にブロックリストを表示
		var dl = document.createElement( "dl" );
		dl.id = "nms";
		
		var dt = dl.appendChild( document.createElement( "dt" ) );
		dt.id = "nms-icon";
		
		if( !nms_enable ) dt.className = "enablescript";
		
		var ddc = document.createElement( "dd" );
		ddc.className = "nms-domains";
		
		if( nms_enable ) {
			// 「NoMoreScriptsを無効にする」メニュー
			var dd = dl.appendChild( ddc.cloneNode( false ) );
			dd.innerHTML = "<span>" + MSG_DISABLE_NMS + "</span>";
			dd.className += " disablescript";
			dd.addEventListener( "click", disableNMS, false );
			
			// 「一時的な設定」メニュー
			var dd = dl.appendChild( ddc.cloneNode( false ) );
			dd.innerHTML = "<span>" + MSG_INSTANCE_SETTING + "</span>";
			dd.className += " instance_setting";
			// 一度だけ実行させて、サブメニューの表示位置を設定する
			dd.addEventListener( "mouseover", function( ) {
				var nmselem = $( "nms" );
				var width = nmselem.offsetWidth - 1 - 12;
				var height = ( nmselem.childNodes.length - 5 + 1 ) * 25;
				
				if( nms_config["position_v"] == "top" ) height -= 25;
				
				addStyle( "#nms .instance_setting:hover + #nms_setting {display : block;}"
					+ "#nms_setting {"
					+ nms_config["position_v"] + ":" + height + "px;"
					+ nms_config["position_h"] + ":" + width + "px;"
					+ "}" );
				
				this.removeEventListener( "mouseover", arguments.callee, false );
			}, false );
			
			var dd = dl.appendChild( document.createElement( "dd" ) );
			dd.id = "nms_setting";
			dd.appendChild( createInstanceConfigManager( ) );
			
			// 「全てブロックする」メニュー
			var dd = dl.appendChild( ddc.cloneNode( false ) );
			dd.innerHTML = "<span>" + MSG_BLOCK_ALL + "</span>";
			dd.className += " blockall";
			dd.addEventListener( "click", blockAllLocation, false );
			
			var loc_host = location.host;
			var loc_sld = get_sld( location.href );
			
			// ブロックしたドメインを定義リストに放り込む
			each( Rules, function( rule ) {
				if( !rule.visible ) return;
				
				var dd = dl.appendChild( ddc.cloneNode( false ) );
				dd.innerHTML = "<span>" + rule.location + " \u3092"
					+ ( rule.block ? "\u8A31\u53EF" : "\u30D6\u30ED\u30C3\u30AF" ) + "</span>";
				dd.className += ( rule.block ? " block" : " trust" );
				
				if( loc_host == rule.location || loc_sld == rule.location )
					dd.className += " current";
				
				dd.addEventListener( "click", function( ) {
					var loc = this.childNodes[0].innerHTML.replace( /\s\u3092.*?$/, "" );
					
					if( this.className.indexOf( "trust" ) != -1 )
						this.className = this.className.replace( "trust", "block" );
					else if( this.className.indexOf( "block" ) != -1 )
						this.className = this.className.replace( "block", "trust" );
					
					blockLocation( loc, ( this.className.indexOf( "block" ) != -1 ) );
				}, false );
			} );
		}
		else {
			// 「NoMoreScriptsを有効にする」メニュー
			var dd = dl.appendChild( ddc.cloneNode( false ) );
			dd.innerHTML = "<span>" + MSG_ENABLE_NMS + "</span>";
			dd.className += " enablescript";
			dd.addEventListener( "click", enableNMS, false );
		}
		
		document.body.appendChild( dl );
	}
	
	function createInstanceConfigManager( ) {
		var ul = document.createElement( "ul" );
		
		for( var i in nms_config ) {
			if( nms_config_description[i] == undefined ) continue;
			
			var li = document.createElement( "li" );
			
			var input = document.createElement( "input" );
			input.id = "nms_set_" + i;
			input.type = "checkbox";
			input.checked = ( nms_config[i] == true );
			input.addEventListener( "change", function( ) {
				var name = this.id.replace( "nms_set_", "" );
				var reg = new RegExp( "\\(" + name + "\\$(true|false)\\)" );
				var option = "(" + name + "$" + ( this.checked ? "true" : "false" ) + ")";
				
				if( window.name.match( reg ) ) {
					window.name = window.name.replace( reg, option );
				}
				else {
					window.name += option;
				}
				
				nms_config[ name ] = this.checked;
			}, false );
			
			var label = document.createElement( "label" );
			label.setAttribute( "for", "nms_set_" + i );
			label.innerHTML = nms_config_description[i];
			
			li.appendChild( input );
			li.appendChild( label );
			ul.appendChild( li );
		}
		
		return ul;
	}
	
	function enableNMS( ) {
		window.name = window.name.replace( "[disable]", "" );
		reload( );
	}
	
	function disableNMS( ) {
		window.name += "[disable]";
		reload( );
	}
	
	function blockAllLocation( ) {
		each( Rules, function( rule ) {
			if( rule.visible ) {
				blockLocation( rule.location, true );
			}
		} );
		
		reload( );
	}
	
	function blockSrcElements( xpath ) {
		var nodes = document.selectNodes( xpath );
		
		each( nodes, function( node ) {
			if( node.src != "" && Rules.match( node.src ).block ) {
				blocked_contents.push( node.src );
				addplaceholder( node );
			}
		} );
	}
	
	function blockObjects( xpath ) {
		var objects = document.selectNodes( xpath );
		
		each( objects, function( obj ) {
			var source = obj.src || obj.data || obj.code || null;
			
			if( !source ) {
				for( var x = 0, len2 = obj.childNodes.length; x < len2; x++ ) {
					var node = obj.childNodes[x];
					
					if( !node.tagName ) continue;
					
					if( node.name.match( /^data|movie|src$/ ) ) {
						source = node.value;
						if( source ) break;
					}
				}
			}
			
			if( source && source.indexOf( "http://" ) == -1 ) {
				source = location.href.replace( /$\//, "" ) + "/" + source;
			}
			
			if( source && Rules.match( source ).block ) {
				blocked_contents.push( source );
				addplaceholder( obj );
			}
		} );
	}
	
	function addplaceholder( node ) {
		if( nms_config["show_placeholder"] == false ) {
			node.style.display = "none";
			return;
		}
		
		var url2 = ( node["src"] ? node["src"] : node["data"] );
		var hmm = document.createElement( "s" );
		
		if ( node.tagName == "IMG" ) {
			var url = url2;
		}
		else {
			var url = escape( node.outerHTML );
		}
		/*
		var url = node["src"] || node["data"] || escape( node.outerHTML );
		var hmm = document.createElement( "s" );
		*/
		
		var phwidth = calcdim( node, 'width', hmm ).replace( /px/, "" );
		var phheight = calcdim( node, 'height', hmm ).replace( /px/, "" );
		
		if( phwidth < 7 || phheight < 7 ) {
			var style = "border:none !important;";
		}
		else {
			var style = "";
			phwidth -= 6;
			phheight -= 6;
		}
		
		hmm.textContent = url2;
		//hmm.textContent = get_sld( url );
		//hmm.textContent = node.tagName + " " + url;
		hmm.style = "width:" + phwidth + "px !important;"
					+ "height:" + phheight + "px !important;"
					+ "display:" + ( node.style.display ? node.style.display : 'inline-block' ) + ";"
					+ style;
		hmm.setAttribute( "srcurl", url2 );
		hmm.setAttribute( "url", url );
		hmm.nodetag = node.tagName;
		hmm.title = "Click to unblock this url : " + url2 + " \r\nwidth : " + phwidth + ", height : " + phheight;
		//hmm.title = "Click to unblock this url : " + url + " \r\nwidth : " + phwidth + ", height : " + phheight;
		hmm.className = "nms-placeholder";
		hmm.addEventListener( "click", function( ) {
			if( this.nodetag.match( /img/i ) || ( nms_config["confirm_enabled_object"] == true
				&& window.confirm( this.getAttribute( "srcurl" ) + MSG_CONFIRM ) ) ) {
				bringback( this.getAttribute( "url" ), this, true );
			}
			return false;
		}, false );
		node.parentNode.replaceChild( hmm, node );
	}
	
	// ブロックしたコンテンツの復元
	function bringback( url, placeholder, click ) {
		url = unescape( url );
		
		if ( !url.match( /^(\<|\x3c)/ ) ) {
			var hmm = document.createElement( "img" );
			hmm.src = url;
			placeholder.parentNode.replaceChild( hmm, placeholder );
		}
		else {
			placeholder.outerHTML = url;
		}
		
		if( !click ) return;
		
		var nodes = document.selectNodes( '//s[contains(@url,"' + url + '")]' );
		
		each( nodes, function( node ) {
			bringback( url, node, false );
		} );
	}
	
	function calcdim( node, attr, hmm ) {
		if( attr == "width" ) {
			var width = node.width || node.offsetWidth || getComputedStyle( node ).width;
			
			if( width === 0 || width === 1 ) {
				hmm.textContent = "_";
				return "20px";
			}
			
			return ( node.hasAttribute( "width" ) ? node.getAttribute( "width" )
					: ( getComputedStyle( node ).width ? getComputedStyle( node ).width
													: getComputedStyle( node ).maxWidth ) )
		}
		else {
			var height = node.height || node.offsetHeight || getComputedStyle( node ).height;
			
			if( height === 0 || height === 1 ) {
				hmm.textContent = "_";
				return "20px";
			}
			
			return ( node.hasAttribute( "height" ) ? node.getAttribute( "height" )
					: ( getComputedStyle( node ).height ? getComputedStyle( node ).height
													: getComputedStyle( node ).maxHeight ) )
		}
	}
	
	function blockLocation( domain, block ) {
		var reg = new RegExp( "<" + escape_reg( domain ) + "\\$(block|trust)>" );
		var option = "<" + domain + "$" + ( block ? "block" : "trust" ) + ">";
		
		if( window.name.match( reg ) ) {
			window.name = window.name.replace( reg, option );
		}
		else if( window.name.indexOf( option ) == -1 ) {
			window.name = window.name + option;
		}
		
		//reload( );
	}
	
	function getAddressType( addr ) {
		return addr.match( /\*$/ ) ? "url-prefix"
									: addr.indexOf( "http" ) == 0 ? "url"
									: "domain";
	}
	
	// ページのURLが常に無効化する対象か
	function checkDisablePage( addrs ) {
		var disabled = false;
		
		each( addrs, function( addr ) {
			if( getAddressType( addr ) == "domain" )
				var reg = new RegExp( escape_reg( addr ) );
			else
				var reg = new RegExp( "^" + escape_reg( addr ).replace( "\\*", ".*" ) + "$" );
			
			if( location.href.match( reg ) )
				disabled = true;
		} );
		
		return disabled;
	}
	
	function escape_reg( loc ) {
		return loc.replace( /([-_.*+$^?|(){}\[\]])/g, "\\$1" );
	}
	
	// セカンドレベルドメインを取得
	function get_sld( str ) {
		return str
			.replace( /^https?:\/\//, "" )
			.replace( /^([^/]+).*$/, "$1" )
			.replace( /^(?:[\w-]+\.)*([\w-]+\.[\w-]{2}\.[\w-]{2,})$|^(?:[\w-]+\.)*([\w-]{3,}\.[\w-]{2,})$/i
				, function( $0, $1, $2 ) { return $1 || $2 } );
	}
	
	function reload( ) {
		if( nms_config["reload_trusted"] == true ) {
			location.href = location.href;
		}
	}
	
	function log( str ) {
		if( nms_debug ) opera.postError( str );
	}
	
	function each(a,f){
		var c = 0;
		var len = a.length;
		var i = len % 8;
		if (i>0) do {
			f(a[c],c++,a);
		} while (--i);
		i = parseInt(len >> 3);
		if (i>0) do {
			f(a[c],c++,a);f(a[c],c++,a);
			f(a[c],c++,a);f(a[c],c++,a);
			f(a[c],c++,a);f(a[c],c++,a);
			f(a[c],c++,a);f(a[c],c++,a);
		} while (--i);
	};
	/*
	function addStyle( style ) {
		var link = document.createElement( "link" );
		link.rel = "stylesheet";
		link.href = 'data:base64,' + style;
		link.type = "text/css";
		document.getElementsByTagName( "head" )[0].appendChild( link );
	}
	*/
	function addStyle( csstext ) {
		var link = document.createElement( "link" );
		link.rel = "stylesheet";
		link.href = 'data:text/css,' + encodeURI(csstext);
		link.type = "text/css";
		document.getElementsByTagName( "head" )[0].appendChild( link );
	}
	
	function $( id ) {
		return document.getElementById( id );
	}
	
	document.addEventListener( "load", function( ) {
		if( !nms_debug ) return;
		// Shift+ダブルクリックでブロックしたコンテンツを表示
		document.addEventListener( "dblclick", function( e ) {
			if( !e.shiftKey ) return;
			
			var win = window.open( );
			win.name = "[nmsinfo]";
			var html = new Array;
			
			html.push( "<h3>blocked Items</h3>" );
			html.push( "<ol>" );
			
			each( blocked_contents, function( contents ) {
				html.push( '<li><a href="' + contents + '">' + contents + "</a></li>" );
			} );
			
			html.push( "</ol>" );
			html.push( "<h3>Rules</h3>" );
			html.push( "<table>" );
			
			each( Rules, function( rule ) {
				if( !rule.visible ) return;
				
				html.push( "<tr>"
					+ "<td>" + rule.location + "</td>"
					+ "<td>" + ( rule.block ? "block" : "trust" ) + "</td>"
					+ "<td>" + ( rule.visible ? "visible" : "hidden" ) + "</td>"
					+ "</tr>" );
			} );
			
			html.push( "</table>" );
			html.push( "<h3>option</h3>" );
			html.push( "<ul>" );
			
			for( var i in nms_config ) {
				if( typeof nms_config[i] == "Boolean" ) {
					var val = ( nms_config[i] == true ? "true" : "false" );
				}
				else {
					var val = nms_config[i];
				}
				html.push( "<li>" + i + " : " + val );
			}
			
			html.push( "</ul>" );
			
			win.document.write( html.join( "\r\n" ) );
			win.document.close( );
		}, false );
	}, false );
} )( false );
