var Request = new Object();
Request.send = function(url, method, callback, data, urlencoded, name) {
//alert(url+"\n"+method+"\n"+data);
	var req, durl, tries = 0;
	if (window.XMLHttpRequest) {
		req = new XMLHttpRequest();
	} else if (window.ActiveXObject) {
		req = new ActiveXObject("Microsoft.XMLHTTP");
	}
	if (typeof name == "undefined") {
		name = "";
	} else {
		name += "\n";
	}
	var readychange = function() {
		if (req.readyState == 4) {// only if req shows "loaded"
			if (req.status < 400) {// only if "OK"
				var lm = null;
				try {
					lm = req.getResponseHeader("Last-Modified");
					lm = new Date(lm);
				} catch (e) { // workaround for Firefox 1.0.7
					lm = new Date();
					if (Math.random() > 0.8) {
						lm -= 2400001;
					}
				}
				if (data && String(data).substr(0,4) == "feed") {
					if ((new Date()) - lm > 2400000) { // 40 * 60 * 1000
						// stale cache
						data = "";
						do_request();
					} else {
						callback(req);
					}
				} else {
					(method=="POST") ? callback(req) : callback(req,data);
				}
			} else if (typeof req == "undefined" || typeof req.status == "undefined") {
				// don't do anything. user has navigated away
			} else if (req.status == 401) { // unauthorized
				callback(req);
			} else if (req.status == 404) {
				if (data && String(data).substr(0,4) == "feed") { 
					// cache miss
					data = "";
					do_request();
				}
			} else {
				switch(req.status) {
					// windows error codes
					case 12002: // server timeout
					case 12029: case 12030: case 12031: // dropped connection
					case 12152: // connection closed by server
					case 13030:
//						alert(name + "error_Network");
						break;
					case 500: case 503:
//						alert(name + "error_Internal");
						break;
					default:
//						alert("status: " + req.status+ "/" + req.statusText);
				}
			}
		}
	};
	function do_request() {
		if (++tries > 2) { // retry only twice
			return false;
		}
		if (method=="POST") {
			req.open("POST", url, true);
			if (urlencoded) req.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
			req.onreadystatechange = readychange;
			req.send(data);
		} else {
			durl = url;
			if (data && String(data).substr(0,4) == "feed") {
				durl = hex_md5(String(data).substr(4));
				durl = NV_PATH + "cache/" + durl.substr(0, 1) + "/" + durl.substr(1, 1) + "/" + durl.substr(2, 1) + "/" + durl + ".xml?" + Math.random();
			}
			req.open("GET", durl, true);
			req.onreadystatechange = readychange;
			req.send(null);
		}
	};
	do_request();
	return req;
}

//异步调用
Request.sendRawPOST = function(url, data, callback, name, refresh) {
	var t = (url.indexOf('?')>0)?"&t=":"?t=";
	if(refresh==1)
		url+t+Math.random();
	Request.send(url, "POST", callback, data, false, name);
}
Request.sendPOST = function(url, data, callback, name, refresh) {
	var t = (url.indexOf('?')>0)?"&t=":"?t=";
	if(refresh==1)
		url+t+Math.random();
	Request.send(url, "POST", callback, data, true, name);
}
Request.sendGET = function(url, callback, args, name, refresh) {
	var t = (url.indexOf('?')>0)?"&t=":"?t=";
	if(refresh==1)
		url+t+Math.random();
	return Request.send(url, "GET", callback, args, name);
}
//同步调用
Request.syncsendGET = function(url) {
	var req = null;
	if (window.XMLHttpRequest) {
		req = new XMLHttpRequest();
	} else if (window.ActiveXObject) {
		req = new ActiveXObject("Microsoft.XMLHTTP");
	}
	req.open('GET',url,false);
	req.send();
	return req;
}

function getNode(node,nodeName)
{
	try
	{
		return node.getElementsByTagName(nodeName)[0];
	}
	catch(e)
	{
		window.errors += e.description + '\n';
		return '';
	}
}

function getNodeValue(node,nodeName)
{
	try
	{
		return node.getElementsByTagName(nodeName)[0].firstChild.nodeValue;
	}
	catch(e)
	{
		window.errors += '错误发生在getNodeValue，参数为'+nodeName+'\n';
		return '';
	}
}

//JS分页方法
function getJsNavLink(page,pageCount,count,linkFunc,params,n1,n2,n3)
{ 
	page = parseInt(page); 
	pageCount = parseInt(pageCount); 
	count = parseInt(count);
	if (pageCount<=1) return "";
 	var temp = '';
	temp += '共'+count+'条记录 ';
	
	var r2 = n1;
	var r3 = page-Math.ceil((n2-1)/2);
	var r4 = page+Math.floor((n2-1)/2);
	var r5 = pageCount-n3+1;
	if (r3 <= 0)
	{
		r4 -= (r3-1);
		r3 = 1;
	}
	if (r4 > pageCount)
	{
		r3 -= (r4 - pageCount);
		r4 = pageCount;
	}

	var i=0;
	while(i<pageCount)
	{
		i++;
		if (((i >=1) && (i <= r2)) || ((i >=r3) && (i <= r4)) || ((i >= r5) && (i <= pageCount)))
		{
			//显示页码
			if (i == page)
			{
				temp += i+' ';
			}
			else
			{
				temp += '<a href="javascript:" onclick="'+linkFunc+'('+params+i+')">'+i+'</a> ';
			}
		}
		else if ((i > r2) && (i < r3))
		{
			//跳过第一段至第二段, 显示...
			if  (r2 > 0)
			{
				temp += " ...";
			}
			i = r3 - 1;
		}
		else if ((i > r4) && (i < r5))
		{
			//跳过第二段至第三段, 显示...
			if (r5 <= pageCount)
			{
				temp += " ...";
			}
			i = r5 - 1;
		}
	}
	
	if(page>1)
	{
		temp += '<a href="javascript:" onclick="'+linkFunc+'('+params+'1)">首页</a> ';
		temp += '<a href="javascript:" onclick="'+linkFunc+'('+params+(page-1)+')">上一页</a> ';
	}
	if(page<pageCount)
	{
		temp += '<a href="javascript:" onclick="'+linkFunc+'('+params+(page+1)+')">下一页</a> ';
		temp += '<a href="javascript:" onclick="'+linkFunc+'('+params+pageCount+')">末页</a> ';
	}
	temp += '转到第<input type="text" size=2 onblur="'+linkFunc+'('+params+'this.value);" value="">页 共 '+page+'/'+pageCount+' 页</td>';
	return temp;
}
function _GET(v){
	return (c = document.location.href.match(new RegExp("^.*[\\?&]"+v+"=([^&$]*)&?.*$"))) ? c[1] : null;
}