remove the posts which make you sick

移除讨厌鬼的帖子

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

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Greasemonkey 油猴子Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Userscripts ,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name	remove the posts which make you sick
// @author	burningall
// @description	移除讨厌鬼的帖子
// @version     2015.8.16
// @include		*tieba.baidu.com/p/*
// @include		*tieba.baidu.com/*
// @include		*tieba.baidu.com/f?*
// @grant       GM_addStyle
// @grant       GM_getValue
// @grant       GM_setValue
// @grant		GM_listValues
// @grant		GM_deleteValue
// @run-at		document-start
// @compatible  chrome  推荐
// @compatible  firefox  不再继续兼容火狐渣
// @license     The MIT License (MIT); http://opensource.org/licenses/MIT
// @supportURL		http://www.burningall.com
// @contributionURL	[email protected]|alipay.com
// @namespace https://greasyfork.org/zh-CN/users/3400-axetroy
// ==/UserScript==
// 
/*
	不再继续兼容火狐渣,受不了了。
	外观极丑臃肿,还得自定义css,美其名曰叫DIY,SimpleWhite主题+Yosemite样式都拯救不了他的外观。
	最符合W3C标准,然而又有很多特立独行的特性,其叫丰富的API。
	自由、安全、随心,低内存占用。殊不知几个扩展分分钟卡死。“哎呀,浏览器崩溃了【报告给Mozila】”,至于快速一说,更是无稽之谈。
	还有喜闻乐见的flash~~~~!,没用过firefox的,根本不知道什么叫flash崩溃。
	不但如此,页面渲染和表现力简直烂到爆,说实话,IE11都比不上。
	还有流氓行径,卸载不干净,美其名曰叫用户体验,用户下次安装的时候,那些扩展,书签等,就不用再同步了。
	……………………………………
	忍无可忍,卸载了~~!
*/
(function(window,document){
//==============默认配置==============
var defaultdConfig = {
	'blockWay': '遮罩屏蔽', //遮罩屏蔽或删除节点
	'color': '#ffffff', //遮罩颜色
	'opacity': '0.8', //遮罩透明度
	'blurpx': '3', //高斯模糊大小
};
//==============TQuery=================
function $(tArg){
	return new TQuery(tArg);
}
function TQuery(tArg){
	this.arg = tArg;//保存传进来的参数
	this.elements = [];//用来保存选择的元素
	this.doc = document;
	switch( typeof tArg ){
		case "undefined" :
			return this;
		case "function" :
			addEvent(window,'load',tArg);
			break;
		case "string" :
			var aElems = this.doc.querySelectorAll(tArg);
			for(var i=0;i<aElems.length;i++){
				this.elements.push(aElems[i]);
			}
			break;
		case "object" : //对象
			this.elements.push(tArg);
			break;
	}
	this.length = this.elements.length;
}
TQuery.prototype.find = function(str){
	var childElements = [];//存放临时数据
	for(var i=0;i<this.length;i++){
		var aElems = this.elements[i].querySelectorAll(str);
		var length = aElems.length;
		var j =0;
		while(j<length){
			childElements.push( aElems[j] );
			j++;
		}
	}
	this.elements = childElements;
	this.length = childElements.length;//返回新的长度
	return this;
};
TQuery.prototype.click = function(fn){
	var length = this.elements.length;
	for(var i=0;i<length;i++){
		addEvent(this.elements[i],'click',fn);
	}
	return this;//返回对象,进行链式操作
};
TQuery.prototype.bind = function(type,fn){
	if(arguments.length==1){//如果只传一个json参数e
		for(var k=0;k<this.length;k++){
			for(var attr in type){
				addEvent(this.elements[k],attr,type[attr]);
			}
		}
	}else{//如果传两个参数,则统一执行一个e
		var events = type.split(' ');
		var eventsLength = events.length;
		for(var i=0;i<this.length;i++){
			var j=0;
			while(j<eventsLength){
				addEvent(this.elements[i],events[j],fn);
				j++;
			}
		}
	}
	return this;//返回对象,进行链式操作
};
TQuery.prototype.on = function(type,fn){
	if(arguments.length==1){//如果只传一个json参数
		for(var k=0;k<this.length;k++){
			for(var attr in type){
				this.elements[k][ 'on'+attr ] = type[attr];
			}
		}
	}else{//如果传两个参数e,fn
		var events = type.split(' ');//获取每个事件
		var eventsLength = events.length;
		for(var i=0;i<this.length;i++){
			var j =0;
			while(j<eventsLength){
				this.elements[i][ 'on'+events[j] ] = fn;
				j++;
			}
		}
	}
	return this;//返回对象,进行链式操作
};
TQuery.prototype.toggle = function(){
	var _arguments = arguments;
	var	length = _arguments.length;
	var count = 0;
	for(var i=0;i<this.length;i++){
		var _this = this.elements[i];
		this.on('click',function(){
			_arguments[count++%length].call(_this);//执行	,解决this错误的问题
		});
	}
	return this;//返回对象,进行链式操作
};
TQuery.prototype.each = function(fn){
	for(var i=0;i<this.length;i++){
		var _this = this.elements[i];
		fn.call(_this);
	}
	return this;
};
TQuery.prototype.css = function(attr,value){
	var type = /^(width|left|top|bottom|right|line-height|font-size)+/ig;
	var type2 = /^(height|margin|padding)+/ig;
	var type3 = /\d+(px)/ig;
	var type4 = /\:/ig;
	if(arguments.length==2){//设置单个样式
		if( type.test(attr) && value.indexOf('%')<0 ){
			value = parseFloat(value).toFixed(2) + 'px';
		}
		for(var m=0;m<this.length;m++){
			this.elements[m].style[attr] = value;
		}
	}else{//一个参数
		if(typeof attr=="string"){//获取样式
			if( type4.test(attr) ){//如果一长串字符串设置,background:#303030;font-size:20px;
				for(var x=0;x<this.length;x++){
					this.elements[x].style.cssText = attr;
				}
			}else{
				return this.elements[0].currentStyle ? this.elements[0].currentStyle[attr] : getComputedStyle(this.elements[0])[attr];
			}
		}else if( typeof(attr) == "object" && Object.prototype.toString.call(attr).toLowerCase() == "[object object]" && !attr.length ){//json
			//json设置样式
			var css = "";
			for(var i =0;i<this.length;i++){
				//纯CSS写法
				for(var k in attr){
					//k == 属性名字,width,height,opacity等
					//attr[k] == 属性值,300px,#303030等
					if((type.test(k) || type2.test(k)) && attr[k].indexOf('%')<0 ){//如果是带像素的属性,并且没有%符号
						attr[k] = parseFloat( attr[k] ).toFixed(2) + 'px';
					}
					css += k+":"+attr[k]+";";
				}
				this.elements[i].style.cssText = css;
			}
		}
	}
	return this;//返回对象,进行链式操作
};
TQuery.prototype.style = function(attr){
	//IE下,如果宽高设置为百分比,则返回也是百分比。
	return this.elements[0].currentStyle ? this.elements[0].currentStyle[attr] : getComputedStyle(this.elements[0])[attr];
};
TQuery.prototype.size = function(attr){
	return this.doc.documentElement[attr] ? this.doc.documentElement[attr] : this.doc.body[attr];
};
TQuery.prototype.animate = function(json,configjson){
	//如果两个参数.animate('width','300');
	for(var i=0;i<this.length;i++){
		var _this = this.elements[i];
		clearInterval(_this.animate);
		_this.animate = setInterval(function() {
			//注意,此处this指的是window(匿名函数)
			var bStop = true;//判断运动是否停止
			for(var attr in json){//attr代表属性,'width','height'.而json[attr]代表数值
				// 1. 取得当前的值(可以是width,height,opacity等的值)
				var objAttr = 0 ;
				if(attr == 'opacity'){//获取当前数值
					objAttr = Math.round(parseFloat( $(_this).style(attr) ) * 100);
				}else{
					objAttr = parseInt( $(_this).style(attr) );
				}
				// 2.计算运动速度
				var jsonattr = parseFloat( json[attr] );
				var speedConfig = (configjson && typeof ( configjson.speed ) != 'undefined') ? configjson.speed : 10;
				var iSpeed = (jsonattr - objAttr) / speedConfig;	//(目标数值-当前数值)/10
				iSpeed = iSpeed > 0 ? Math.ceil(iSpeed) : Math.floor(iSpeed);	//如果速度>0,则速度向上取整,如果小于0,则保留小数
				// 3. 检测所有运动是否到达目标
				//objAttr,当前点,json[attr]为目标点
				if ( (iSpeed>0 && objAttr <= jsonattr) || (iSpeed<0 && objAttr >= jsonattr) ) {//如果有其中一项没有达到目标
					bStop = false;
				}
				if (attr == "opacity") {
					_this.style.filter = 'alpha(opacity:' + (objAttr + iSpeed) + ')';
					_this.style.opacity = (objAttr + iSpeed) / 100;
				} else {
					_this.style[attr] = objAttr + iSpeed + 'px';	//赋值开始运动
				}
				if( configjson && typeof configjson.load !='undefined' ){
					configjson.load.call(_this);
				}
				if (bStop) { // 表示所有运动都到达目标值
					clearInterval(_this.animate);
					if( configjson && typeof configjson.end != 'undefined' ){
						configjson.end.call(_this);
					}
				}
			}//for
		},30);
	}//for
	return this;//返回对象,进行链式操作
};
TQuery.prototype.attr = function(attr,value){
	//attr不能是数字
	if(arguments.length==2){//2个参数,设置属性
		for(var k=0;k<this.length;k++){
			if(this.elements[k][attr]){
				this.elements[k][attr] = value;
			}else{
				this.elements[k].setAttribute(attr,value);
			}
		}
	}else if(arguments.length==1){//1个参数
		if( typeof(attr) == "object" && Object.prototype.toString.call(attr).toLowerCase() == "[object object]" && !attr.length ){//如果是json,则分别设置属性
			for(var i=0;i<this.length;i++){
				for(var j in attr){
					if( this.elements[i][j] ){//如果属性是可以直接读取
						this.elements[i][j] = attr[j];
					}else{//如果是自定义属性
						this.elements[i].setAttribute(j,attr[j]);
					}
				}
			}
		}else{//读取属性
			return this.elements[0][attr] || this.elements[0].getAttribute(attr);
		}
	}
	return this;//返回对象,进行链式操作
};
TQuery.prototype.value = function(setting){
	if(setting){//设置
		for(var i=0;i<this.length;i++){
			this.elements[i].value = setting;
		}
		return this;
	}
	//读取
	return this.elements[0].value;
};
TQuery.prototype.html = function(setting){
	if(setting){//设置
		for(var i=0;i<this.length;i++){
			this.elements[i].innerHTML = setting;
		}
		return this;
	}
	return this.elements[0].innerHTML;
};
TQuery.prototype.text = function(setting){
	if(setting){//设置
		for(var i=0;i<this.length;i++){
			this.elements[i].innerText = this.elements[i].textContent = setting;
		}
		return this;
	}
	//读取
	return this.elements[0].innerText || this.elements[0].textContent;
};
TQuery.prototype.remove = function(){
	for(var i=0;i<this.length;i++){
		this.elements[i].remove();
	}
	return this;//返回对象,进行链式操作
};
TQuery.prototype.eq = function(n){
	var m = n || 0;
	this.length = 1;
	return $(this.elements[m]);//作为对象存进this.elements,以便链式结构
};
TQuery.prototype.get = function(n){
	n = n || 0;
	if(n=='all' && this.length>1){//如果没有参数,并且多个,则返回数组
		return this.elements;
	}
	return this.elements[n];
};
TQuery.prototype.extend = function(name,fn){
	TQuery.prototype[name] = fn;
	return this;//返回对象,进行链式操作
};
TQuery.prototype.constructor = TQuery;


//==============公共函数=================
function addEvent(obj, type, fn){
	return obj.addEventListener ?
			obj.addEventListener(type, function(e){
				var ev = window.event ? window.event : (e ? e : null);
				ev.target = ev.target || ev.srcElement;
				if( fn.call(obj,ev)===false ){//回掉函数为false,则阻止默认时间
					e.cancelBubble = true;//阻止冒泡
					e.preventDefault();//chrome,firefox下阻止默认事件
				}
			}, false)
			 :
			obj.attachEvent('on' + type, function(e){
				//fn.call(obj,e);//解决IE8下,this是window的问题
				var ev = window.event ? window.event : (e ? e : null);
				ev.target = ev.target || ev.srcElement;
				if(fn.call(obj,ev)===false ){
					e.cancelBubble = true;//阻止冒泡
					return false;//阻止默认事件,针对IE8
				}
			});
}

function hasClass(obj, cName) {
	// ( \\s|^ ) 判断前面是否有空格 (\\s | $ )判断后面是否有空格 两个感叹号为转换为布尔值 以方便做判断
	return !!obj.className.match(new RegExp("(\\s|^)" + cName + "(\\s|$)"));
}

//==============主要函数=================
function position(){
	var url = location.href,
		postIn = /.*tieba.baidu.com\/p\/.*/ig,
		postList = /.*tieba.baidu.com\/(f\?.*|[^p])/ig;
	if (postIn.test(url)) { //如果是帖子内
		return "post";//1
	} else if (postList.test(url)) { //如果在帖子列表
		return "list";//0
	}
}

function barName() {
	var $name = $(".card_title_fname").text(),
		newText = $name.replace(/\s*/ig,'');
	return newText;
}

function blockMod() {
	if (GM_getValue('setting-blockWay', defaultdConfig.blockWay) == '遮罩屏蔽') {
		return "wrap"; //遮罩模式,1
	} else {
		return "remove"; //删除节点,2
	}
}

function createList() {
	$('#showList').html(" "); //先清空,后生成
	var li = '',
		json = null,
		length = GM_listValues().length,
		key,
		value;
	for (var i = 0; i < length; i++) {
		key = GM_listValues()[i];
		value = GM_getValue(GM_listValues()[i], '');
		if (value.length < 10 || value === true || value === false) continue;
		json = JSON.parse(value);
		li +='<tr data-value=' + value + '>'+
					'<td style="min-width:100px">' + json.name + '</td>'+
					'<td style="min-width:100px">' + json.id + '</td>'+
					'<td style="min-width:75px">' + json.bar + '</td>'+
					'<td style="min-width:75px">' + json.reson + '</td>'+
					'<td style="min-width:50px"><input type="button" class="deletThis" value="删除"/></td>'+
			'</tr>';
	} //for
	$('#showList').html(li);
}

function searchInList() {
	var str = '',
		userInfo = "",
		userInfoStr = "",
		list = document.querySelectorAll('#showList tr'),
		listLength = list.length,
		inputValue = $('#sear').value();
	createList();
	$("#showList").html(" ");
	for (var i = 0; i < listLength; i++) {
		userInfo = JSON.parse($(list[i]).attr('data-value'));
		if (userInfo.name.indexOf(inputValue) >= 0 || userInfo.id.indexOf(inputValue) >= 0 || userInfo.bar.indexOf(inputValue) >= 0 || userInfo.reson.indexOf(inputValue) >= 0) { //匹配name,id,bar,reson
			userInfoStr = JSON.stringify(userInfo);
			str += '<tr data-value=' + userInfoStr + '>'+
						'<td style="width:100px">' + userInfo.name + '</td>'+
						'<td style="width:100px">' + userInfo.id + '</td>'+
						'<td style="width:75px">' + userInfo.bar + '</td>'+
						'<td style="width:75px">' + userInfo.reson + '</td>'+
						'<td style="width:50px"><input type="button" class="deletThis" value="删除"/></td>'+
					'</tr>';
		}
	} //for
	$("#showList").html(str);
}
//将脚本还原到最初状态
function clearall(){
	var length = GM_listValues().length;
	for(var i=0;i<length;i++){
		console.log(GM_deleteValue(GM_listValues()[i]) + ":" + GM_getValue(GM_listValues()[i], ''));
	}
	GM_setValue('setting-blockWay', defaultdConfig.blockWay); //屏蔽方式
	GM_setValue('setting-col', defaultdConfig.color); //默认遮罩的颜色
	GM_setValue('setting-opa', defaultdConfig.opacity); //默认遮罩透明度
	GM_setValue('setting-gus', defaultdConfig.blurpx); //默认遮罩下的高斯模糊半径
}

//==============主要对象=================
function init(){
	return new Init();
}
function Init(){
	var user,userName,userId,pos,temp,lzl,selector;
	this.user = [];//用于储存所有用户信息,包括name,id
	// this.userLzl = [];//用于储存所有用户信息,包括name,id
	selector = position()=="post" ? '#j_p_postlist>div[data-field]' : '#thread_list>li[data-field]';
	this.list = document.querySelectorAll(selector);//所有用户所占的DIV,LI
	// this.listLzl = document.querySelectorAll('.j_lzl_m_w>li[data-field]:not(.lzl_li_pager)');
	// pos = position()=="post" ? document.querySelectorAll('.l_post .d_name') : document.querySelectorAll('#thread_list>li[data-field] .threadlist_lz>.threadlist_author');//点击屏蔽,屏蔽按钮需要插入的位置
	var listLength = this.list.length;
	for(var i=0;i<listLength;i++){
		userName = position()=="post" ? JSON.parse(this.list[i].getAttribute('data-field')).author.user_name : JSON.parse(this.list[i].getAttribute('data-field')).author_name;
		userId = position()=="post" ? JSON.parse(this.list[i].getAttribute('data-field')).author.user_id : JSON.parse(this.list[i].getAttribute('data-field')).id;
		temp = {};
		temp.name = userName;
		temp.id = userId;
		this.user.push(temp);
	}
	//楼中楼
	// var listLzlLength = this.listLzl.length;
	// console.log( listLzlLength );
	// for(var j=0;j<listLzlLength;j++){
	// 	var lzlName = JSON.parse( this.listLzl[j].getAttribute("data-field").replace(/\'/ig,'\"') ).user_name;
	// 	var lzlId = "";
	// 	temp = {};
	// 	temp.name = lzlName;
	// 	temp.id = lzlId;
	// 	// console.log( lzlName );
	// 	// console.log( j );
	// 	this.userLzl.push(temp);
	// }
	return this;
}

//页面加载开始屏蔽
Init.prototype.block = function(){
	this.oMar = document.createElement("div");//创建遮罩层
	var obj,objLzl,data,oMarClone,
		listLength = GM_listValues().length,
		userLength = this.user.length,
		// userLzlLength = this.userLzl.length,
		config = {
			"blockWay": GM_getValue('setting-blockWay', defaultdConfig.blockWay),//屏蔽方式
			"color": GM_getValue('setting-col', defaultdConfig.color),//遮罩颜色
			"opacity": GM_getValue('setting-opa', defaultdConfig.opacity),//遮罩透明度
			"blur": GM_getValue('setting-gus', defaultdConfig.blurpx)//高斯模糊
		};
	$(this.oMar).attr("class","mar").css({
		"background":config.color,
		"opacity":config.opacity
	});
	for (var i = 0; i < listLength; i++) {//GM_listValues().length
		for(var j=0;j<userLength;j++){
			obj = this.list[j];//要屏蔽的模块
			if( GM_listValues()[i]==this.user[j].name ){
				if(blockMod()=="remove"){
					$(obj).css("display","none");
				}else if(blockMod()=="wrap"){
					if( $(obj).find(".mar").length >= 1 ){
						continue;
					}
					oMarClone = this.oMar.cloneNode(true);//克隆遮罩层
					//要屏蔽的模块
					$(obj).css({
						"position":"relative",
						"filter":"blur(" + config.blur +"px)",
						"-webkit-filter":"blur(" + config.blur +"px)",
						"-moz-filter":"blur(" + config.blur +"px)",
						"-o-filter":"blur(" + config.blur +"px)",
						"-ms-filter":"blur(" + config.blur +"px)",
						"backface-visibility":"hidden",
						"-webkit-backface-visibility":"hidden",
						"-moz-backface-visibility":"hidden",
						"-o-backface-visibility":"hidden",
						"-ms-backface-visibility":"hidden",
					});
					if (GM_listValues()[i] == this.user[j].name) {
						data = GM_getValue(GM_listValues()[i], '');
					}
					$(oMarClone).attr("data",data);
					obj.appendChild(oMarClone);
				}
			}
		}
		//屏蔽楼中楼
		// for(var k=0;k<userLzlLength;k++){
		// 	objLzl = this.listLzl[k];//要屏蔽的模块
		// 	if( GM_listValues()[i]==this.userLzl[k].name ){//如果匹配到
		// 		if(blockMod()=="remove"){
		// 			objLzl.style.display = "none";
		// 		}else if(blockMod()=="wrap"){
		// 			if( objLzl.querySelectorAll('.mar').length >= 1 ){
		// 				continue;
		// 			}
		// 			oMarClone = oMar.cloneNode(true);//克隆遮罩层
		// 			//要屏蔽的模块
		// 			objLzl.style.cssText = "position:relative;filter:blur(" + config.blur +"px);-webkit-filter:blur(" + config.blur + "px);-moz-filter:blur(" + config.blur + "px);-o-filter:blur(" + config.blur + "px);backface-visibility:hidden;-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;-ms-backface-visibility:hidden;";
		// 			if (GM_listValues()[i] == this.userLzl[k].name) {
		// 				data = GM_getValue(GM_listValues()[i], '');
		// 			}
		// 			oMarClone.setAttribute('data', data);
		// 			objLzl.appendChild(oMarClone);
		// 		}
		// 	}
		// }
	} //for,遍历屏蔽
};
//智能提示
Init.prototype.autoTips = function(){
	var list = [],//储存所有用户名
		temp = {},
		str = "";
	for(var i=0;i<this.user.length;i++){
		if(typeof temp[this.user[i].name]=="undefined"){
			temp[this.user[i].name] = 1;
			list.push(this.user[i].name);
		}
	}
	for(var j=0;j<list.length;j++){
		str += '<option value="' + list[j] + '" />';
	}
	$("#lst").html(str);
};
//关键字过滤
var log = [];
function key(){
	return new keyWord();
}
function keyWord(){
	//已保存的关键字
	this.wordArr = GM_getValue("keyWord",[]);
	if( this.wordArr.length<=0 || $('a.j_th_tit').length<=0 ){
		return this;
	}
	var str = this.wordArr.join("|");
	//正则匹配
	this.reg = new RegExp(""+ str +"","i");
	//所有帖子标题
	this.list = $('a.j_th_tit').get("all");
	document.querySelectorAll('a.j_th_tit');
}
keyWord.prototype.filter = function(){
	log = [];
	var list = this.list || [],
		postTitle,
		target;
	var reg = new RegExp(""+ this.wordArr.join("|") +"","i");
	for(var i=0;i<list.length;i++){
		//帖子标题
		postTitle = $(list[i]).text();
		//帖子块
		target = list[i].parentNode.parentNode.parentNode.parentNode.parentNode;
		console.log( target );
		if( reg.test(postTitle)===true ){
			log.push( postTitle );
			target.style.display = "none";
		}else{
			target.style.display = "block";
		}
	}
};
keyWord.prototype.createTag = function(){
	//生成标签
	var oFragment = document.createDocumentFragment(),
		tag = document.createElement('span'),
		cloneTag;
	tag.className = "blockTag";
	for(var k=0;k<this.wordArr.length;k++){
		cloneTag = tag.cloneNode();
		$(cloneTag).html( this.wordArr[k] );
		oFragment.appendChild(cloneTag);
	}

	$('#tag-area').html(" ").get(0).appendChild(oFragment);
};
//监听
$().extend("ob",function(){
	var target = this.elements[0];
	return new Ob(target);
});
function Ob(target){
	this.MutationObserver = window.MutationObserver || window.WebKitMutationObserver || window.MozMutationObserver;
	this.target = target;
	return this;
}
Ob.prototype.observer = function(config,fn){
	var MutationObserver = this.MutationObserver,
		observer = new MutationObserver(function(mutations){
			mutations.forEach(function(mutation) {
					fn.call(this.target);
			});
		});
	observer.observe(this.target, config);
};

//拖拽
$().extend("drag",function(pressTarget,MoveTarget,json){
	return new Drag(pressTarget,MoveTarget,json);
});
function Drag(pressTarget,MoveTarget,json){
	var _this = this;
	this.disX = 0;
	this.disY = 0;
	if(json){
		this.json = json;
	}
	this.MoveTarget = MoveTarget;
	pressTarget.onmousedown = function(e){
		_this.fnDown(e);
		return false;//chrome,firefox去除文字选中
	};
}
Drag.prototype.fnDown = function(e){//鼠标按下(未松开)
	var ev = e || window.event;
	var _this = this;
	this.disX = e.clientX - this.MoveTarget.offsetLeft;
	this.disY = e.clientY - this.MoveTarget.offsetTop;
	if(this.MoveTarget.setCaptrue){//IE,解决文字选中
		this.MoveTarget.onmousemove = function(ev){
			_this.fnMove(ev);
		};
		this.MoveTarget.onmouseup = function(){
			var this_ = this;
			_this.fnUp(this_);
		};
		this.MoveTarget.setCaptrue();//添加事件捕获
	}else{
		document.onmousemove = function(e){
			_this.fnMove(e);
		};
		document.onmouseup = function(){
			var this_ = this;
			_this.fnUp(this_);
		};
	}
};
Drag.prototype.fnMove = function(e){//鼠标移动,则div移动
	var ev = e || window.event;
	var L = this.json ? this.range(e.clientX - this.disX,this.json.L[0],this.json.L[1]) : (e.clientX - this.disX);
	var T = this.json ? this.range(e.clientY - this.disY,this.json.T[0],this.json.T[1]) : (e.clientY - this.disY);
	this.MoveTarget.style.left = L + 'px';
	this.MoveTarget.style.top = T + 'px';
};
Drag.prototype.fnUp = function(this_){//鼠标松开,则停止
		this_.onmousemove = null;
		this_.onmouseup = null;
		if( this_.setCaptrue ){
			this_.releaseCapture();//释放捕获
		}
};
Drag.prototype.range = function(iNow,iMin,iMax){
	if(iNow>iMax){
		return iMax;
	}else if(iNow<iMin){
		return iMin;
	}else{
		return iNow;
	}
};
//==============主要事件=================
$(window).bind({
	"DOMContentLoaded":function(){
		//脚本初始化
		init().block();
		//关键字过滤
		key().filter();
	},
	"load":function(){
		init().block();
		//监听翻页
		if(position()=="post" ){
			$("#j_p_postlist").ob().observer({"childList":true},function(){
				init().block();
			});
		}else{
			$('thread_list').ob().observer({"childList":true},function(){//帖子列表
				init().block();
			});
		}
		//关键字过滤
		key().filter();
	}
});
$(document).bind('click',function(e){
	var target = e.target || e.srcElement,
		id=target.id || null;
	//如果点击到ID
	if ($(target).attr('data-field') && hasClass(target.parentNode, 'd_name') || $(target).attr('data-field') && hasClass(target.parentNode, 'tb_icon_author')) { //如果点到了名字上面
		(function(target){
		var data3,name,id,parent;
		if( $("#confirmBox") ){
			$("#confirmBox").remove();
		}
		if(hasClass(target.parentNode,"d_name")){
			parent = target.parentNode.parentNode.parentNode.parentNode;
			data3 = JSON.parse($(parent).attr("data-field")).author;
			name = data3.user_name;
			id = data3.user_id;
		}else{
			parent = target.parentNode.parentNode.parentNode.parentNode.parentNode.parentNode;
			data3 = JSON.parse($(parent).attr("data-field"));
			name = data3.author_name;
			id = data3.id;
		}
		var confirmBox = document.createElement("div");
		$(confirmBox).attr("id","confirmBox").html("<p>是否屏蔽</p><p>" + name + "</p><input type='button' value='确认' id='confirm-yes' /><input type='button' value='取消' id='confirm-no' />");
		document.documentElement.appendChild(confirmBox);
		$(confirmBox).animate({"top":"100","opacity":"100"},{"end":function(){
			clearTimeout(confirmBox.fadeOut);
			this.fadeOut=setTimeout(function(){
				$(confirmBox).animate({"top":"60","opacity":"0"},{"end":function(){
					$(this).remove();
				}});
			},3000);
		}});
		$('#confirm-yes').on('click',function(){
			GM_setValue(name,'{"name":"' + name + '","id":"' + id + '","bar":"' + barName() + '","reson":"不顺眼"}');
			init().block();
			confirmBox.remove(this);
		});
		$("#confirm-no").on('click',function(){
			confirmBox.remove(this);
		});
		})(target);
		//阻止默认事件和冒泡
		return false;
	}
	//屏蔽列表删除键
	else if( hasClass(target,"deletThis") ){
		var ele = $(target.parentNode.parentNode);
		var thisKey = JSON.parse(ele.attr('data-value')).name; //获取当前结点的key
		GM_deleteValue(thisKey); //删除变量
		ele.remove(); //删除节点
	}
	//如果点击到遮罩层
	else if (hasClass(target, 'mar')){
		$(".mar").html(" ");
		//获取data数据
		var data = JSON.parse($(target).attr('data'));
		//第一次点击
		if (!target.ready) {
			$(target).css({
				"border-left":"5px solid rgb(174, 103, 34)"
			});
			target.ready = true;
		}
		//再次点击
		else if(target.ready === true){
			$(target.parentNode).css({
				"position":"relative",
				"-webkit-filter":"none",
				"-moz-filter":"none",
				"o-filter":"none",
				"ms-filter":"none",
				"filter":"none"
			});
			$(target).css({
				"background":"none",
				"opacity":"1",
				"filter":"alpha(opacity=100)"
			}).html('<input type="button" id="keeplock" value="继续屏蔽" /><input type="button" id="unlockNow" value="暂时解除 "/><input type="button" id="unlock" value="永久解除" />' + '<p>' + data.name + '(' + data.id + '),其在' + data.bar + '因[' + data.reson + ']被屏蔽' + '</p>');
			target.ready = null;
		}
	}
	//点击屏蔽关键字删除
	else if( hasClass(target, 'blockTag') ){
		var word = $(target).text();
		var arr = GM_getValue("keyWord",[]);
		var temp = [];
		for(var i=0;i<arr.length;i++){
			if(arr[i]!=word){
				temp.push( arr[i] );
			}
		}
		GM_setValue("keyWord",temp);
		$(target).remove();
		//重新屏蔽
		// keyfilter();
		key().filter();
		return false;
	}
	else{
		switch(id){
			//解除屏蔽
			case "unlock" :
				var $ele1 =  $(target.parentNode);
				var data2 = JSON.parse( $ele1.attr("data") );
				GM_deleteValue(data2.name); //删除键名
				$ele1.remove();
				break;
			//暂时解除
			case "unlockNow" : 
				target.parentNode.remove(this);
				break;
			//继续屏蔽
			case "keeplock" : 
				var targetParent = target.parentNode;
				var config = {
					"blockWay": GM_getValue('setting-blockWay', defaultdConfig.blockWay),//屏蔽方式
					"color": GM_getValue('setting-col', defaultdConfig.color),//遮罩颜色
					"opacity": GM_getValue('setting-opa', defaultdConfig.opacity),//遮罩透明度
					"blur": GM_getValue('setting-gus', defaultdConfig.blurpx)//高斯模糊
				};
				$(targetParent.parentNode).css({
					"position":"relative",
					"filter":"blur(" + config.blur +"px)",
					"-webkit-filter":"blur(" + config.blur + "px)",
					"-moz-filter":"blur(" + config.blur + "px)",
					"-o-filter":"blur(" + config.blur + "px)",
					"-ms-filter":"blur(" + config.blur + "px)",
					"backface-visibility":"hidden",
					"-webkit-backface-visibility":"hidden",
					"-moz-backface-visibility":"hidden",
					"-o-backface-visibility":"hidden",
					"-ms-backface-visibility":"hidden"
				});
				$(targetParent).css({
					"opacity":config.opacity,
					"background":config.color,
					"border":"none"
				}).html(" ");
				break;
			//退出
			case "queit" : 
				$('#pannal,#wrap').remove();
				document.body.className = '';
				break;
			case "wrap" : 
				$('#pannal,#wrap').remove();
				document.body.className = '';
				break;
			//保存
			case "save" : 
				//判断屏蔽方式
				GM_setValue('setting-blockWay', $("#blockWay").value() );
				//遮罩颜色
				GM_setValue('setting-col', $("#col").value() );
				//遮罩透明度1
				GM_setValue('setting-opa', $('#opa').value() );
				//高斯模糊半径
				GM_setValue('setting-gus', $('#gus').value());
				//添加黑名单
				var name = $('#userName').value();
				if(name === "" || name === null){
					return;
				}
				GM_setValue($('#userName').value(), '{"name":"' + $('#userName').value() + '","id":"' + $("#userId").value() + '","bar":"' + $("#curBar").value() + '","reson":"' + $("#reson").value() + '"}');
				init().block();
				createList();//重新生成列表
				break;
			//初始化
			case "clear" : 
				clearall();
				createList();
				break;
			//添加关键字
			case "addWord":
				var input = $("#blockWord").value();
				if(input===""){
					return;
				}
				var keyArr = GM_getValue("keyWord",[]);
				keyArr.push(input);
				var a = {};
				var newTemp = [];
				for(var f=0;f<keyArr.length;f++){
					if(typeof (a[ keyArr[f] ]) == "undefined" ){
						a[ keyArr[f] ] = 1;
						newTemp.push( keyArr[f] );
					}
				}
				GM_setValue("keyWord",newTemp);
				//生成标签
				key().createTag();
				//过滤
				key().filter();
				break;
			//显示日志
			case "showLog":
				var str = "";
				for(var x=0;x<log.length;x++){
					str += "<p>" + log[x] + "</p>";
				}
				$("#tag-log").html(str);
				break;
			default:
				return;
		}
	}
});

$(document).bind('input',function(e){
	var target = e.target || e.srcElement,
		id = target.id;
	switch(id){
		case "sear" : 
			searchInList();
			break;
		case "opa" : 
			$('#opa-text').html( $('#opa').value() );
			break;
		case "gus" : 
			$('#gus-text').html( $('#gus').value() );
			break;
		case "userName" : 
			if( $("#lst").html() === "" || $("#lst").html() === null ){
				init().autoTips();
			}
			break;
		default : 
			return;
	}
});

$(window).bind('keyup',function(e){
	var target = e.target || e.srcElement;
	if(e.keyCode==8){//backspace
		if ( target.id=="sear" && target.value === '') {
			createList();
			return;
		}
	}else if(e.ctrlKey && e.keyCode == 114){//快捷键ctrl+F3
		if( $("#pannal").length>=1 ){
			return;
		}
		var oFragment = document.createDocumentFragment(),//创建文档碎片
			pannal = document.createElement('div'),//控制面板
			pannal_wrap = pannal.cloneNode(false),//遮罩层
			config = {
				"blockWay": GM_getValue('setting-blockWay', defaultdConfig.blockWay),//屏蔽方式
				"color": GM_getValue('setting-col', defaultdConfig.color),//遮罩颜色
				"opacity": GM_getValue('setting-opa', defaultdConfig.opacity),//遮罩透明度
				"blur": GM_getValue('setting-gus', defaultdConfig.blurpx)//高斯模糊
			};
		$(pannal_wrap).attr("id","wrap");
		$(pannal).attr("id","pannal");
		pannal.innerHTML = '\
					<h3 id="pannal-tittle" style="cursor:move;font-size:20px;line-height:20px;color:#fff;background:#165557;">配置参数</h3>\
					<div id="pannal-setting">\
						屏蔽方式:<select id="blockWay">\
									<option>遮罩屏蔽</option>\
									<option>删除节点</option>\
								</select><br/>\
						遮罩层颜色:<input id="col" type="color" value="'+config.color+'" /><br/>\
						遮罩透明度(0~1):<span id="opa-text">'+config.opacity+'</span><input id="opa" type="range" value="'+config.opacity+'" min="0" max="1" step="0.1" /><br/>\
						高斯模糊像素(0~10):<span id="gus-text">'+config.blur+'</span><input id="gus" type="range" value="'+config.blur+'" min="0" max="10" step="1" /><br/>\
					</div>\
					<hr/>\
					<h3>添加讨厌鬼</h3>\
					<div id="addBlackList">\
						数字ID(选填):<input id="userId" type="text" placeholder="user_id"/><br/>\
						贴吧ID(必填):<input id="userName" type="text" placeholder="user_name" list="lst" autocomplete="off"/><br/>\
						<datalist id="lst" autocomplete="on"></datalist>\
						所在贴吧:<input id="curBar" type="text" value="'+barName()+'" /><br/>\
						屏蔽原因:<input id="reson" type="text" list="lstr" value="" />\
					</div>\
					<hr/>\
					<h3>功能</h3>\
					<div id="fn">\
						<input id="save" type="button" value="保存" />\
						<input id="clear" type="button" value="初始化" />\
						<input id="view" type="button" value="列表" />\
					</div>\
					<div id="list" style="margin:0;">\
						<input id="sear" type="text" list="BlackList" placeholder="搜索" autocomplete="off" />\
						<table id="showList"></table>\
					</div>\
					<div id="block-keyWord">\
						<input type="text" placeholder="输入关键字" id="blockWord" /><input type="button" value="添加" id="addWord" /></br>\
						<div id="tag-area"></div>\
						<input type="button" value="查看日志" id="showLog" />\
						<div id="tag-log"></div>\
					</div>\
					<span id="queit">X</span>\
		';
		oFragment.appendChild(pannal);
		oFragment.appendChild(pannal_wrap);
		document.body.className = 'blur';
		document.documentElement.appendChild(oFragment);
		//居中
		$(pannal).css({
			"top": ($().size('clientHeight') - pannal.offsetHeight) / 2 + "px",
			"left":($().size('clientWidth') - pannal.offsetWidth) / 2 + "px"
		});
		//初始化数据
		$('#blockWay').attr('value',GM_getValue('setting-blockWay', defaultdConfig.blockWay) );//屏蔽方式
		//生成屏蔽名单列表
		createList();	
		//生成关键字标签
		// creatTag();
		key().createTag();
		//可拖拽
		$().drag( $('#pannal-tittle').get(0),pannal );
		//展开收起
		$('#view').toggle(function(){
			var height = parseInt( pannal.offsetHeight );
			$('#list').animate({"height":height},{"end":function(){
				$(this).css({
					"display":"block",
					"height":height,
					"overflow":"auto"
				});
			}});
			$('#block-keyWord').animate({"height":height},{"end":function(){
				$(this).css({
					"disable":"block",
					"height":height,
					"overflow":"auto"
				});
			}});
		},function(){
			$('#list').animate({"height":"0"});
			$('#block-keyWord').animate({"height":"0"});
		});
	}
});



//==============样式=================
var style = '\
	body{\
		-webkit-backface-visibility:hidden;\
	}\
	.blur{\
		filter:blur(5px) grayscale();\
		-webkit-filter:blur(5px) grayscale();\
		-moz-filter:blur(5px) grayscale();\
		-o-filter:blur(5px) grayscale();\
		-ms-filter:blur(5px) grayscale();\
	}\
	#pannal{\
		width:200px;\
		height:auto;\
		background:rgba(38, 50, 56, 1);\
		color:#fff;\
		position:fixed;\
		z-index:1000000000;\
		text-align:center;\
		box-shadow:0 0 20px 5px #000000;\
	}\
	#pannal>div{\
		margin:10px 0;\
	}\
	#pannal input{\
		color:#3e3e3e;\
		border:1px solid transparent;\
		height:20px;\
		line-height:20px;\
	}\
	#pannal input:focus{\
		background-color:rgba(38, 50, 56, 1);\
		color:#fff;\
		border:1px solid;\
		transition:all 0.2s ease-in-out;\
	}\
	#pannal h3{\
		color:rgb(0, 255, 226);\
	}\
	#pannal-setting input[type=range]{\
		width:80%;\
	}\
	#fn input{\
		padding:5px 10px;\
		margin:0 5px;\
		cursor:pointer;\
	}\
	#fn input:hover{\
		background:#004d40;\
		color:#fff;\
	}\
	#pannal>span#queit{\
		position:absolute;\
		width:21px;\
		height:21px;\
		line-height:21px;\
		font-size:21px;\
		top:0;\
		right:0;\
		cursor:pointer;\
		opacity:0.8;\
		background:#fff;\
		color:#303030;\
	}\
	#blockWay{\
		color:#3e3e3e;\
		border:none;\
	}\
	#wrap{\
		position:fixed;\
		width:100%;\
		height:100%;\
		background:rgba(155, 155, 155,0.5);\
		top:0;\
		left:0;\
		z-index:999999999;\
	}\
	.mar{\
		width:100%;\
		height:100%;\
		position:absolute;\
		top:0;\
		left:0;\
		z-index:999999998;\
		-webkit-backface-visibility:hidden;\
		text-align:center;\
		font-size:16px;\
	}\
	.mar input{\
		background:#303030;\
		color:#fff;\
		padding:5px 10px;\
		margin:5px 10px;\
		font-family:"宋体";\
		font-size:14px;\
		border:none;\
	}\
	.mar input:hover{\
		background:#004d40;\
		transition:all 0.2s ease-in-out;\
	}\
	.mar p{\
		color:##2B2929;\
		font-weight:bold;\
		background-color:rgba(72, 70, 70, 0.35);\
		line-height:30px;\
		width:60%;\
		margin:0 auto;\
	}\
	.mar p:hover{\
		color:#fff;\
		background-color:#004d40;\
		transition:all 0.2s ease-in-out;\
	}\
	#list{\
		position:absolute;\
		top:0;\
		left:200px;\
		width:400px;\
		height:0;\
		overflow:hidden;\
		background:inherit;\
		margin:0;\
	}\
	#list tr:hover{\
		background:#004d40;\
		transition:all 0.2s ease-in-out;\
	}\
	.key{\
		float:left;\
		clear:both;\
		margin-left:10px;\
		width:120px;\
		text-align:left;\
		overflow:hidden;\
		text-overflow:ellipsis;\
		white-space:nowrap;\
	}\
	.col{\
		border:none;\
	}\
	.deletThis{\
		float:right;\
		cursor:pointer;\
		margin-right:10px;\
		padding:0 5px;\
		border:0;\
		height:18px;\
	}\
	.disable-btn{\
		background:#6B6B6B;\
		cursor:not-allowed;\
	}\
	#addBlackList input{\
		width:80%;\
	}\
	/*userName列表*/\
	#thread_list>li[data-field] .threadlist_lz>.threadlist_author:hover,.l_post .d_name:hover{\
		background:#004d40;\
		transition:all 0.2s ease-in-out;\
	}\
	#sear{\
		position:relative;\
		margin:0 auto;\
		text-align:center;\
		height:21px;\
		width:100%;\
		border:none;\
	}\
	#confirmBox{\
		width:300px;\
		background:rgba(5, 49, 43, 0.8);\
		position:fixed;\
		left:50%;\
		top:60px;\
		margin-left:-150px;\
		text-align:center;\
		z-index:999999;\
		opacity:0;\
		box-shadow:1px 1px 10px 2px #000000;\
	}\
	#confirmBox input{\
		border:none;\
		padding:10px 30px;\
		margin:10px;\
		cursor:pointer;\
	}\
	#confirmBox input:hover{\
		background:#004d40;\
		transition:all 0.2s ease-in-out;\
	}\
	#confirmBox p{\
		font-size:18px;\
		color:#fff;\
		margin-top:20px;\
	}\
	#block-keyWord{\
		position:absolute;\
		top:0;\
		right:100%;\
		width:200px;\
		height:0;\
		margin:0 !important;\
		padding:0;\
		background-color:inherit;\
		overflow:auto;\
	}\
	span.blockTag{\
		padding:5px 10px;\
		display:inline-block;\
		border:1px solid;\
		border-radius:5px;\
		position:relative;\
		margin:2px 5px;\
	}\
	span.blockTag:hover{\
		background:#08454A;\
	}\
	#blockWord{\
		margin:10px 0;\
	}\
	#addWord{\
		padding:0 5px !important;\
		background-color:transparent !important;\
		border:1px solid #fff !important;\
		color:#fff !important;\
	}\
	#addWord:hover{\
		background-color:rgb(1, 84, 68) !important;\
	}\
	#tag-log>p{\
		margin:10px 0;\
		text-align:left;\
		text-indent:2em;\
		line-height:2em;\
	}\
	#tag-log>p:hover{\
		background:#004d40;\
		transition:all 0.2s ease-in-out;\
	}\
';
GM_addStyle(style);
})(window,document);