var httpObj = null;
var timeout_sec = 10;
var timerId;
var _url;
var _obj;
var _func;
var _flag = false;
var _type = 0;

function httpRequest(url, obj, func) {
	if (httpObj != null) { _url = url; _obj = obj; _func = func; _flag = true; _type= 1; return; }
	else { httpObj = createXmlHttp(); }
	
	if (httpObj == null) { failXmlHttp(); }
	if (obj.elements) { var str = getPostString(obj); }
	else { var str = obj; }

	httpObj.onreadystatechange = function() {
		if (httpObj.readyState == 4) {
			clearInterval(timerId);
			if (httpObj.status == 200) { func(httpObj.responseText); }
			else { if (httpObj.status) { alert('通信処理が正常に完了しませんでした。' ); } }
			httpObj = null;
			runNextRequest();
		}
	}
	
	timeout_sec = 10;
	timerId = setInterval('timeoutCheck()', 1000);
	httpObj.open('POST', url, true);
	httpObj.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
	httpObj.send(str);
}

function httpXmlRequest(url, obj, func) {
	if (httpObj != null) { _url = url; _obj = obj; _func = func; _flag = true; _type = 2; return; }
	else { httpObj = createXmlHttp(); }
	
	if (httpObj == null) { failXmlHttp(); }
	if (obj.elements) { var str = getPostString(obj); }
	else { var str = obj; }

	httpObj.onreadystatechange = function() {
		if (httpObj.readyState == 4) {
			clearInterval(timerId);
			if (httpObj.status == 200) { func(httpObj.responseXML); }
			else { if (httpObj.status) { alert('通信処理が正常に完了しませんでした。' ); } }
			httpObj = null;
			runNextRequest();
		}
	}
	
	timeout_sec = 10;
	timerId = setInterval('timeoutCheck()', 1000);
	httpObj.open('POST', url, true);
	httpObj.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
	httpObj.send(str);
}

function runNextRequest() {
	if (_type == 1) { if (_flag) { httpRequest(_url, _obj, _func); } }
	else if (_type == 2) { if (_flag) { httpXmlRequest(_url, _obj, _func); } }
	_flag = false;
}

function createXmlHttp(){
    if (window.ActiveXObject) { return new ActiveXObject("Microsoft.XMLHTTP"); }
    else if (window.XMLHttpRequest) { return new XMLHttpRequest(); }
    else { return null; }
}

function failXmlHttp() {
	alert('未対応のブラウザでは正常に動作しません。');
	return false;
}

function timeoutCheck() {
	timeout_sec--;
	if (timeout_sec <= 0) {
		clearInterval(timerId);
		httpObj.abort();
		httpObj = null;
		alert('通信処理がタイムアウトしました。');
		runNextRequest();
		return false;
	}
}

function getPostString(obj) {
	var str = new String();
	var i = 0;
	
    for (i = 0 ; i < obj.elements.length; i++) {
        if (!obj.elements[i].disabled) {
        	if (obj.elements[i].type == 'radio' && !obj.elements[i].checked) continue;
            str = str.concat("&");
            str = str.concat(obj.elements[i].name)
            str = str.concat("=");
            str = str.concat(obj.elements[i].value);
        }
    }
    return str.substring(1);
}

function addListener(obj, type, func, cap) {
	if (obj.addEventListener) { obj.addEventListener(type, func, cap); }
	else if (obj.attachEvent) { obj.attachEvent('on' + type, func); }
	else { alert('未対応のブラウザです。'); return false; }
}

