searchEngineJump-NextStage

方便的在各个引擎之间跳转。可自定义搜索列表的 NLF 修改版。

// ==UserScript==
// @name			searchEngineJump-NextStage
// @author			ted423
// @contributor		NLF && ywzhaiqi
// @description		方便的在各个引擎之间跳转。可自定义搜索列表的 NLF 修改版。
// @version			10.2022.0605.0
// @include			*
// @namespace		https://github.com/ted423
// @require			https://code.jquery.com/jquery-3.3.1.min.js
// @grant			GM_getValue
// @grant			GM_setValue
// @grant			GM_addStyle
// @grant      		GM_registerMenuCommand
// @run-at			document-start
// ==/UserScript==


(function() {
	"use strict";
	var prefs = {
		display: true,
		openInNewTab: true, //是否在新页面打开.
		engineListDataType: "ted423", //搜索列表默认类型
		debug: false
	};
	var svg ={
		list: '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 511.626 511.626"><path d="M63.953 164.453H9.135c-2.474 0-4.615.9-6.423 2.709C.903 168.972 0 171.114 0 173.589v54.817c0 2.473.903 4.619 2.712 6.424 1.809 1.803 3.949 2.712 6.423 2.712h54.818c2.474 0 4.615-.905 6.423-2.712 1.809-1.809 2.712-3.951 2.712-6.424v-54.817c0-2.475-.904-4.617-2.712-6.427-1.808-1.806-3.949-2.709-6.423-2.709zM63.953 383.722H9.135c-2.474 0-4.615.896-6.423 2.707C.903 388.238 0 390.378 0 392.854v54.82c0 2.471.903 4.609 2.712 6.42 1.809 1.813 3.949 2.714 6.423 2.714h54.818c2.474 0 4.615-.903 6.423-2.714 1.809-1.807 2.712-3.949 2.712-6.42v-54.82c0-2.477-.904-4.616-2.712-6.426-1.808-1.803-3.949-2.706-6.423-2.706zM63.953 274.082H9.135c-2.474 0-4.615.91-6.423 2.714S0 280.749 0 283.22v54.815c0 2.478.903 4.62 2.712 6.427 1.809 1.808 3.949 2.707 6.423 2.707h54.818c2.474 0 4.615-.896 6.423-2.707 1.809-1.807 2.712-3.949 2.712-6.427V283.22c0-2.471-.904-4.613-2.712-6.424-1.808-1.807-3.949-2.714-6.423-2.714zM63.953 54.817H9.135c-2.474 0-4.615.903-6.423 2.712S0 61.479 0 63.953v54.817c0 2.475.903 4.615 2.712 6.424s3.949 2.712 6.423 2.712h54.818c2.474 0 4.615-.9 6.423-2.712 1.809-1.809 2.712-3.949 2.712-6.424V63.953c0-2.475-.904-4.615-2.712-6.424-1.808-1.804-3.949-2.712-6.423-2.712zM502.49 383.722H118.771c-2.474 0-4.615.896-6.423 2.707-1.809 1.81-2.712 3.949-2.712 6.426v54.82c0 2.471.903 4.609 2.712 6.42 1.809 1.813 3.946 2.714 6.423 2.714H502.49c2.478 0 4.616-.903 6.427-2.714 1.81-1.811 2.71-3.949 2.71-6.42v-54.82c0-2.477-.903-4.616-2.71-6.426-1.811-1.804-3.95-2.707-6.427-2.707zM502.49 274.082H118.771c-2.474 0-4.615.91-6.423 2.714s-2.712 3.953-2.712 6.424v54.815c0 2.478.903 4.62 2.712 6.427 1.809 1.808 3.946 2.707 6.423 2.707H502.49c2.478 0 4.616-.896 6.427-2.707 1.81-1.807 2.71-3.949 2.71-6.427V283.22c0-2.471-.903-4.613-2.71-6.424-1.811-1.804-3.95-2.714-6.427-2.714zM508.917 57.529c-1.811-1.805-3.949-2.712-6.427-2.712H118.771c-2.474 0-4.615.903-6.423 2.712s-2.712 3.949-2.712 6.424v54.817c0 2.475.903 4.615 2.712 6.424s3.946 2.712 6.423 2.712H502.49c2.478 0 4.616-.9 6.427-2.712 1.81-1.809 2.71-3.949 2.71-6.424V63.953c-.001-2.474-.904-4.615-2.71-6.424zM502.49 164.453H118.771c-2.474 0-4.615.9-6.423 2.709-1.809 1.81-2.712 3.952-2.712 6.427v54.817c0 2.473.903 4.615 2.712 6.424 1.809 1.803 3.946 2.712 6.423 2.712H502.49c2.478 0 4.616-.905 6.427-2.712 1.81-1.809 2.71-3.951 2.71-6.424v-54.817c0-2.475-.903-4.617-2.71-6.427-1.811-1.806-3.95-2.709-6.427-2.709z"/></svg>',
		setting: '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 438.529 438.529"><path d="M436.25 181.438c-1.529-2.002-3.524-3.193-5.995-3.571l-52.249-7.992c-2.854-9.137-6.756-18.461-11.704-27.98 3.422-4.758 8.559-11.466 15.41-20.129 6.851-8.661 11.703-14.987 14.561-18.986 1.523-2.094 2.279-4.281 2.279-6.567 0-2.663-.66-4.755-1.998-6.28-6.848-9.708-22.552-25.885-47.106-48.536-2.275-1.903-4.661-2.854-7.132-2.854-2.857 0-5.14.855-6.854 2.567l-40.539 30.549c-7.806-3.999-16.371-7.52-25.693-10.565l-7.994-52.529c-.191-2.474-1.287-4.521-3.285-6.139C255.95.806 253.623 0 250.954 0h-63.38c-5.52 0-8.947 2.663-10.278 7.993-2.475 9.513-5.236 27.214-8.28 53.1-8.947 2.86-17.607 6.476-25.981 10.853l-39.399-30.549c-2.474-1.903-4.948-2.854-7.422-2.854-4.187 0-13.179 6.804-26.979 20.413-13.8 13.612-23.169 23.841-28.122 30.69-1.714 2.474-2.568 4.664-2.568 6.567 0 2.286.95 4.57 2.853 6.851 12.751 15.42 22.936 28.549 30.55 39.403-4.759 8.754-8.47 17.511-11.132 26.265l-53.105 7.992c-2.093.382-3.9 1.621-5.424 3.715C.76 182.531 0 184.722 0 187.002v63.383c0 2.478.76 4.709 2.284 6.708 1.524 1.998 3.521 3.195 5.996 3.572l52.25 7.71c2.663 9.325 6.564 18.743 11.704 28.257-3.424 4.761-8.563 11.468-15.415 20.129-6.851 8.665-11.709 14.989-14.561 18.986-1.525 2.102-2.285 4.285-2.285 6.57 0 2.471.666 4.658 1.997 6.561 7.423 10.284 23.125 26.272 47.109 47.969 2.095 2.094 4.475 3.138 7.137 3.138 2.857 0 5.236-.852 7.138-2.563l40.259-30.553c7.808 3.997 16.371 7.519 25.697 10.568l7.993 52.529c.193 2.471 1.287 4.518 3.283 6.14 1.997 1.622 4.331 2.423 6.995 2.423h63.38c5.53 0 8.952-2.662 10.287-7.994 2.471-9.514 5.229-27.213 8.274-53.098 8.946-2.858 17.607-6.476 25.981-10.855l39.402 30.84c2.663 1.712 5.141 2.563 7.42 2.563 4.186 0 13.131-6.752 26.833-20.27 13.709-13.511 23.13-23.79 28.264-30.837 1.711-1.902 2.569-4.09 2.569-6.561 0-2.478-.947-4.862-2.857-7.139-13.698-16.754-23.883-29.882-30.546-39.402 3.806-7.043 7.519-15.701 11.136-25.98l52.817-7.988c2.279-.383 4.189-1.622 5.708-3.716 1.523-2.098 2.279-4.288 2.279-6.571v-63.376c.005-2.474-.751-4.707-2.278-6.707zm-165.304 89.501c-14.271 14.277-31.497 21.416-51.676 21.416-20.177 0-37.401-7.139-51.678-21.416-14.272-14.271-21.411-31.498-21.411-51.673 0-20.177 7.135-37.401 21.411-51.678 14.277-14.272 31.504-21.411 51.678-21.411 20.179 0 37.406 7.139 51.676 21.411 14.274 14.277 21.413 31.501 21.413 51.678 0 20.175-7.138 37.403-21.413 51.673z"/></svg>'
	};
	var engineListData = {
		custom: "",
		ted423: "网页\n	Google\n		Google, https://www.google.com/search?q=%s&safe=off\n		Google.hk, https://www.google.com.hk/search?q=%s&safe=off\n		Google.co.jp,https://www.google.co.jp/search?q=%s&safe=off\n	百度, https://www.baidu.com/s?wd=%s\n	360, https://www.so.com/s?q=%s\n	Bing\n		Bing(CN), https://cn.bing.com/search?q=%s\n		Bing(Global), https://global.bing.com/search?q=%s&setmkt=en-us&setlang=en-us\n	搜狗, https://www.sogou.com/web?query=%s\n	DuckDuckGo, https://duckduckgo.com/?q=%s\n	Yahoo\n		Yahoo, https://search.yahoo.com/search?p=%s\n		Yahoo(tw), https://tw.search.yahoo.com/search?p=%s\n 		Yahoo.co.jp, https://search.yahoo.co.jp/search?p=%s&aq=-1&x=wrt\n	Startpage, https://www.startpage.com/do/search?q=%s\n资料\n	Wiki\n		ZWiki, https://zh.wikipedia.org/w/index.php?search=%s&button=&title=Special%3ASearch\n		EWiki, https://en.wikipedia.org/w/index.php?search=%s&button=&title=Special%3ASearch\n		JWiki, https://ja.wikipedia.org/w/index.php?search=%s&button=&title=Special%3ASearch\n	百度百科, https://baike.baidu.com/searchword/?word=%s\n	Internet Archive, https://archive.org/search.php?query=%s\n	Scholar, http://scholar.google.com/scholar?hl=zh-CN&q=%s&btnG=&lr=\n	百度学术, https://xueshu.baidu.com/s?wd=%s\n	知乎, https://www.zhihu.com/search?q=%s\n	萌娘百科, http://zh.moegirl.org/index.php?search=%s\n	Google Book, https://www.google.com/search?q=%s&btnG=搜索图书&tbm=bks&tbo=1&hl=zh-CN&gws_rd=ssl\n	中国知网, https://kns.cnki.net/KNS8/DefaultResult/Index?dbcode=CFLS&kw=%s\n	爱学术, https://www.ixueshu.com/search/index.html?search_type=&q=%s\n	维普, http://lib.cqvip.com/Qikan/Search/Index?from=Qikan_Search_Index/%post#key=u%3D%s#indexKey=%s\n	开发\n		stackoverflow, https://stackoverflow.com/search?q=%s\n		MDN, https://developer.mozilla.org/en-US/search?q=%s\n		github, https://github.com/search?q=%s\n		krugle, http://opensearch.krugle.org/document/search/#query=%s\n		npm, https://www.npmjs.org/search?q=%s\n地图\n	百度, http://map.baidu.com/?newmap=1&s=s%26wd%3D%s\n	Google, https://www.google.com/maps/search/%s/\n	Bing, https://www.bing.com/ditu/?q=%s\n	搜狗, https://map.sogou.com/#lq=%s\n音乐\n	千千, https://music.taihe.com/search?word=%s\n	QQ, https://y.qq.com/portal/search.html#page=1&searchid=1&t=song&w=%s\n	一听, https://so.1ting.com/song?q=%s\n	虾米, http://www.xiami.com/search?key=%s\n	piapro, https://piapro.jp/search/?view=audio&keyword=%s\n	刘志进, https://music.liuzhijin.cn/?name=%s&type=qq\n	歌词\n		QQ歌词, https://y.qq.com/portal/search.html#page=1&searchid=1&t=lyric&w=%s\n		一听歌词, https://so.1ting.com/lyric?q=%s\n		歌词迷, http://gecimi.com/search/?keyword=%s\n图片\n	百度, http://image.baidu.com/search/index?tn=baiduimage&word=%s\n	Google, https://www.google.com.hk/search?tbm=isch&q=%s\n	花瓣, https://huaban.com/search/?q=%s\n	Picsearch, http://cn.picsearch.com/index.cgi?q=%s\n	Flickr, https://www.flickr.com/search/?w=all&q=%s\n	Pixiv, http://www.pixiv.net/search.php?s_mode=s_tag&word=%s\n	dA, https://www.deviantart.com/browse/all/?q=%s\n下载\n	BTDigg, https://btdig.com/search?q=%s\n	idope, https://idope.se/torrent-list/%s\n	TK, https://www.torrentkitty.tv/search/%s\n	limetorrents\n		co, https://www.limetorrents.co/search/all/%s\n		asia, https://www.limetorrents.asia/search/all/%s\n		pro, https://www.limetor.pro/search/all/%s\n	ED2K\n		xiaohx, https://v1.xiaohx.org/search?key=%s\n		cdsoso, https://www.cdsoso.cc/searches-%s-hot-1-null.html\n	字幕\n		zimuku, https://zimuku.org/search?q=%s&vertoken=d49cac93\n		射手网(伪), https://assrt.net/sub/?searchword=%s\n		sub HD, https://subhd.la/search/%s\n		Subscene, https://subscene.com/subtitles/searchbytitle%post#query=%s\n		R3SUB, https://r3sub.com/search.php?s=%s\n影视\n	torrentfunk2, https://www.torrentfunk2.com/all/torrents/%s.html?v=&smi=&sma=&i=250\n	thepiratebay, https://thepiratebay.org/search/%s\n	zooqle, https://zooqle.com/search?q=%s\n	pianyuan, http://www.pianyuan.la/search?q=%s\n	Torrentz2, https://www.torrentz2.xyz/?q=%s\n	Torrentz2k, https://torrentz2k.xyz/search/%post#q=%s#category=all\n	1337x.to, https://www.1377x.to/search/%s/1/\n	Torlock, https://www.torlock2.com/all/torrents/%s.html\n	YourBT, https://yourbittorrent2.com/?q=%s\n	TD, https://www.torrentdownloads.me/search/?search=%s\n	xiaohx, https://www.xiaohx.org/search?key=%s\n	RARBG\n		rarbgprx, https://rarbgprx.org/torrents.php?search=%s\n		rarbgproxy, https://rarbgproxy.org/torrents.php?search=%s\n	kickass(镜像1), https://kat.sx/search.php?q=%s\n	kickass(镜像2)\n		kickasstorrents, https://kickasstorrents.to/usearch/%s\n		kickass1.to, https://kickass1.to/usearch/%s/\n		kat.am, https://kat.am/usearch/%s/\n		kickasstorrent.cr, https://kickasstorrent.cr/usearch/%s/\nACG\n	nyaa.si, https://nyaa.si/?f=0&c=0_0&q=%s\n	dmhy, https://share.dmhy.org/topics/list?keyword=%s\n	Tokyotosho, https://www.tokyotosho.info/search.php?terms=%s\n	Mikan, http://mikanani.me/Home/Search?searchstr=%s\n	*MioBT*, http://www.miobt.com/search.php?keyword=%s\n	shana project, https://www.shanaproject.com/search/?title=%s\n	简单动漫, https://www.36dm.com/search.php?keyword=%s\n	KOTOMI RSS, https://moe4sale.in/?kw=%s\n	ACG狗狗, http://bt.acg.gg/search.php?keyword=%s\n	ACG.RIP, https://acg.rip/?term=%s\n	AcgnX, https://www.acgnx.se/search.php?sort_id=0&keyword=%s\n	末日動漫, https://share.acgnx.se/search.php?sort_id=0&keyword=%s\nSukebei\n	nyaa.si, https://sukebei.nyaa.si/?f=0&c=0_0&q=%s\n	Glodls, https://glodls.to/search_results.php?search=%s\n	AniDex, https://anidex.info/?q=%s\n	AcgnX Ero, https://www.anix.moe/search.php?sort_id=0&keyword=%s\n	AniRena, https://www.anirena.com/?s=%s\n	GGBases, http://www.ggbases.com/search.so?title=%s\n网购\n	一淘, https://www.etao.com/search.htm?nq=%s\n	京东, https://search.jd.com/Search?keyword=%s&enc=utf-8\n	淘宝, https://s.taobao.com/search?q=%s\n	亚马逊, https://www.amazon.cn/s/ref=nb_ss?keywords=%s\netc\n	邮编库, http://www.youbianku.com/%s\n	AMO, https://addons.mozilla.org/zh-CN/firefox/search/?q=%s\n	汉典(字), http://www.zdic.net/sousuo/?q=%s&tp=tp1\n	汉典(词), http://www.zdic.net/sousuo/?q=%s&tp=tp3",
	};

	var MAIN_CSS = "#sej-button{\n	position: fixed;\n    top: 0px;\n    left: 0px;\n    width: 14px;\n    height: 14px;\n    background: grey;\n    border-radius: 7px !important;\n    display: block;\n    z-index: 91111111111;\n    cursor: crosshair;\n}\n#sej-container{\n	position:fixed;\n	top:0px;\n	z-index:91111111111;\n	margin:0;\n	background: white;\n	box-shadow:0px 0px 3px #aaaaaa;\n	margin:0 auto;\n	display:table;\n	font-family: Comic Sans MS, 'Microsoft YaHei', 微软雅黑;\n	line-height: 1.5;\n	font-size: 9px;\n	transition: opacity 0.5s ease-in-out;\n}\nsejul{\n	border: 1px solid #333;\n}\n#sej-container svg{\n	height:15px;\n	vertical-align: text-bottom;\n	padding-right: 1px;\n}\n#sej-container button{\n	font-size:9px;\n}\n\nsejul, sejli{\n	margin: 0;\n	padding: 0;\n	list-style: none outside;\n}\nsejli{\n	display: list-item;\n}\nsejli:hover>sejul{\n	display:block;\n}\nbody>sejul>sejli{\n	float: left;\n}\nsejli sejul{\n	position: absolute;\n}\nsejli sejul sejul{\n	margin-left: 100px;\n	margin-top: -30px;\n}\nsejli sejul .sej-engine{\n	padding: 4px 0px;\n	width:100%;\n	text-align: left;\n	text-indent: 5px;\n}\n#sej-container>sejli{\n	float: left;\n	border-right: 1px solid #333;\n}\n#sej-container>sejli:last-child{\n	border-right: none;\n}\n#sej-expanded-category{\n	display: inline-block;\n	font-weight: bold;\n	padding: 0px 4px;\n	line-height: 2;\n}\n#sej-expanded-category::after{\n	content:' :';\n}\n.sej-engine{\n	line-height: 2;\n	display: inline-block;\n	margin: 0;\n	border: none;\n	padding: 0px 4px;\n	text-decoration: none;\n	transition: background-color 0.15s ease-in-out;\n}\na.sej-engine{\n	white-space: nowrap;\n	min-width: 55px;\n	text-align: center;\n}\nbutton.sej-engine{\n	background-color: #FFFFFF;\n	font-family: Comic Sans MS, 'Microsoft YaHei', 微软雅黑;\n	color: #120886;\n	cursor:pointer;\n}\na.sej-engine:visited, a.sej-engine:active{\n	color: #120886;\n}\na.sej-engine:link, a.sej-engine:visited{\n	text-decoration: none;\n}\n.sej-drop-list-trigger-shown{\n	background-color: #DEEDFF !important;\n}\n.sej-drop-list-trigger::after {\n	content:\'\';\n	display: inline-block;\n	margin: 0 0 0 3px;\n	padding: 0;\n	width: 0;\n	height: 0;\n	border-top: 6px solid #BCBCBC;\n	border-right: 5px solid transparent;\n	border-left: 5px solid transparent;\n	border-bottom: 0px solid transparent;\n	transition: -webkit-transform 0.3s ease-in-out;\n	transition: transform 0.3s ease-in-out;\n	vertical-align: unset;\n}\n.sej-drop-list-trigger-shown::after {\n	-webkit-transform: rotate(180deg);\n	transform: rotate(180deg);\n}\n.sej-engine:hover {\n	background-color: #EAEAEA;\n}\n.sej-engine-icon {\n	display: inline-block;\n	height: 16px;\n	border: none;\n	padding: 0;\n	margin: 0 3px 0 0;\n	vertical-align: sub;\n}\n.sej-drop-list {\n	display: none;\n	float: left;\n	min-width: 100px;\n	font-size: 13px;\n	-moz-box-shadow: 2px 2px 5px #ccc;\n	-webkit-box-shadow: 2px 2px 5px #ccc;\n	box-shadow: 2px 2px 5px #ccc;\n	background-color: white;\n}\n.sej-drop-list> sejli {\n	border-bottom: 1px solid #333;\n}\n.sej-drop-list> sejli:last-child {\n	border-bottom: none;\n}";

	var categoryMap = { //rules 和 engineList 的对应
		"web": "网页",
		"map": "地图",
		"video": "视频",
		"music": "音乐",
		"image": "图片",
		"Movie": "影视",
		"knowledge": "资料",
		"sociality": "社交",
		"shopping": "网购",
		"download": "下载",
	};

	var engineListIntroduce = getMStr(function() {
		/*
		<div>
			<h2>分类规则:</h2>
			<i>【名称最好不要更改,类别跟站点规则有个对应关系】</i>
			<p>1、"音乐--music",代表类别是 "音乐"</p>
		</div>
		<div>
			<h2>搜索引擎规则:</h2>
			<code>名称,地址(%s 关键字)</code>
			<p>1、"//" 开头会被忽略</p>
			<p>2、中间分隔符:中文逗号(,) 或 英文逗号 + 空格(, )</p>
			<p>3、站点图标也可省略</p>
			<p>4、POST 范例 维普, http://lib.cqvip.com/Qikan/Search/Index?from=Qikan_Search_Index/%post#key=u%3D%s#indexKey=%s</p>
		</div>
		 */
	});

	function introduceToHtml() {
		return engineListIntroduce.replace(/((.*?))/g, "<span>$1</span>")
			.replace(/"(.*?)"/g, "<span>$1</span>");
	}
	
	function isTheSameCategory(c1, c2) {
		return (categoryMap[c1] || c1) == (categoryMap[c2] || c2);
	}

	var rules = [ //根据规则把搜索引擎列表插入到指定网站		
		{// 网页,第一个可以当模板看
			name: "google网页搜索", //你要加载的网站的名字(方便自己查找)
			url: /^https?:\/\/(encrypted\.google\.com|www\.google\.(?!co\.jp)[^\/]{2,9})\/(webhp|search|#|$|\?)(?!.*tbm=)/, //在哪个网站上加载,正则.
			mutationTitle: true, //mutationTitle监视标题的变化
			engineList: "web", //加载哪个类型的列表:
			// keyword 使用 css选中一个form input元素 或者 该项是一个函数,使用返回值
			// 插入文档,相关
			// target 将引擎跳转工具栏插入到文档的某个元素
			// (请使用css匹配,比如: "#subform_ctrl" );
			// where 四种:
			// "beforeBegin"(插入到给定元素的前面) ;
			// "afterBegin"(作为给定元素的第一个子元素) ;
			// "beforeEnd" (作为给定元素的最后一个子元素) ;
			// "afterEnd"(插入到给定元素的后面);.
		}, {
			name: "google.co.jp",
			url: /^https?:\/\/www\.google\.co\.jp\/(webhp|search|#|$|\?)(?:.(?!&tbm=))*$/,
			mutationTitle: true,
			engineList: "web",
			
		}, {
			name: "Startpage",
			url: /^https?:\/\/[a-z0-9]{3}\.startpage\.com\//,
			mutationTitle: true,
			engineList: "web",
			
		}, {
			name: "baidu 网页搜索", //因为不刷新搜索,所以百度跳简洁搜索会有问题
			url: /^https?:\/\/www\.baidu\.com\/(?:s.*|baidu.*|\?bn.*|\?tn.*|)$/,//bn、tn是推广之类的东西
			mutationTitle: true,
			engineList: "web",
			endFix: function() {
					if (getComputedStyle(document.getElementById("lg")).display != "none") remove();
				} //通过检测首页图片判断,在首页的话不显示
		}, {
			name: "bing(global)",
			url: /^https?:\/\/global\.bing\.com\/search/,
			engineList: "web",
		}, {
			name: "必应网页搜索",
			url: /^https?:\/\/(cn|www)\.bing\.com\/search/,
			engineList: "web",
		}, {
			name: "360搜索",
			url: /^https?:\/\/www\.so\.com\/s\?/,
			engineList: "web",
		}, {
			name: "搜狗网页搜索",
			url: /^https?:\/\/www\.sogou\.com\/(?:web|s)/,
			engineList: "web",
			keyword: "#upquery",
		}, {
			name: "雅虎网页搜索",
			url: /^https?:\/\/search\.yahoo\.com\/search/,
			change: "noExternalRequests",
			engineList: "网页",
		}, {
			name: "tw.yahoo",
			url: /^https?:\/\/tw\.search\.yahoo\.com\/search/,
			change: "noExternalRequests",
			engineList: "web",
		}, {
			name: "yahoo.co.jp",
			url: /^https?:\/\/search\.yahoo\.co\.jp\/search/,
			engineList: "web",
		}, {
			name: "duckduckgo",
			url: /^https?:\/\/duckduckgo\.com\/\?/,
			engineList: "web",
		},
		// 知识
		{
			name: "Scholar",
			url: /^https?:\/\/scholar\.google(?:\.\D{1,3}){1,2}\/scholar\?/,
			engineList: "资料",
		}, {
			name: "百度学术",
			url: /^https?:\/\/xueshu\.baidu\.com\/s\?/,
			engineList: "资料",
			
		}, {
			name: "IA",
			url: /^https?:\/\/archive\.org\/search\.php/,
			engineList: "资料",
			keyword: "input[type='text'][value]",
		}, {
			name: "百度百科",
			url: /^https?:\/\/baike\.baidu\.com\/(search|item)/,
			engineList: "资料",
		}, {
			name: "萌娘百科",
			url: /^https?:\/\/zh\.moegirl\.org\/./,
			engineList: "资料",
			keyword: function() {
				if (document.getElementById("searchText")) return document.querySelector("input[type='search']").value;
				else return document.getElementById("firstHeading").textContent;
			},
		}, {
			name: "Google book",
			url: /^https?:\/\/www\.google\.co.{1,3}\/search\?.*(&btnG=%E6)|(tbm=bks)/,
			mutationTitle: true,
			engineList: "资料",
		}, {
			name: "互动百科",
			url: /^https?:\/\/[a-z]{2,3}\.baike\.com\/[a-z]/,
			engineList: "资料",
			keyword: function() {
				var input;
				if (document.getElementsByClassName("ac_input")[0] != undefined) {
					if (document.getElementsByClassName("ac_input")[0].value != "")
						input = document.getElementsByClassName("ac_input")[0].value;
					else if (document.getElementsByClassName("blue")[0].innerHTML != "") input = document.getElementsByClassName("blue")[0].innerHTML;
					else input = document.evaluate("//h1", document, null, 9, null).singleNodeValue.innerHTML;
				} else if (document.getElementsByClassName("blue")[0].innerHTML != "") input = document.getElementsByClassName("blue")[0].innerHTML;
				else input = document.evaluate("//h1", document, null, 9, null).singleNodeValue.innerHTML;
				return input;
			},
		}, {
			name: "wiki",
			url: /^https?:\/\/..\.wikipedia\.org\/w\/index\.php(?!.*\?search=)/,
			engineList: "资料",
		}, {
			name: "wiki[ZH]",
			url: /^https?:\/\/zh\.wikipedia\.org\/(?:zh|wiki\/|w\/index.php\?search=)/,
			engineList: "资料",
			keyword: function() {
				if (document.getElementById("searchText"))return document.querySelector("#searchText>input").value;
				else return document.getElementById("firstHeading").childNodes[0].textContent;
			},
			
		}, {
			name: "wiki[EN]",
			url: /^https?:\/\/en\.wikipedia\.org\/(wiki\/|w\/index\.php\?search=)/,
			engineList: "资料",
			keyword: function() {
				if (document.getElementById("searchText"))
					return document.querySelector("#searchText>input").value;
				else return document.getElementById("firstHeading").childNodes[0].textContent;
			},
			
		}, {
			name: "wiki[JP]",
			url: /^https?:\/\/ja\.wikipedia\.org\/(wiki\/|w\/index\.php\?search=)/,
			engineList: "资料",
			keyword: function() {
				if (document.getElementById("searchText"))return document.querySelector("#searchText>input").value;
				else return document.getElementById("firstHeading").childNodes[0].textContent;
			},
		}, {
			name: "百度知道(search)",
			url: /^https?:\/\/zhidao\.baidu\.com\/search/,
			engineList: "资料",
		}, {
			name: "百度知道(search)",
			url: /^https?:\/\/zhidao\.baidu\.com\/search/,
			engineList: "资料",
		}, {
			name: "维普",
			url: /^https?:\/\/lib\.cqvip\.com\/Qikan/,
			engineList: "资料",
		}, {
			name: "爱学术",
			url: /^https?:\/\/www\.ixueshu\.com\/\search/,
			engineList: "资料",
		}, {
			name: "中国知网",
			url: /^https?:\/\/kns\.cnki\.net\/\KNS8\/DefaultResult/,
			engineList: "资料",
		}, {
			name: "知乎",
			url: /^https?:\/\/www\.zhihu\.com\/search\?/,
			change: "noExternalRequests",
			engineList: "资料",
		}, {
			name: "stackoverflow",
			url: /^https?:\/\/stackoverflow\.com\/search\?/,
			engineList: "资料",
		}, {
			name: "百度文库",
			url: /^https?:\/\/wenku\.baidu\.com\/search\?/,
			engineList: "资料",
		}, {
			name: "豆丁",
			url: /^https?:\/\/www\.docin\.com\/search\.do/,
			engineList: "资料",
			
		},
		// 地图
		{
			name: "百度地图",
			url: /^https?:\/\/map\.baidu\.com\/\?newmap/,
			engineList: "map",
		}, {
			name: "google地图",
			url: /^https?:\/\/www\.google\.co.{1,4}\/maps/,
			engineList: "map",
			mutationTitle: true,
		}, {
			name: "Bing地图",
			url: /^https?:\/\/[^.]*\.bing\.com\/ditu\//,
			engineList: "map",
		}, {
			name: "搜狗地图",
			url: /^https?:\/\/map\.sogou\.com\/#/,
			engineList: "map",
		},
		// 音乐
		{
			name: "千千音乐",
			url: /^https?:\/\/music\.taihe\.com\/search/,
			engineList: "music",
			keyword:".container input[valuekey]"
		}, {
			name: "QQ音乐",
			url: /^https?:\/\/y\.qq\.com\/portal\/search/,
			engineList: "music",
			keyword: ".search_input__input",
		}, {
			name: "音悦台",
			url: /^https?:\/\/so\.yinyuetai\.com\/mv\?/,
			engineList: "music",
		}, {
			name: "刘志进",
			url: /^https?:\/\/music\.liuzhijin\.cn\/\?name/,
			engineList: "music",
		}, {
			name: "一听音乐",
			url: /^https?:\/\/so\.1ting\.com\/(?!lyric)/,
			engineList: "music",
			etc: function() { //处理一听根据reffer拒绝访问的问题
				if (document.referrer.indexOf("https://so.1ting.com") == -1) {
					location.reload();
				}
			}
		}, {
			name: "一听歌词",
			url: /^https?:\/\/so\.1ting\.com\/lyric/,
			engineList: "music",
			etc: function() { //处理一听根据reffer拒绝访问的问题
				if (document.referrer.indexOf("https://so.1ting.com") == -1) {
					location.reload();
				}
			}
		}, {
			name: "歌词迷",
			url: /^https?:\/\/gecimi\.com\/search/,
			engineList: "music",
			keyword: function() {
				var key = location.href.split("keyword=")[1];
				return key;
			},
		}, {
			name: "xiami",
			url: /^https?:\/\/www\.xiami\.com\/search/,
			engineList: "music",
			keyword: function() {
				var key = location.href.split("key=")[1];
				return key;
			},
		},
		// 图片
		{
			name: "谷歌图片",
			url: /^https?:\/\/\w{2,10}\.google(?:\.\D{1,3}){1,2}\/search\?(.*tbs=sbi)|(.*tbm=isch)/,
			engineList: "image",
		}, {
			name: "百度图片",
			url: /^https?:\/\/image\.baidu\.c(om|n)\/search/,
			engineList: "image",
			style: "margin-left:35px"
		}, {
			name: "360图片",
			url: /^https?:\/\/\image\.so\.com\/i\?/,
			engineList: "image",
		}, {
			name: "bing图片",
			url: /^https?:\/\/.*\.bing\.com\/images\/search/,
			engineList: "image",
					}, {
			name: "搜狗图片",
			url: /^https?:\/\/pic\.sogou\.com\/pic/,
			engineList: "image",
		}, {
			name: "花瓣",
			url: /^https?:\/\/huaban\.com\/search\/\?/,
			engineList: "image",
		}, {
			name: "flickr",
			url: /^https?:\/\/www\.flickr\.com\/search/,
			change: "noExternalRequests",
			engineList: "image",
			keyword: function() {
				var input = document.querySelector("input[type='text'][value]");
				if (input) return input.value;
				else {
					var m = location.search.match(/q=([^&]+)/i);
					if (m) return true;
				}
			},
		}, {
			name: "picsearch",
			url: /^http:\/\/(..|...)\.picsearch\.com\/index\.cgi/,
			engineList: "image",
		}, {
			name: "pixiv",
			url: /^http:\/\/www\.pixiv\.net\/search\.php/,
			engineList: "image",
			keyword: "input[name=word]",
		}, {
			name: "deviantart",
			url: /^https?:\/\/www\.deviantart\.com\/browse\/all\//,
			engineList: "image",
			keyword: "#searchInput",
			etc: function() { //这个是为了调整编码
				if (window.location.href.indexOf("%26%23") == -1 && /%[A-Fa-f8-9][A-Fa-f0-9]/.test(window.location.href)) {
					var url = window.location.href.split("q=");
					window.location.href = url[0] + "q=" + toEscapeCharacter(decodeURIComponent(url[1]));
				}
			}
		},
		// 下载
		{
			name: "xiaohx",
			url: /^https?:\/\/www\.xiaohx\.org\/search\?/,
			engineList: "download",
			keyword:"input.search"
		}, {
			name: "xiaohx",
			url: /^https?:\/\/v1\.xiaohx\.org\/search\?/,
			engineList: "download",
		}, {
			name: "cdsoso",
			url: /^https?:\/\/www\.cdsoso\.cc\/searches/,
			engineList: "download",
		}, {
			name: "ed2000",
			url: /^https?:\/\/www\.ed2000\.com\/FileList\.asp/,
			engineList: "download",
		}, {
			name: "BTSOW",
			url: /^https?:\/\/btio\.pw\/search\//,
			engineList: "download",
		}, {
			name: "limetorrents",
			url: /^https?:\/\/www\.(limetorrents\.(info|asia|co)|limetor\.pro)\/search\//,
			engineList: "download",
		}, {
			name: "idope",
			url: /^https?:\/\/idope\.se\/torrent-list\//,
			engineList: "download",
		}, {			
			name: "torrentkitty",	
			url: /^https?:\/\/(www\.)?torrentkitty\.(net|org|tv)\/search\//,	
			engineList: "download",	
			keyword: function() {	
				return document.getElementsByTagName("h2")[0].innerHTML.slice(18, -1);	
			},	
		}, 
		//影视
		{
			name: "thepiratebay",
			url: /^https?:\/\/thepiratebay\.org\/search/,
			engineList: "Movie",
		}, {
			name: "1337x",
			url: /^https?:\/\/www\.1377x\.to\/(sort-)?search/,
			engineList: "Movie",
		}, {
			name: "btdig",
			url: /^https?:\/\/(www\.)?btdig\.com\/search\?/,
			engineList: "download",
		}, {
			name: "kickass(替代)",
			url: /^https?:\/\/(kickass1\.to|kickasstorrent\.cr|kat\.am|kickasstorrents\.to)\/usearch\//,
			engineList: "Movie",
			keyword: function() {
				var key = document.querySelector("#contentSearch").value;
				if (key) return key;
				else key = document.title.split('"')[1];
				return key;
			},
		}, {
			name: "kickass(镜像1)",
			url: /^https?:\/\/kat\.sx\/u?search/,
			engineList: "Movie",
		}, {
			name: "RARBG",
			url: /^https?:\/\/(rarbgproxy\.org|rarbg\.is|rarbgprx\.org)\/torrents\.php\?search/,
			engineList: "Movie",
		}, {
			name: "yourbittorrent",
			url: /^https?:\/\/yourbittorrent2?\.com\/\?q/,
			engineList: "Movie",
		}, {
			name: "pianyuan",
			url: /^https?:\/\/www\.pianyuan\.la\/search\?q/,
			engineList: "Movie",
		}, {
			name: "torrentfunk2",
			url: /^https?:\/\/www\.torrentfunk2\.com\/[a-z]/,
			engineList: "download",
		}, {
			name: "idope",
			url: /^https?:\/\/zooqle\.com\/search\?/,
			engineList: "download",
		}, {
			name: "torlock",
			url: /^https?:\/\/www\.torlock2\.com\/[a-zA-Z]/,
			engineList: "Movie",
			keyword: function() {
				var key = document.title.split('Torrents')[0].replace('-',' ');
				return key;
			},
		}, {
			name: "torrent downloads",
			url: /^https?:\/\/www\.torrentdownloads\.me\/search\/\?search/,
			engineList: "Movie",
			keyword: "input[name='search']",
		}, {
			name: "extratorrent.si",
			url: /^https?:\/\/extratorrent\.si\/search\/\?search/,
			engineList: "Movie",
		}, {	
			name: "Torrentz2",	
			url: /^https?:\/\/(www\.)?torrentz2\.xyz\/\?q/,	
			engineList: "download",	
		}, {	
			name: "Torrentz2k",	
			url: /^https?:\/\/torrentz2k\.xyz\/search/,	
			engineList: "download",	
		},
		//ACG
		{
			name: "dmhy",
			url: /^https?:\/\/share\.dmhy\.org\/topics\/list/,
			engineList: "ACG",
			keyword: function() {
				var key = document.querySelector("#keyword").value;
				if (key) return key;
				else key = document.title.split(/「|」/)[1];
				return key;
			},
		}, {
			name: "Tokyotosho",
			url: /^https?:\/\/www\.tokyotosho\.info\/search\.php/,
			engineList: "ACG",
		}, {
			name: "*MioBT*",
			url: /^https?:\/\/www\.miobt\.com\/search\.php/,
			engineList: "ACG",
			keyword: "#topsearch",
		}, {
			name: "爱恋动漫",
			url: /^https?:\/\/www\.kisssub\.org\/search\.php/,
			engineList: "ACG",
			keyword: "#topsearch",
		}, {
			name: "Mikan",
			url: /^https?:\/\/mikanani\.me\/Home\/Search\?searchstr/,
			engineList: "ACG",
		}, {
			name: "acgsou",
			url: /^https?:\/\/www\.acgsou\.com\/search\.php/,
			engineList: "ACG",
			keyword: "#topsearch",
		}, {
			name: "36dm",
			url: /^https?:\/\/www\.36dm\.com\/search\.php/,
			engineList: "ACG",
			keyword: "#topsearch",
		}, {
			name: "KOTOMI RSS",
			url: /^https?:\/\/moe4sale\.in\/\?kw/,
			engineList: "ACG",
		}, {
			name: "ACG狗狗",
			url: /^https?:\/\/bt\.acg\.gg\/search/,
			engineList: "ACG",
			keyword: "#topsearch",
		}, {
			name: "ACG.RIP",
			url: /^https?:\/\/acg\.rip\/\?term/,
			engineList: "ACG",
		}, {
			name: "nyaa.si",
			url: /^https?:\/\/nyaa\.(si|uk)\/\?/,
			engineList: "ACG",
		}, {
			name: "Nyaapantsu",
			url: /^https?:\/\/(nyaa\.|www\.|)?(pantsu\.cat|nyaa\.pt)\/search\?/,
			engineList: "ACG",
		}, {
			name: "shana project",
			url: /^https?:\/\/www\.shanaproject\.com\/search/,
			engineList: "ACG",
		}, {
			name: "AcgnX",
			url: /^https?:\/\/www\.acgnx\.se\/search\.php\?/,
			engineList: "ACG",
			keyword: "#topsearch",
		}, {
			name: "末日动漫",
			url: /^https?:\/\/share\.acgnx\.se\/search\.php\?/,
			engineList: "ACG",
			keyword: "#topsearch",
		}, {
			name: "AniRena",
			url: /^https?:\/\/www\.anirena\.com\/\?s/,
			engineList: "ACG",
		},
		//Sukebei
		{
			name: "GGBases",
			url: /^https?:\/\/www\.ggbases\.com\/search/,
			engineList: "Sukebei",
		}, {
			name: "sukebei.nyaa.si",
			url: /^https?:\/\/sukebei\.nyaa\.(si|uk)\/\?/,
			engineList: "Sukebei",
		},{
			name: "Nayapantsu(sukebei)",
			url: /^https?:\/\/sukebei\.(pantsu\.cat|nyaa\.pt)\/search\?/,
			engineList: "Sukebei",
		}, {
			name: "anix",
			url: /^https?:\/\/www\.anix\.moe\/search\.php\?/,
			engineList: "Sukebei",
			keyword: "#topsearch",
		}, {
			name: "AniDex",
			url: /^https?:\/\/anidex\.info\/\?q/,
			engineList: "Sukebei",
		},
		//字幕
		{
			name: "subom",
			url: /^https?:\/\/www\.subom\.net\/search/,
			engineList: "download",
		}, {
			name: "subhd",
			url: /^https?:\/\/subhd\.tv\/search/,
			engineList: "download",
			keyword: "#sn",
		}, {
			name: "射手网(伪)",
			url: /^https?:\/\/assrt\.net\/sub\/\?s/,
			engineList: "download",
		}, {
			name: "Subscene",
			url: /^https?:\/\/subscene\.com\/subtitles\/searchbytitle/,
			engineList: "download",
		}, {
			name: "R3SUB",
			url: /^https?:\/\/r3sub\.com\/search\.php/,
			engineList: "download",
		},
		// 购物
		{
			name: "一淘",
			url: /^https?:\/\/www?\.etao\.com\/search/,
			engineList: "shopping",
			
		}, {
			name: "京东",
			url: /^https?:\/\/search\.jd\.com\/(S|s)earch\?/i,
			engineList: "shopping",
			
		}, {
			name: "淘宝搜索",
			url: /^https?:\/\/(s|haosou\.ai)\.taobao\.com\/search/,
			engineList: "shopping",
		}, {
			name: "易迅",
			url: /^https?:\/\/searchex\.yixun\.com\/html\?/,
			engineList: "shopping",
		}, {
			name: "苏宁",
			url: /^https?:\/\/search\.suning\.com\//,
			engineList: "shopping",
		}, {
			name: "天猫",
			url: /^https?:\/\/list\.tmall\.com\/\/?search/,
			engineList: "shopping",
		}, {
			name: "亚马逊",
			url: /^https?:\/\/www\.amazon\.cn\/s\/ref/,
			engineList: "shopping",
		}, {
			name: "当当",
			url: /^https?:\/\/search\.dangdang\.com\/\?key/,
			engineList: "shopping"
		}, {
			name: "newegg",
			url: /^https?:\/\/www\.newegg\.com\.tw\/search\?/,
			engineList: "shopping",
			keyword: "#searchword",
		},
	];

	function loadPrefs() {
		prefs.display = GM_getValue("display", prefs.display);
		prefs.openInNewTab = GM_getValue("openInNewTab", prefs.openInNewTab);
		prefs.debug = GM_getValue("debug", prefs.debug);
		prefs.engineListDataType = GM_getValue("engineListDataType", prefs.engineListDataType);
		engineListData.custom = GM_getValue("engineList") || "";
		reloadDebug();
	}

	function openPrefs() {
			var d = document;
			var on = function(node, e, f) {
				node.addEventListener(e, f, false);
			};

			var $ = function(s) {
				return d.getElementById("sej-prefs-" + s);
			};
			if ($("setup")) return;

			var styleNode = GM_addStyle("\
		#sej-prefs-setup { position:fixed;z-index:2147483647;top:38px;right:60px;padding:20px 30px 10px;background:#eee;width:500px;border:1px solid black; }\
		#sej-prefs-setup * { color:black;text-align:left;line-height:normal;font-size:12px; }\
		#sej-prefs-setup i { 'Microsoft YaHei UI','微软雅黑',Arial; }\
		#sej-prefs-setup a { color:black;text-decoration:underline; }\
		#sej-prefs-setup div { text-align:center;font-size:14px; }\
		#sej-prefs-title { font-weight:bold; }\
		#sej-prefs-setup ul { margin:15px 0 0 0;padding:0;list-style:none;background:#eee;border:0; }\
		#sej-prefs-setup input, #sej-prefs-setup select { border:1px solid gray;padding:2px;background:white; height: auto; }\
		#sej-prefs-setup li { margin:0;padding:6px 0;vertical-align:middle;background:#eee;border:0 }\
		#sej-prefs-setup textarea { width:98%; height:60px; margin:3px 0; font-family: 'Microsoft YaHei UI','微软雅黑',Arial; }\
		#sej-prefs-setup button { padding: 1px 6px; font-size: 12px; margin-right: 3px; }\
		#sej-prefs-setup #top-buttons{text-align: left;}\
		#sej-prefs-setup img { display: initial; }\
		#sej-prefs-minitip { position: absolute; background: #ff9; border: 1px solid #F96; padding: 10px; left: -400px; top: 200px; right: 570px; }\
		#sej-prefs-minitip p { margin: 5px 5px; }\
		#sej-prefs-minitip span { color: green; }\
		#sej-prefs-debug { margin-left: 18px; }\
		");

			var div = d.createElement("div");
			div.id = "sej-prefs-setup";
			d.body.appendChild(div);
			div.innerHTML = "\
		<div id='top-buttons'>\
			<button id='sej-prefs-ok' title='立即生效'>√ 确定</button>\
			<button id='sej-prefs-cancel' title='取消本次设定,所有选项还原'>X 取消</button>\
		</div>\
		<div id='sej-prefs-title'>SearchEngineJumpCE 设置</div>\
		<ul>\
			<li>\
				<input type='checkbox' id='sej-prefs-openInNewTab' /> 在新页面打开\
				<input type='checkbox' id='sej-prefs-debug' /> 调试模式\
			</li>\
			<li>\
				搜索列表版本:\
				<select id='sej-prefs-engineListDataType' >\
					<option value='custom'>用户版本</option>\
					<option value='ted423'>ted423版本</option>\
				</select>\
				<a style='margin-left: 20px;' target='_blank' href='https://greasyfork.org/zh-CN/scripts/16193/feedback' title='通过反馈给作者加入你的版本'>加入你的版本?</a>\
			</li>\
			<li>自定义搜索列表:\
				<sej-i id='sej-prefs-engineList-tip'>(?)</sej-i>\
				<div>\
					<textarea id='sej-prefs-engineList' style='height: 350px;'></textarea>\
				</div>\
			</li>\
		</ul>\
		<div id='sej-prefs-minitip' style='display: none;'>" +
				introduceToHtml() + "\
		</div>\
		";
			div = null;

			var engineListType_sel = $("engineListDataType"),
				engineList_txt = $("engineList");

			var close = function() {
				if (styleNode) {
					styleNode.parentNode.removeChild(styleNode);
				}
				var div = $("setup");
				div.parentNode.removeChild(div);
			};

			on($("ok"), "click", function() {
				GM_setValue("openInNewTab", prefs.openInNewTab = !!$("openInNewTab").checked);
				GM_setValue("debug", prefs.debug = !!$("debug").checked);
				GM_setValue("engineListDataType", prefs.engineListDataType = engineListType_sel.value);

				if (engineListType_sel.value == "custom") {
					GM_setValue("engineList", engineListData.custom = engineList_txt.value);
				}

				// 刷新工具条
				remove();
				reloadDebug();
				debug("run");
				run();
				close();
			});

			on($("cancel"), "click", close);

			$("engineList-tip").onclick = function() {
				var minitip = $("minitip");
				minitip.style.display = (minitip.style.display == "block") ? "none" : "block";
			};

			engineListType_sel.onchange = function() {
				engineList_txt.value = engineListData[engineListType_sel.value].trim();
			};

			$("openInNewTab").checked = prefs.openInNewTab;
			$("debug").checked = prefs.debug;
			engineListType_sel.value = prefs.engineListDataType;

			engineList_txt.value = engineListData[prefs.engineListDataType].trim();
		}
		// --------------------可设置项结束------------------------
	var debug;

	function reloadDebug() {
		debug = prefs.debug ? console.log.bind(console) : function() {};//console.debug在chrome里失去作用
	}


	function getPostFormHTML(name, url, args, newTab) { //获取 method 为 POST 的表单的 HTML
		var form = "<form method='post'" +
			" action='" + url + "' id ='sej_" + name + "'" +
			(newTab ? " target='_blank'" : "") +
			">";
		for (var arg in args) {
			var input = "<input type='hidden'" +
				" name='" + arg + "'" +
				" value='" + args[arg] + "'" +
				" />";
			form += input;
		}
		form += "</form>";
		return form;
	}

	function wrapToHide(html) { //包装 HTML 元素代码以隐藏该元素
		return "<span style='display:none;'>" + html + "</span>";
	}

	function toRE(obj) {
		if (obj instanceof RegExp) {
			return obj;
		} else if (obj instanceof Array) {
			return new RegExp(obj[0], obj[1]);
		} else {
			return new RegExp(obj);
		}
	}

	function getMStr(func) {
		var lines = func.toString();
		lines = lines.substring(lines.indexOf("/*") + 3, lines.lastIndexOf("*/"));
		return lines;
	}

	function toEscapeCharacter(str) { //dA使用ISO-8859-1编码,网页只能使用转义字符(UTF16)来显示其他字符 这里是对转义字符(UTF16)进行编码
		var length = str.length;
		var ret = [];
		var character;
		var charCode;
		var gCode;
		var neReg = /[\dA-z]/;
		for (var i = 0; i < length; i++) {
			charCode = str.charCodeAt(i);
			if (charCode <= 128) {
				character = str.charAt(i);
				if (neReg.test(character)) { /*ascii的数字字母不编码*/
					ret.push(character);
				} else ret.push("%" + charCode.toString(16));
			} else {
				gCode = charCode.toString();
				if (gCode) {
					while (gCode.length < 4) {
						gCode = "0" + gCode;
					}
					ret.push("%26%23" + gCode + "%3B");
				} else {
					/*字库里面没有.*/
				}
			}
		}
		return ret.join("");
	}

	function getFaviconUrl(url, type) {
		var uri = parseUri(url);
		switch (type) {
			case 0:
				return "http://g.soz.im/" + uri.host;
			default:
				return uri.protocol + "://" + uri.host + "/favicon.ico";
		}
	}

	// parseUri 1.2.2
	// (c) Steven Levithan <stevenlevithan.com>
	// MIT License
	var parseUri = function(str) {
		var o = parseUri.options,
			m = o.parser[o.strictMode ? "strict" : "loose"].exec(str),
			uri = {},
			i = 14;

		while (i--) uri[o.key[i]] = m[i] || "";

		uri[o.ds.name] = {};
		uri[o.ds.name][0] = {};
		uri[o.ds.name][0]["key"] = (uri.protocol ? uri.protocol : "http") + "://" + uri.host + (uri.port ? ":" + uri.port : "") + "/";
		uri[o.ds.name][0]["val"] = "/";
		i = 0;
		var tempsub = "/",
			subs = uri[o.key[10]].substr(1).split("/");
		for (var j = 1; j < (subs.length + 1); j++, i++) {
			tempsub += tempsub === "/" ? subs[i] : "/" + subs[i];
			if (subs[i]) {
				uri[o.ds.name][j] = {};
				uri[o.ds.name][j]["key"] = subs[i];
				uri[o.ds.name][j]["val"] = tempsub;
			}
		}

		uri[o.q.name] = {};
		uri[o.key[12]].replace(o.q.parser, function($0, $1, $2) {
			if ($1) uri[o.q.name][$1] = $2;
		});
		uri[o.aq.name] = {};
		uri[o.key[13]].replace(o.aq.parser, function($0, $1, $2) {
			if ($1) uri[o.aq.name][$1] = $2;
		});

		return uri;
	};
	parseUri.options = {
		strictMode: false,
		key: ["source", "protocol", "authority", "userInfo", "user", "password", "host", "port", "relative", "path", "directory", "file", "query", "anchor"],
		q: {
			name: "queryKey",
			parser: /(?:^|&)([^&=]*)=?([^&]*)/g
		},
		aq: {
			name: "anchorqueryKey",
			parser: /(?:^|&)([^&=]*)=?([^&]*)/g
		},
		ds: {
			name: "directorySub"
		},
		parser: {
			strict: /^(?:([^:\/?#]+):)?(?:\/\/((?:(([^:@]*)(?::([^:@]*))?)?@)?([^:\/?#]*)(?::(\d*))?))?((((?:[^?#\/]*\/)*)([^?#]*))(?:\?([^#]*))?(?:#(.*))?)/,
			loose: /^(?:(?![^:@]+:[^:@\/]*@)([^:\/?#.]+):)?(?:\/\/)?((?:(([^:@]*)(?::([^:@]*))?)?@)?([^:\/?#]*)(?::(\d*))?)(((\/(?:[^?#](?![^?#\/]*\.[^?#\/.]+(?:[?#]|$)))*\/?)?([^?#\/]*))(?:\?([^#]*))?(?:#(.*))?)/
		}
	};

	function addGlobalStyle() {
		// 添加全局样式和自定义样式
		var style;
		if (!document.getElementById("sej-style")) {
			style = document.createElement("style");
			style.id = "sej-style";
			style.type = "text/css";
			style.textContent = MAIN_CSS + "\n" + (matchedRule.stylish || "");
			document.head.appendChild(style);
			if (prefs.display === false){
				style = document.createElement("style");
				style.id = "sej-display-style";
				style.type = "text/css";
				style.textContent = "#sej-container{pointer-events:none;opacity: 0.1;}";
				document.head.appendChild(style);
			}
		}

	}

	function addContainer(iTarget, iInput) {
		function parseDataStr(str) { //转换文本数据
			var List = str.split(/\n(?=[^\s])/);
			List.forEach(function(eachList) {
				var line = eachList.split(/[\n\r]+/);
				var category = line[0];
				category = category.split("--");
				if (isTheSameCategory(category[0], matchedRule.engineList)) {
					container.innerHTML += "<sejli><sejspan id='sej-expanded-category'>" + svg.list + category[0] + "</sejspan></sejli>";
					parseLine(container, line, true);
				} else {
					var contSejli = document.createElement("sejli");
					contSejli.innerHTML = "<sejspan class='sej-engine sej-drop-list-trigger'>"+ svg.list + category[0] + "</sejspan>";
					var sejul = document.createElement("sejul");
					sejul.className = "sej-drop-list";
					parseLine(sejul, line, false);
					contSejli.appendChild(sejul);
					container.appendChild(contSejli);
				}
			});


			//str = str.replace(/[\n\r]+[\s\/]*-\s*(\S+):/g, "_POST_ $1:"); //提前处理下特殊的 post 方式

			function parseArgs(str) {
				var arr = str.split("#");
				var args = {};
				arr.forEach(function(s) {
					var argArr = s.split("=");
					args[argArr[0]] = argArr[1];
				});
				return args;
			};

			function parseLine(container, line, isCurrent) {
				line.splice(0, 1);
				var sejul, defaultEngine, contSejli;
				var flag, flag2;
				for (var i = 0; i < line.length; i++) {
					if (!line[i]) continue;

					if (line[i].indexOf("//") == 0) {
						continue;
					}
					var arr = line[i].replace(/,/g, ", ").split(/,\s/);
					if (isCurrent && matchedRule.engineList && toRE(matchedRule.url).test(arr[1])) { //去掉跳转到当前引擎
						if (flag == i - 1) flag++;
						if (flag2 == i - 1) {
							if (i == line.length - 1) {
								contSejli.appendChild(sejul);
								container.appendChild(contSejli);
							}
							flag2++;
						}
						continue;
					}
					var engine = {};
					if (line[i].indexOf("%post") != -1) {
						engine.method = "POST";
						var two = line[i].split("%post#");
						line[i] = two[0];
						engine.args = parseArgs(two[1]);
					}
					if (arr.length === 1) { //分类
						flag = i;
						if (flag2 == i - 1 && sejul != "") {
							contSejli.appendChild(sejul);
							container.appendChild(contSejli);
						}
						defaultEngine = arr[0].trim();
						sejul = document.createElement("sejul");
						sejul.className = "sej-drop-list";
						continue;
					}
					if (/\s\s/.test(arr[0])) { //引擎分类只支持2级,所以两个tab就是二级分类的引擎
						var sejli = document.createElement("sejli");
						sejli.innerHTML = getaPattern(arr,engine);
						sejul.appendChild(sejli);
						if (i == flag + 1) { //由于二级分类大多是引擎细分,所以引擎名字上也需要能点击才行
							arr[0] = defaultEngine;
							contSejli = document.createElement("sejli");
							contSejli.innerHTML = getaPattern(arr,engine).replace("sej-engine", "sej-engine sej-drop-list-trigger");
						}
						flag2 = i; //flag2代表二级分类的引擎标记,结束后需要写入列表
						if (i == line.length - 1) { //如果已二级分类的引擎结尾,写入列表
							contSejli.appendChild(sejul);
							container.appendChild(contSejli);
						}
						continue;
					}
					if (/\s[^\s]/.test(arr[0])) {
						if (flag2 == i - 1 && sejul != "") { //看是否二级分类引擎结束
							contSejli.appendChild(sejul);
							container.appendChild(contSejli);
						}
						sejul = "";
						sejli = document.createElement("sejli");
						sejli.innerHTML = getaPattern(arr,engine);
						container.appendChild(sejli);
					}
				}
			}

		}

		function getaPattern(arr,engine) {
				engine.name = arr[0].trim();
				engine.url = arr[1];
				if(engine.method == "POST") engine.url = engine.url.split("%post")[0];
				engine.host = parseUri(engine.url).host;
				if (arr[2]) engine.favicon = arr[2];
				var a = aPattern.replace("$url$", engine.url)
					.replace("$name$", engine.name)
					.replace("$title$", engine.name);
				if (engine.favicon) {
					if (/^fa/.test(engine.favicon)) a = a.replace("<img src='$favicon$' class='sej-engine-icon' />", "<sej-i class='fa " + engine.favicon + "'></sej-i>");
					a = a.replace("$favicon$", engine.favicon);
				} else {
					a = a.replace("src='$favicon$'", "");
				}

				if (engine.method && engine.method.toUpperCase() == "POST") {
					var f = wrapToHide(getPostFormHTML(engine.name, engine.url, engine.args, prefs.openInNewTab));
					a = a.replace("$form$", f);
					a = a.replace("a href=''","button type='submit' value='Submit'" + "form='sej_"+ engine.name + "'" );
				} else {
					a = a.replace("$form$", "");
				}
				return a;
			}
			// 创建dom
		var aPattern = "<a href='' class='sej-engine'" + (prefs.openInNewTab ? " target='_blank' " : " ") +
			"url='$url$' _title='$title$'>" +
			"<img src='$favicon$' class='sej-engine-icon' />$form$<span>$name$</span></a>";

		var container = document.createElement("sejul");
		container.id = "sej-container";

		container.addEventListener("mousedown", mousedownhandler, true);
		if (matchedRule.style) {
			container.style.cssText = matchedRule.style;
		}
		// 根据搜索列表的类型得到数据
		var engineListDataStr = engineListData[prefs.engineListDataType] || engineListData.normal;
		parseDataStr(engineListDataStr);
		var insertWhere = matchedRule.insertIntoDoc ? matchedRule.insertIntoDoc.where : "beforeBegin"; //设置插入的位置
		
		var sejButton = document.getElementById("sej-button");

		if (!sejButton) {} else if (sejButton) {
			sejButton.parentNode.removeChild(sejButton);
		}

		var button = document.createElement("sejdiv");
		button.id = "sej-button";
		button.onmouseover = function() {
				if ($("#sej-container").css("pointer-events") === "none") {
					$("#sej-container").css("pointer-events", "all").css("opacity", "1");
					GM_setValue("display", true);
				} else {
					$("#sej-container").css("pointer-events", "none").css("opacity", "0.1");
					GM_setValue("display", false);
				}
			}
		document.head.parentNode.insertBefore(button,document.head);
		//设置按钮
		var configBtn = document.createElement("sej-li");
		configBtn.innerHTML = "<sejspan class='sej-engine'>" + svg.setting + "</sejspan>";
		configBtn.onclick = openPrefs;
		container.appendChild(configBtn);

		switch (insertWhere.toLowerCase()) { //插入到文档中
			case "beforebegin":
				iTarget.parentNode.insertBefore(container, iTarget);
				break;
			case "afterbegin":
				if (iTarget.firstChild) {
					iTarget.insertBefore(container, iTarget.firstChild);
				} else {
					iTarget.appendChild(container);
				}
				break;
			case "beforeend":
				iTarget.appendChild(container);
				break;
			case "afterend":
				if (iTarget.nextSibling) {
					iTarget.parentNode.insertBefore(container, iTarget.nextSibling);
				} else {
					iTarget.parentNode.appendChild(container);
				}
				break;
		}

		if (typeof matchedRule.endFix == "function") {
			try {
				matchedRule.endFix();
			} catch (ex) {
				console.error("endFix 错误", ex);
			}
		}

		function mousedownhandler(e) {
			var target = e.target;
			if (!target.href) target = target.parentNode;
			if (!target || target.className.indexOf("sej-engine") == -1) return;
			if (!target || !this.contains(target)) return;
			var value;
			if (typeof iInput == "function") value = iInput();
			else {
				if (iInput.nodeName == "INPUT" || iInput.localName == "textarea") value = iInput.value;
				else value = iInput.textContent;
			}
			if (document.characterSet != "UTF-8") value = encodeURIComponent(value);
			// 根据后代元素中是否存在 form 元素,判断提交方式并进行处理
			// 如果没有 form 元素,将会使用 GET 方法提交;如果有,将会使用 POST 方法提交
			var forms = target.getElementsByTagName("form");
			if (forms.length == 0) { //提交方式为 GET
			value = value.replace("&","%26");//&直接提交到地址栏中无法搜索,可能还有其他特殊符号也需要类似处理。只在get
			value = value.replace("#","%23");
				target.href = target.getAttribute("url").replace(/%s/g, value); //替换"全部"关键词
			} else { //提交方式为 POST
				var inputs = target.getElementsByTagName("input");
				for (var i = 0; i < inputs.length; i++) inputs[i].value = inputs[i].value.replace(/%s/g, value); //// 替换"全部"关键词
			}
		}
	}

	function run() {
		// 百度搜索插入到顶部搜索条下面就会造成页面部分元素的消失,所以需要每个部分都判断下是否存在
		// 判断插入位置和输入框是否存在
		var iTarget = matchedRule.insertIntoDoc ? document.querySelector(matchedRule.insertIntoDoc.target) : document.querySelector("head");
		var iInput;
		if (matchedRule.keyword) {
			if (typeof matchedRule.keyword == "function") {
				iInput = matchedRule.keyword;
				if (!iInput()) {
					return;
				}
			} else {
				iInput = document.querySelector(matchedRule.keyword);
			}
		} else {
			iInput = document.querySelector("input[type='search'],input[type='text'][autocomplete='off'],input[autocomplete='off']:not([type])") || document.querySelector("input[type='text'][name][value],input[name][value]:not([type])");
		}
		debug("插入的位置为 %o", iTarget);
		debug("匹配的输入框为 %o", iInput);

		if (!iTarget || !iInput) {
			debug("不存在插入的位置或匹配的输入框", iTarget, iInput);
			return;
		}

		addGlobalStyle();

		// 判断是否存在
		var container = document.getElementById("sej-container");

		if (!container) {} else if (container) {
			container.parentNode.removeChild(container);
		}
		addContainer(iTarget, iInput);
		container = document.getElementById("sej-container");
		if(container)container.style.left = "calc(50% - " + getComputedStyle(container).width + " / 2)";
	}

	function remove() {
		var elems = document.querySelectorAll("#sej-container");
		if (!elems) return;

		[].forEach.call(elems, function(elem) {
			elem.parentNode.removeChild(elem);
		});
		
		elems = document.querySelectorAll("#sej-button");
		[].forEach.call(elems, function(elem) {
			elem.parentNode.removeChild(elem);
		});
	}

	// iframe 禁止加载
	if (window.self != window.top) return;
	
	loadPrefs();
	
	var matchedRule;

	rules.some(function(rule) {
		if (toRE(rule.url).test(location.href)) {
			matchedRule = rule;
			if (typeof rule.etc == "function") {
				try {
					rule.etc();
				} catch (ex) {
					console.error("执行 etc 错误", ex);
				}
			}
			return true;
		}
	});

	var flag = 0;
	debug("匹配的规则为", matchedRule);
	debug("脚本执行于:"+document.readyState);
	debug("onreadystatechange function:"+document.onreadystatechange);
	if (!matchedRule) return;
	GM_registerMenuCommand("设置",openPrefs);
	document.onreadystatechange = function() {
		flag = 1;
		if (document.readyState == "interactive") {
			debug("onreadystatechange: " + document.readyState);
			run();
		} else if (document.readyState == "complete") {
			debug("onreadystatechange: " + document.readyState);
			run();
			/*if (window.navigator.userAgent.indexOf("Chrome") != -1) {
				setTimeout(run(), 1000);
			}*/
		}
	};
	window.onload = function() {//用于DuckDuckGo,影响到了onreadystatechange
		debug("onload");
		if (flag == 0)run();
		flag = 1;
	};
	if (matchedRule.mutationTitle) {
		debug("添加标题节点监视器: title");
		var watch = document.querySelector("title");
		var observer = new window.MutationObserver(function(mutations) {
			debug("标题发生了变化", document.title);
			run();
		});
		observer.observe(watch, {
			childList: true,
			subtree: true,
			characterData: true
		});
	}
})();