﻿var Request = new Object();
Request.send = function(url, method, callback, data, urlencoded, name,errorcall) {
	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") {
				errorcall("未知的请求错误");
			} else {
				switch(req.status) {
			        case 12002:
			            errorcall("错误代码：12002\r\n描述：服务器超时");
			            break;
			        case 12029: case 12030: case 12031:
			            errorcall("错误代码：12029/12030/12031\r\n描述：连接放弃");
			            break;
			        case 12152:
			            errorcall("错误代码：12152\r\n描述：服务器关闭连接");
			            break;
			        case 13030:
			            errorcall("错误代码：13030\r\n描述：网络错误");
				        break;
                    case 500: case 503:
                        errorcall("错误代码：500/503\r\n描述：服务器内部错误")
				        break;
			        case 404:
			            errorcall("错误代码：404\r\n描述：请求地址不存在");
				        break;
			        case 401:
			            errorcall("错误代码：401\r\n描述：未经授权");
				        break;
			        default:
			            errorcall("错误代码：" + req.status+ "\r\n描述：未知错误（" + req.statusText + ")");
			            break;
		        }
			}
		}
	};
	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, requesttype);
			req.onreadystatechange = readychange;
			req.send(null);
		}
	};
	do_request();
	return req;
}

//异步调用
Request.sendRawPOST = function(url, data, callback, name, refresh, errorcall) {
	var t = (url.indexOf('?')>0)?"&t=":"?t=";
	if(refresh==1)
		url+t+Math.random();
	Request.send(url, "POST", callback, data, false, name, errorcall);
}
Request.sendPOST = function(url, data, callback, name, refresh, errorcall) {
	var t = (url.indexOf('?')>0)?"&t=":"?t=";
	if(refresh==1)
		url+t+Math.random();
	try{
	    Request.send(url, "POST", callback, data, true, name, errorcall);
	}catch(e){
	    alert("Request.sendPOST"+e.message);
	}
}
Request.sendGET = function(url, callback, args, name, refresh, errorcall) {
	var t = (url.indexOf('?')>0)?"&t=":"?t=";
	if(refresh==1)
		url+t+Math.random();
	return Request.send(url, "GET", callback, args, name, errorcall);
}
//同步调用
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;
}
//直到执行完成才继续执行
Request.sendGETsync = function(url, callback, errorcall) {
    requesttype=false;
    var t = (url.indexOf('?') > 0) ? "&timespan=" : "?timespan=";
    url = url + t + Math.random();
    setTimeout(function(){return Request.send(url, "POST", callback, null, "", "" ,errorcall);},100);
}

//extend
Request.SubmitForm = function (form,getcode,errorcall) {
	var elements;
	try{elements = form.elements;}catch(e){	alert(e.message);return false;}
	var element;
	var postContent = "";
	for(var i=0; i<elements.length; i++) {
		element=elements[i];
		if(element.type == "text" || element.type == "textarea" || element.type == "hidden") {
			postContent += encodeURIComponent(element.name) + "=" + encodeURIComponent(element.value) + "&";
		}else if(element.type=="select-one"||element.type=="select-multiple") {
			var options=element.options,item;
			for(var j=0; j<options.length; j++){
				item=options[j];         
				if(item.selected) {
					postContent += encodeURIComponent(element.name) + "=" + encodeURIComponent(item.value) + "&";
				}
			}
		}else if(element.type == "checkbox" || element.type == "radio") {
			if(element.checked) {
				postContent += encodeURIComponent(element.name) + "=" + encodeURIComponent(element.value) + "&";
			}
		}else if(element.type == "file") {
			if(element.value != "") {
				postContent += encodeURIComponent(element.name) + "=" + encodeURIComponent(element.value) + "&";
			}
		}else {
			postContent += encodeURIComponent(element.name) + "=" + encodeURIComponent(element.value) + "&";
		}
	}
	try{
    	Request.sendPOST(form.action,postContent,getcode,"formpost",1,errorcall);
	}catch(e){
	    alert("do"+e.message);
	}
	//setTimeout(function(){Request.sendPOST(form.action,postContent,getcode,"formpost",1,errorcall)},100);
	return false;
}
