String.prototype.Trim = function(){
	return this.replace(/(^\s*)|(\s*$)/g, "");
}

var base64EncodeChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
var base64DecodeChars = new Array(
    -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
    -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
    -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 62, -1, -1, -1, 63,
    52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -1, -1, -1, -1, -1, -1,
    -1,  0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14,
    15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, -1, -1, -1, -1, -1,
    -1, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,
    41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, -1, -1, -1, -1, -1);

function base64encode(str) {
    var out, i, len;
    var c1, c2, c3;

    len = str.length;
    i = 0;
    out = "";
    while(i < len) {
		c1 = str.charCodeAt(i++) & 0xff;
		if(i == len){
			out += base64EncodeChars.charAt(c1 >> 2);
			out += base64EncodeChars.charAt((c1 & 0x3) << 4);
			out += "==";
			break;
		}
		c2 = str.charCodeAt(i++);
		if(i == len){
			out += base64EncodeChars.charAt(c1 >> 2);
			out += base64EncodeChars.charAt(((c1 & 0x3)<< 4) | ((c2 & 0xF0) >> 4));
			out += base64EncodeChars.charAt((c2 & 0xF) << 2);
			out += "=";
			break;
		}
		c3 = str.charCodeAt(i++);
		out += base64EncodeChars.charAt(c1 >> 2);
		out += base64EncodeChars.charAt(((c1 & 0x3)<< 4) | ((c2 & 0xF0) >> 4));
		out += base64EncodeChars.charAt(((c2 & 0xF) << 2) | ((c3 & 0xC0) >>6));
		out += base64EncodeChars.charAt(c3 & 0x3F);
    }
    return out;
}

function base64decode(str) {
    var c1, c2, c3, c4;
    var i, len, out;

    len = str.length;
    i = 0;
    out = "";
    while(i < len) {
		/* c1 */
		do {
			c1 = base64DecodeChars[str.charCodeAt(i++) & 0xff];
		}
		while(i < len && c1 == -1);
		if(c1 == -1)
			break;

		/* c2 */
		do {
			c2 = base64DecodeChars[str.charCodeAt(i++) & 0xff];
		}
		while(i < len && c2 == -1);
		if(c2 == -1)
			break;

		out += String.fromCharCode((c1 << 2) | ((c2 & 0x30) >> 4));

		/* c3 */
		do {
			c3 = str.charCodeAt(i++) & 0xff;
			if(c3 == 61)
			return out;
			c3 = base64DecodeChars[c3];
		} 
		while(i < len && c3 == -1);
		if(c3 == -1)
			break;

		out += String.fromCharCode(((c2 & 0XF) << 4) | ((c3 & 0x3C) >> 2));

		/* c4 */
		do {
			c4 = str.charCodeAt(i++) & 0xff;
			if(c4 == 61)
			return out;
			c4 = base64DecodeChars[c4];
		} 
		while(i < len && c4 == -1);
		if(c4 == -1)
			break;
		out += String.fromCharCode(((c3 & 0x03) << 6) | c4);
    }
    return out;
}

function utf16to8(str) {
    var out, i, len, c;

    out = '';
    len = str.length;
    for(i = 0; i < len; i++) {
		c = str.charCodeAt(i);
		if ((c >= 0x0001) && (c <= 0x007F)) {
			out += str.charAt(i);
		} 
		else if (c > 0x07FF) {
			out += String.fromCharCode(0xE0 | ((c >> 12) & 0x0F));
			out += String.fromCharCode(0x80 | ((c >>  6) & 0x3F));
			out += String.fromCharCode(0x80 | ((c >>  0) & 0x3F));
		} 
		else {
			out += String.fromCharCode(0xC0 | ((c >>  6) & 0x1F));
			out += String.fromCharCode(0x80 | ((c >>  0) & 0x3F));
		}
    }
    return out;
}

function utf8to16(str) {
	var out, i, len, c;
	var char2, char3;

	out = '';
	len = str.length;
	i = 0;
	while(i < len) {
		c = str.charCodeAt(i++);
		switch(c >> 4){ 
			case 0: case 1: case 2: case 3: case 4: case 5: case 6: case 7:
			// 0xxxxxxx
			out += str.charAt(i-1);
			break;
			case 12: case 13:
			// 110x xxxx   10xx xxxx
			char2 = str.charCodeAt(i++);
			out += String.fromCharCode(((c & 0x1F) << 6) | (char2 & 0x3F));
			break;
			case 14:
			// 1110 xxxx  10xx xxxx  10xx xxxx
			char2 = str.charCodeAt(i++);
			char3 = str.charCodeAt(i++);
			out += String.fromCharCode(((c & 0x0F) << 12) |
			((char2 & 0x3F) << 6) |
			((char3 & 0x3F) << 0));
			break;
		}
	}
	return out;
}



function ToolsQuery(a) {
	var rebox = document.getElementById('result');
	var inputbox = document.getElementById('q');
	this.DoQuery_IP = function(qtype) {
		var ip = inputbox.value.Trim();
		var obj_isdomain = document.getElementById('isdomain');
		if (/[A-Za-z_-]/.test(ip)){
			obj_isdomain.value = 1;
			if(!/^([\w-]+\.)+((com)|(net)|(org)|(gov\.cn)|(info)|(cc)|(me)|(com\.cn)|(net\.cn)|(org\.cn)|(com\.ru)|(net\.ru)|(org\.ru)|(name)|(biz)|(hk)|(tv)|(cn)|(jp)|(in)|(tk)|(eu)|(co\.uk)|(uk)|(mobi)|(us))$/.test(ip)){
				alert('错误：IP或域名填写不正确！');
				inputbox.focus();
				return false;
			}
		}
		else {
			obj_isdomain.value = '0';
		
			var arrayip = ip.split('.');
			if(arrayip.length != 4){
				alert('错误：不是合法的IP地址1！');
				inputbox.focus();
				return false;
			}

			for(var i=0; i<4; i++){
				if(arrayip[i].length == 0 || arrayip[i] > 255){
					alert('错误：不是合法的IP地址2！');
					inputbox.focus();
					return false;
				}
			}
		}
		rebox.style.display = '';
		rebox.innerHTML = '<img align="absmiddle" src="../images/loading.gif" /> 正在查询，请稍候。。。';
		new Ajax.Request('query.php?rnd='+Math.random()+'&x='+qtype+'&d='+obj_isdomain.value+'&q=' + inputbox.value.Trim(), 
			{ 
				method:'get', 
				onSuccess: function(transport){
					rebox.innerHTML = transport.responseText;
				}, 
				onFailure: function(){alert('出错啦。。。')}
			}
		);
	}
	
	this.DoQuery_IP_Self = function(qtype) {
		rebox.style.display = '';
		rebox.innerHTML = '<img align="absmiddle" src="../images/loading.gif" /> 正在查询，请稍候。。。';
		new Ajax.Request('query.php?rnd='+Math.random()+'&x='+qtype, 
			{ 
				method:'get', 
				onSuccess: function(transport){
					rebox.innerHTML = transport.responseText;
				}, 
				onFailure: function(){alert('出错啦。。。')}
			}
		);
	}
	this.DoQuery_Pagerank = function(qtype) {
		if(inputbox.value.Trim() == ''){
			alert('错误：请输入待查询的域名！');
			inputbox.focus();
			return false;
		}
		rebox.style.display = '';
		rebox.innerHTML = '<img align="absmiddle" src="../images/loading.gif" /> 正在查询，请稍候。。。';
		new Ajax.Request('query.php?rnd='+Math.random()+'&x='+qtype+'&q=' + inputbox.value.Trim(), 
			{ 
				method:'get', 
				onSuccess: function(transport){
					rebox.innerHTML = transport.responseText;
				}, 
				onFailure: function(){alert('出错啦。。。')}
			}
		);
	}

	this.DoQuery_urlencode = function(b) {
		if (inputbox.value.Trim() == ''){
			alert('请输入要转换的内容！');
			inputbox.focus();
			return false;
		}
		rebox.style.display = '';
		rebox.innerHTML = '<img align="absmiddle" src="../images/loading.gif" /> 正在转换，请稍候。。。';
		if (b){
			rebox.innerHTML = encodeURI(inputbox.value.Trim());
		}
		else {
			rebox.innerHTML = decodeURI(inputbox.value.Trim());
		}
	}
	this.DoQuery_ConvertUTF = function(b) {
		if (inputbox.value.Trim() == ''){
			alert('请输入要转换的内容！');
			inputbox.focus();
			return false;
		}
		rebox.style.display = '';
		rebox.innerHTML = '<img align="absmiddle" src="../images/loading.gif" /> 正在转换，请稍候。。。';
		if (b){
			rebox.innerText = inputbox.value.replace(/[^\u0000-\u00FF]/g,function($0){return escape($0).replace(/(%u)(\w{4})/gi,"&#x$2;")});
		}
		else {
			rebox.innerText = unescape(inputbox.value.Trim().replace(/&#x/g,'%u').replace(/;/g,''));
		}
		
	}

	this.DoQuery_html2js = function() {
		rebox.style.display = '';
		rebox.innerHTML = '<img align="absmiddle" src="../images/loading.gif" /> 正在转换，请稍候。。。';
		rebox.innerText = "document.write(\""+inputbox.value.Trim().replace(/\\/g,"\\\\").replace(/\//g,"\\/").replace(/\'/g,"\\\'").replace(/\"/g,"\\\"").split('\r\n').join("\");\ndocument.write(\"")+"\")";
	}
	this.DoQuery_escape = function(b) {
		rebox.style.display = '';
		rebox.innerHTML = '<img align="absmiddle" src="../images/loading.gif" /> 正在转换，请稍候。。。';
		if (b){
			rebox.innerText = '<script type="text/javascript">\n<!--\ndocument.write(unescape(\''+escape(inputbox.value.Trim())+'\'));\n//-->\n<\/script>';
		}
		else {
			rebox.innerText = unescape(inputbox.value.Trim());
		}
	}
	this.DoQuery_codedebug = function() {
		if(inputbox.value.Trim() == ''){
			alert('请输入要运行的代码内容');
			inputbox.focus();
			return false;
		}
		var winname = window.open('', "_blank", '');
		winname.document.open('text/html', 'replace');
		winname.document.writeln(inputbox.value.Trim());
		winname.document.close();
	}
	this.DoQuery_base64 = function(b) {
		rebox.style.display = '';
		rebox.innerHTML = '<img align="absmiddle" src="../images/loading.gif" /> 正在转换，请稍候。。。';
		if (b){
			rebox.innerText = base64encode(utf16to8(inputbox.value.Trim()));
		}
		else {
			rebox.innerText = utf8to16(base64decode(inputbox.value.Trim()));
		}
	}

	this.DoQuery_whois = function() {
		if(inputbox.value.Trim() == ''){
			alert('错误：请输入待查询的域名！');
			inputbox.focus();
			return false;
		}
		rebox.style.display = '';
		rebox.innerHTML = '<img align="absmiddle" src="../images/loading.gif" /> 正在查询，请稍候。。。';
		new Ajax.Request('query.php?rnd='+Math.random()+'&x=whois&q=' + inputbox.value.Trim(), 
			{ 
				method:'get', 
				onSuccess: function(transport){
					rebox.innerHTML = transport.responseText;
				}, 
				onFailure: function(){alert('出错啦。。。')}
			}
		);
	}
	this.DoQuery_qq = function() {
		if(inputbox.value.Trim().match(/^[1-9][0-9]{5,14}$/) == null){
			alert('QQ号码填写不正确');
			inputbox.focus();
			return false;
		}
		rebox.style.display = '';
		rebox.innerHTML = '<img align="absmiddle" src="../images/loading.gif" /> 正在查询，请稍候。。。';
		new Ajax.Request('query.php?rnd='+Math.random()+'&x=qq&q=' + inputbox.value.Trim(), 
			{ 
				method:'get', 
				onSuccess: function(transport){
					rebox.innerHTML = transport.responseText;
				}, 
				onFailure: function(){alert('出错啦。。。')}
			}
		);
	}

	this.DoQuery_md5 = function() {
		var ntext = document.getElementById('q').value.Trim();
		if(ntext == '') {
			alert('请输入待加密的字符串！');
			document.getElementById('q').focus();
			return false;
		}
		jsMD5_Typ = 'Typ16';
		var md5_16 = MD5(ntext);
		document.getElementById('b16').value = md5_16;
		document.getElementById('s16').value = md5_16.toLowerCase();
		jsMD5_Typ = 'Typ32';
		var md5_32 = MD5(ntext);
		document.getElementById('b32').value = md5_32;
		document.getElementById('s32').value = md5_32.toLowerCase();
	}

	this.DoQuery_showKeyCode = function() {
		if (inputbox.value.Trim() == ''){
			alert('请输入要查询的字符！');
			inputbox.focus();
			return false;
		}
		var character = inputbox.value.substring(0,1);
		var code = inputbox.value.charCodeAt(0);

		rebox.style.display = '';
		rebox.innerHTML = '<img align="absmiddle" src="../images/loading.gif" /> 正在转换，请稍候。。。';
		rebox.innerHTML = '字符【'+character+'】 对应的ASCII码值为【'+code+'】';
	}
	switch (a){
		case 'ipaddress':DoQuery_IP(a);break;
		case 'ipaddress_self':DoQuery_IP_Self(a);break;
		case 'pagerank':DoQuery_Pagerank(a);break;
		case 'urlencode':DoQuery_urlencode(true);break;
		case 'urldecode':DoQuery_urlencode(false);break;
		case 'convert2utf':DoQuery_ConvertUTF(true);break;
		case 'utf2str':DoQuery_ConvertUTF(false);break;
		case 'html2js':DoQuery_html2js();break;
		case 'escape':DoQuery_escape(true);break;
		case 'unescape':DoQuery_escape(false);break;
		case 'codedebug':DoQuery_codedebug();break;
		case 'base64':DoQuery_base64(true);break;
		case 'unbase64':DoQuery_base64(false);break;
		case 'whois':DoQuery_whois();break;
		case 'qq':DoQuery_qq();break;
		case 'md5':DoQuery_md5();break;
		case 'showKeyCode':DoQuery_showKeyCode();break;
		default:alert('未知操作！');break;
	}
}



function showRankList(a,b,c) {
	var listbox = document.getElementById('ranklist');
	var catebox = document.getElementById('category');
	var rebox = '';
	this.RankList_Baidu = function(ry,urls) {
		if (ry == 'category'){
			rebox = catebox;
		}
		else {
			rebox = listbox;
		}
		rebox.innerHTML = '<img align="absmiddle" src="../images/loading.gif" /> 正在加载，请稍候。。。';
		new Ajax.Request('searchrank_do.php?rnd='+Math.random()+'&x=baidu&y='+ry+'&url='+urls, 
			{ 
				method:'get', 
				onSuccess: function(transport){
					rebox.innerHTML = transport.responseText;
				}, 
				onFailure: function(){alert('出错啦。。。')}
			}
		);
	}

	switch (a){
		case 'baidu':RankList_Baidu(b,c);break;
		default:alert('未知操作！');break;
	}

}