if( ! window.info ) { var info = {}; }
if( ! info.vividcode ) { info.vividcode = {}; }
if( ! info.vividcode.ajax ) { info.vividcode.ajax = {}; }

/**
 * XMLHttpRequest の代わりになるオブジェクト
 */
info.vividcode.ajax.XHR = function( aTargetURI, aParam, aListener ) {
	// req の取得
	var mReq = null;
	if( window.XMLHttpRequest ) {
		// ブラウザ内蔵型の場合
		mReq = new XMLHttpRequest();
	} else if( window.ActiveXObject ) {
		try {
			mReq = new ActiveXObject("MXSML2.XMLHTTP");
		} catch(e) {
			try {
				mReq = new ActiveXObject("Microsoft.XMLHTTP");
			} catch (e) {}
		}
	}
	this.testReq = mReq;
	/** 送信先 URI */
	var mTargetURI = aTargetURI;
	/** 送信時のパラメータ */
	var mParam = aParam;
	/** 受信時に実行される関数. 第 1 引数は成功か失敗か. 第 2 引数が内容 */
	var mListener = aListener;
	/** 受信時に実行 */
	var getResponse = function() {
		var success;
		var value;
		try {
			if( mReq.readyState == 4 ) { // req.readyState が 4 で受信完了
				if( mReq.status == 200 ) { // 正常に受信できている時は 200
					success = true;
					value = mReq.responseXML;
				} else {
					success = false;
					//if( mReq.statusText ) {
					//	value = mReq.statusText;
					//}
				}
				if( mListener ) {
					try {
						mListener(success, value);
					} catch(e) {
						//window.alert( e + "\n" + "[info.vividcode.ajax.XHR の初期化時に設定した関数内にて発生]");
					}
				}
			}
		} catch(e) {
			window.alert( e + "\n" + "[info.vividcode.ajax.XHR の内部関数にて発生]");
		}
	};
	this.send = function() {
		// req が取得できなかった場合例外発生
		if( mReq == null ) {
			throw new Error("XMLHttpRequest オブジェクトが取得できません. ");
		}
		// 状態変化時に呼び出すメソッドの設定
		// req の状態が変化すると (サーバから応答があると) getResponse 関数が呼び出される
		mReq.onreadystatechange = getResponse;
		// 要求を出す相手を設定
		// ドメインが異なる場合は不可, 第 3 引数は非同期通信か否か
		mReq.open("POST", mTargetURI, true);
		// RequestHeader の設定. POST メソッドの場合は必要
		mReq.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");
		// 送信
		mReq.send(mParam);
	};
};
