var g_ajax_aRequests = new Array();
var g_ajax_nRequests = 0;

var g_ajax_aEventListeners = new Array();
var g_ajax_nEventListeners = 0;

//=============================================================================
// HTTPによるデータの取得
function HttpRequest(strTargetURL,strData,bXML,fnCallbackFunc,nTimeout)
// strTargetURL: 接続先URL
// strData: 送信データ(文字コードはUTF-8になる)
// bXML: true/XMLデータで取得 false/テキストデータで取得
// fnCallbackFunc: 非同期処理時コールバック関数 省略時は同期処理
//  fnCallbackFunc(objData,nStatus,strStatus)
//  objData: bXMLが真の場合は取得されたXMLデータ、偽の場合はテキストデータ
//  nStatus: HTTPのスデータスコード
//  strStatus: HTTPのスデータステキスト
// nTimeout: 非同期処理時のタイムアウト(ms)
// 戻り値:
//  非同期処理時はリクエストのID
//  同期処理時はbXMLが真の場合は取得されたXMLデータ、偽の場合はテキストデータ
//  失敗時: false
{
	var bAsync=false;
	var objHttpRequest=new Object();
	objHttpRequest.objHTTP=CreateXMLHttpRequest();
	if (objHttpRequest.objHTTP) {
		var strMethod;
		if (fnCallbackFunc) {
			bAsync=true;
			objHttpRequest.fnCallbackFunc=fnCallbackFunc;
			objHttpRequest.bXML=bXML;
			if (g_ajax_nRequests>0) {
				objHttpRequest.nID=g_ajax_aRequests[g_ajax_nRequests-1].nID+1;
			}
			else {
				objHttpRequest.nID=1;
			}
			g_ajax_aRequests[g_ajax_nRequests]=objHttpRequest;
			g_ajax_nRequests++;
			objHttpRequest.objHTTP.onreadystatechange=function() {
				if (objHttpRequest.objHTTP.readyState == 4) {
					clearTimeout(objHttpRequest.nTimer);
					OnHttpRequestReadyStateChange(objHttpRequest);
				}
			}
			objHttpRequest.nTimer=setInterval("AbortHttpRequest("+objHttpRequest.nID+")", nTimeout);
		}
		if (strData && strData.length>0) {
			strMethod="POST";
		}
		else {
			strData="";
			strMethod="GET";
		}
		objHttpRequest.objHTTP.open(strMethod,strTargetURL,bAsync);
		objHttpRequest.objHTTP.send(strData);
		if (bAsync) {
			return objHttpRequest.nID;
		}
		else {
			if (bXML) {
				return objHttpRequest.objHTTP.responseXML;
			}
			else {
				return objHttpRequest.objHTTP.responseText;
			}
		}
	}
	return false;
}

//-補助関数--------------------------------------------------------------------
// HttpRequest完了ハンドラ
function OnHttpRequestReadyStateChange(objHttpRequest)
{
	if (objHttpRequest.fnCallbackFunc) {
		var nPos,nStatus,strStatus;
		var fnCallbackFunc=objHttpRequest.fnCallbackFunc;
		objHttpRequest.fnCallbackFunc=false;
		if (objHttpRequest.objHTTP.status) {
			nStatus=objHttpRequest.objHTTP.status;
			strStatus=objHttpRequest.objHTTP.statusText;
		}
		else {
			if (objHttpRequest.objHTTP.responseText) {
				nStatus=200;
				strStatus="OK";
			}
			else {
				nStatus=0;
				strStatus="Unknown Error";
			}
		}
		if (objHttpRequest.bXML) {
			fnCallbackFunc(objHttpRequest.objHTTP.responseXML,nStatus,strStatus);
		}
		else {
			fnCallbackFunc(objHttpRequest.objHTTP.responseText,nStatus,strStatus);
		}
		for (nPos=0;nPos<g_ajax_nRequests;nPos++) {
			if (g_ajax_aRequests[nPos].nID==objHttpRequest.nID) {
				g_ajax_nRequests--;
				if (nPos!=g_ajax_nRequests) {
					g_ajax_aRequests[nPos]=g_ajax_aRequests[g_ajax_nRequests];
					g_ajax_aRequests[g_ajax_nRequests]=null;
				}
				break;
			}
		}
	}
}

//=============================================================================
// 非同期によるHttpRequestの中断
function AbortHttpRequest(nHttpRequestID)
// nHttpRequestID: リクエストID (HttpRequestの戻り値)
{
	var nPos;
	for (nPos=0;nPos<g_ajax_nRequests;nPos++) {
		if (g_ajax_aRequests[nPos].nID==nHttpRequestID) {
			clearTimeout(g_ajax_aRequests[nPos].nTimer);
			g_ajax_aRequests[nPos].objHTTP.abort();
			g_ajax_nRequests--;
			if (nPos!=g_ajax_nRequests) {
				g_ajax_aRequests[nPos]=g_ajax_aRequests[g_ajax_nRequests];
				g_ajax_aRequests[g_ajax_nRequests]=null;
			}
			break;
		}
	}
}

//-補助関数--------------------------------------------------------------------
// XMLHttpRequestオブジェクトの取得(クロスプラットフォーム)
function CreateXMLHttpRequest()
// 戻り値:
//  成功時 XMLHttpRequestオブジェクト
//  失敗時 false
{
	if (window.XMLHttpRequest) {             // Mozilla, Firefox, Safari, IE7
		return new XMLHttpRequest();
	} else if (window.ActiveXObject) {       // IE5, IE6
		return CreateXMLHttpRequestActiveX();
	}
	return false;
}

//-補助関数--------------------------------------------------------------------
// IE5, IE6用XMLHttpRequestオブジェクトの取得(クロスプラットフォーム)
function CreateXMLHttpRequestActiveX()
// 戻り値:
//  成功時 XMLHttpRequestオブジェクト
//  失敗時 false
{
	try {
		return new ActiveXObject("Msxml2.XMLHTTP"); // MSXML3
	} catch (e) {
		try {
			return new ActiveXObject("Microsoft.XMLHTTP"); // MSXML2まで
		} catch (e2) {
			return false;
		}
	}
}

//-補助関数--------------------------------------------------------------------
// IE5, IE6用XMLHttpRequestオブジェクトの取得(クロスプラットフォーム)
//function CreateXMLHttpRequestActiveX()
// 戻り値:
//  成功時 XMLHttpRequestオブジェクト
//  失敗時 false
//{
//	try {
//		return new ActiveXObject("Microsoft.XMLHTTP");
//	} catch (e) {
//		return false;
//	}
//}

//=============================================================================
// IDによるイベントリスナー登録(load前の予約も可)
function AddEventListenerByID(strID,strEvent,fnHandler) {
	var objTarget = document.getElementById(strID);
	if (objTarget) {
		return AddEventListener(objTarget,strEvent,fnHandler);
	}
	else {
		if (g_ajax_nEventListeners>=0) {
			var objEventListener=new Object();
			objEventListener.strID=strID;
			objEventListener.strEvent=strEvent;
			objEventListener.fnHandler=fnHandler;
			g_ajax_aEventListeners[g_ajax_aEventListeners.length]=objEventListener;
			g_ajax_nEventListeners++;
			return true;
		}
	}
	return false;
}

//=============================================================================
// オブジェクトのイベントリスナーの登録
function AddEventListener(objTarget, strEvent, fnHandler) {
	if(objTarget.addEventListener) {
		return objTarget.addEventListener(strEvent,fnHandler,false);
	} else if(objTarget.attachEvent) {
		return objTarget.attachEvent('on'+strEvent,fnHandler);
	}
	return false;
}

//-補助関数--------------------------------------------------------------------
// AddEventListenerByIDで予約されたリスナーの登録
function AddEventListeners(eEvent) {
	var nIndex;
	for (nIndex=0;nIndex<g_ajax_nEventListeners;nIndex++) {
		AddEventListenerByID(g_ajax_aEventListeners[nIndex].strID,g_ajax_aEventListeners[nIndex].strEvent,g_ajax_aEventListeners[nIndex].fnHandler);
	}
}

//=============================================================================
// 上位要素のイベントアクションとデフォルトイベントアクションを停止する
function StopEventHandling(eEvent)
// eEvent: 対象イベントオブジェクト
{
	if (window.event) {
		window.event.cancelBubble = true;
		window.event.returnValue = false;
	}
	else {
		if(eEvent.preventDefault) {
			eEvent.preventDefault();
			eEvent.stopPropagation();
		}
		if(e.preventDefault) {
		    e.preventDefault();
		}
	}
}

//=============================================================================
// イベントのターゲット要素の取得
function GetEventTarget(eEvent)
// eEvent: 対象イベントオブジェクト
// 戻り値: HTMLの要素オブジェクト
{
	var objTarget;
	if(eEvent.target) {
		objTarget=eEvent.target;
	} else {
		objTarget=eEvent.srcElement;
	}
	if (objTarget.nodeType == 3) {
		objTarget=objTarget.parentNode;
	}
	return objTarget;
}

//-デフォルトの動作------------------------------------------------------------
// AddEventListenerByIDで予約されたリスナーの登録をload時のイベントリスナーに
// セットする
AddEventListener(window, 'load', AddEventListeners);

