remove the posts which make you sick

移除讨厌鬼的帖子

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

您需要先安装一款用户脚本管理器扩展,例如 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.10
// @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==
// 
(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.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.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(),
		$list = $("#showList");
	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;
	this.user = [];//用于储存所有用户信息,包括name,id
	// this.userLzl = [];//用于储存所有用户信息,包括name,id
	this.list = position()=="post" ? document.querySelectorAll('#j_p_postlist>div[data-field]') : document.querySelectorAll('#thread_list>li[data-field]');//所有用户所占的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);
};
//监听
$().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();
	},
	"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();
			});
		}
	}
});
$(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;
			// target.style.borderLeft = '5px solid rgb(174, 103, 34)';
		}
		//再次点击
		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{
		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;
			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>\
					<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();
		//可拖拽
		$().drag( $('#pannal-tittle').get(0),pannal );
		//展开收起
		$('#view').toggle(function(){
			$('#list').animate({
				// "height":parseInt( $('#pannal').style("height") )
				"height":parseInt( pannal.offsetHeight )
			});
		},function(){
			$('#list').animate({"height":"0"});
		});
	}
});



//==============样式=================
var style = '\
	body{\
		-webkit-backface-visibility: hidden;\
	}\
	/*给body添加滤镜*/\
	.blur{\
		-webkit-filter: blur(5px) grayscale();\
		-moz-filter: blur(5px) grayscale();\
		-o-filter: blur(5px) grayscale();\
		-ms-filter: blur(5px) grayscale();\
		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:10px;\
		margin:0 5px;\
		cursor:pointer;\
	}\
	#fn input:hover{\
		background:#004d40;\
		color:#fff;\
	}\
	#pannal>span{\
		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-x:hidden;\
		overflow-y:auto;\
		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;\
	}\
';
GM_addStyle(style);
})(window,document);