﻿// Copyright(C) 2006 Comfort Limited Company. All Rights Reserved.

//**************************************************************************************************
//* システム名称  ：
//* システムＩＤ  ：
//* モジュール名称：Ajax 的アプローチを実装するための基底クラス
//* モジュールＩＤ：_Ajax.js
//*------------------------------------------------------------------------------------------------*
//* 作成日付：2006/05/31
//* 作成者  ：秋田 育紀
//*------------------------------------------------------------------------------------------------*
//* 更新履歴：日付         内容                                                          担当者
//*------------------------------------------------------------------------------------------------*

//*------------------------------------------------------------------------------------------------*
//* 外部スクリプトのインクルード
//*------------------------------------------------------------------------------------------------*

	var __Ajax__ = true;

	if (typeof(__Const__) == "undefined") {
		document.write("<script language='javascript' type='text/javascript' charset='utf-8' src='../../common/asp/loadScript.asp?URL=../../common/js/inc/_Const.js'></script>");
	}


//*------------------------------------------------------------------------------------------------*
//* グローバル定数宣言
//*------------------------------------------------------------------------------------------------*


//*------------------------------------------------------------------------------------------------*
//* グローバル変数宣言
//*------------------------------------------------------------------------------------------------*


//*------------------------------------------------------------------------------------------------*
//* モジュール定数宣言
//*------------------------------------------------------------------------------------------------*


//*------------------------------------------------------------------------------------------------*
//* モジュール変数宣言
//*------------------------------------------------------------------------------------------------*


//**************************************************************************************************
//* 名称      ：Ajax 的アプローチを実装するための基底クラスのコンストラクタ
//* パラメータ：なし
//* 戻り値    ：なし
//*------------------------------------------------------------------------------------------------*
//* 作成日付：
//* 作成者  ：
//* 処理概要：
//*------------------------------------------------------------------------------------------------*
function _Ajax() {
	try {
		++_Ajax.count;

		this.XMLHttpRequest = null;
		this.EventListener  = new Object();

		this.status     = 0;
		this.statusText = "";

		this.responseText = "";
		this.responseXML  = "";

		return this;
	}
	catch (e) {
		this.initialize();
		throw e;
	}
}
//**************************************************************************************************
//* 名称      ：Ajax 的アプローチを実装するための基底クラスの初期処理
//* パラメータ：なし
//* 戻り値    ：なし
//*------------------------------------------------------------------------------------------------*
//* 作成日付：
//* 作成者  ：
//* 処理概要：
//*------------------------------------------------------------------------------------------------*
_Ajax.prototype.initialize = function() {
	if (this.XMLHttpRequest) delete this.XMLHttpRequest; this.XMLHttpRequest = null;
	if (this.EventListener ) delete this.EventListener;  this.EventListener  = null;
}
//**************************************************************************************************
//* 名称      ：Ajax 的アプローチを実装するための基底クラスの後処理
//* パラメータ：なし
//* 戻り値    ：なし
//*------------------------------------------------------------------------------------------------*
//* 作成日付：
//* 作成者  ：
//* 処理概要：
//*------------------------------------------------------------------------------------------------*
_Ajax.prototype.terminate = function() {
	if (this.XMLHttpRequest) delete this.XMLHttpRequest; this.XMLHttpRequest = null;
	if (this.EventListener ) delete this.EventListener;  this.EventListener  = null;
}
//**************************************************************************************************
//* 名称      ：HTML ドキュメントの要素の参照
//* パラメータ：ARG1 - vstrID     必ず指定。HTML ドキュメントの id 属性の値を指定します。
//*             ARG2 - oanyWindow 省略可能。参照する HTML ドキュメントを含んだウィンドウオブジェク
//*                                         トを指定します。
//* 戻り値    ：指定された HTML ドキュメントの要素
//*------------------------------------------------------------------------------------------------*
//* 作成日付：
//* 作成者  ：
//* 処理概要：指定の HTML ドキュメントの要素を参照する。
//*------------------------------------------------------------------------------------------------*
if (_IS_IE) {
	_Ajax.prototype.getElementById = function(vstrID, oanyWindow) {
		switch (typeof(oanyWindow)) {
		case "undefined": return document.all(vstrID);
		case "object":    return oanyWindow.document.all(vstrID);
		case "string":    return window(oanyWindow).document.all(vstrID);
		}
		return document.all(vstrID);
	};
} else {
	_Ajax.prototype.getElementById = function(vstrID, oanyWindow) {
		switch (typeof(oanyWindow)) {
		case "undefined": return document.getElementById(vstrID);
		case "object":    return oanyWindow.document.getElementById(vstrID);
		case "string":    return window(oanyWindow).document.getElementById(vstrID);
		}
		return document.getElementById(vstrID);
	};
}
//**************************************************************************************************
//* 名称      ：HTML ドキュメントの要素への HTML タグの追加
//* パラメータ：ARG1 - vstrID         必ず指定。HTML ドキュメントの id 属性の値を指定します。
//*             ARG2 - vstrHTMLString 必ず指定。追加する HTML タグを指定します。
//* 戻り値    ：なし
//*------------------------------------------------------------------------------------------------*
//* 作成日付：
//* 作成者  ：
//* 処理概要：指定の HTML ドキュメントの要素に対し、HTML タグを追加する。
//*------------------------------------------------------------------------------------------------*
_Ajax.prototype.setInnerHTML = function(vstrID, vstrHTMLString) {
	var objElement = this.getElementById(vstrID);

	try {
		objElement.style.visibility = "hidden";
		objElement.innerHTML = vstrHTMLString;
		objElement.style.visibility = "";
	}
	catch (e) {
		throw e;
	}
	finally {
		if (objElement) delete objElement; objElement = null;
	}
};
//**************************************************************************************************
//* 名称      ：HTML ドキュメントの要素に対するイベントリスナーの追加
//* パラメータ：ARG1 - vobjElement   必ず指定。イベントリスナーを追加する HTML ドキュメントの要素を
//*                                            指定します。
//*             ARG2 - vstrEventType 必ず指定。追加するイベント名を指定します。
//*             ARG3 - vobjFunction  必ず指定。イベントが発生した際に処理する関数ポインタを指定しま
//*                                            す。
//*             ARG4 - vblnCapture   必ず指定。イベントをキャプチャするかどうか？
//* 戻り値    ：なし
//*------------------------------------------------------------------------------------------------*
//* 作成日付：
//* 作成者  ：
//* 処理概要：指定の HTML ドキュメントの要素に対し、イベントリスナーを追加する。
//*------------------------------------------------------------------------------------------------*
if (_IS_IE) {
	_Ajax.prototype.addEventListener = function(vobjElement, vstrEventType, vobjFunction) {
		var strListenerName = "";

		try {
			for (var i=0; ; i++) {
				strListenerName = vobjElement.id + "_on" + vstrEventType + "_" + i;
				if (typeof(this.EventListener[strListenerName]) == "undefined") {
					this.EventListener[strListenerName] = vobjFunction;
					break;
				}
			}
			vobjElement.attachEvent("on"+vstrEventType, this.EventListener[strListenerName]);
		}
		catch (e) {
			throw e;
		}
	};
} else {
	_Ajax.prototype.addEventListener = function(vobjElement, vstrEventType, vobjFunction, vblnCapture) {
		var strListenerName = "";

		try {
			for (var i=0; ; i++) {
				strListenerName = vobjElement.id + "_on" + vstrEventType + "_" + i;
				if (typeof(this.EventListener[strListenerName]) == "undefined") {
					this.EventListener[strListenerName] = vobjFunction;
					break;
				}
			}
			vobjElement.addEventListener(vstrEventType, this.EventListener[strListenerName], vblnCapture);
		}
		catch (e) {
			throw e;
		}
	};
}
//**************************************************************************************************
//* 名称      ：HTML ドキュメントの要素に対するイベントリスナーの削除
//* パラメータ：ARG1 - vobjElement   必ず指定。イベントリスナーを削除する HTML ドキュメントの要素を
//*                                            指定します。
//*             ARG2 - vstrEventType 必ず指定。削除するイベント名を指定します。
//*             ARG3 - vobjFunction  必ず指定。イベントが発生した際に処理する関数ポインタを指定しま
//*                                            す。
//*             ARG4 - vblnCapture   必ず指定。イベントをキャプチャするかどうか？
//* 戻り値    ：なし
//*------------------------------------------------------------------------------------------------*
//* 作成日付：
//* 作成者  ：
//* 処理概要：指定の HTML ドキュメントの要素に対し、イベントリスナーを削除する。
//*------------------------------------------------------------------------------------------------*
if (_IS_IE) {
	_Ajax.prototype.removeEventListener = function(vobjElement, vstrEventType, vobjFunction) {
		var strListenerName = "";

		try {
			for (strListenerName in this.EventListener) {
				if (this.EventListener[strListenerName].toString() == vobjFunction.toString()) {
					vobjElement.detachEvent("on"+vstrEventType, this.EventListener[strListenerName]);
				}
			}
		}
		catch (e) {
			throw e;
		}
	};
} else {
	_Ajax.prototype.removeEventListener = function(vobjElement, vstrEventType, vobjFunction, vblnCapture) {
		var strListenerName = "";

		try {
			for (strListenerName in this.EventListener) {
				if (this.EventListener[strListenerName].toString() == vobjFunction.toString()) {
					vobjElement.removeEventListener(vstrEventType, this.EventListener[strListenerName], vblnCapture);
				}
			}
		}
		catch (e) {
			throw e;
		}
	};
}
//**************************************************************************************************
//* 名称      ：HTTP リクエストの送信
//* パラメータ：ARG1 - vstrOpenURL    必ず指定。HTTP リクエストを送信するサーバーの URL を指定します。
//*             ARG2 - vobjParameters 必ず指定。HTTP リクエストを送信する際のリクエストパラメータを
//*                                             指定します。
//*             ARG3 - oblnAsync      省略可能。true：非同期、false：同期
//*                                             省略した場合は、非同期
//*             ARG4 - ostrCharset    省略可能。Content-Type ヘッダーの文字セット名を指定します。
//*                                             省略した場合は、UTF-8
//* 戻り値    ：なし
//*------------------------------------------------------------------------------------------------*
//* 作成日付：
//* 作成者  ：
//* 処理概要：HTTP リクエストを送信する。
//*------------------------------------------------------------------------------------------------*
if (_IS_IE) {
	_Ajax.prototype.sendRequest = function(vstrOpenURL, vobjParameters, oblnAsync, ostrCharset) {
		var _self_ = this;

		var objXMLHttpRequest = null;

		var strMethod = "POST";

		try {
			_self_.status     = 0;
			_self_.statusText = "";

			_self_.responseText = "";
			_self_.responseXML  = "";

			if (vobjParameters == null || vobjParameters.length == 0) {
				strMethod = "GET";
			}
			if (oblnAsync == null) {
				oblnAsync = true;
			}
			if (ostrCharset == null) {
				ostrCharset = "UTF-8";
			}
			if (!_self_.XMLHttpRequest) {
				_self_.XMLHttpRequest = new ActiveXObject(_ACTIVEX_XMLHTTP);
			}
			objXMLHttpRequest = _self_.XMLHttpRequest;
			objXMLHttpRequest.open(strMethod, vstrOpenURL, oblnAsync);
			objXMLHttpRequest.setRequestHeader("content-type", "application/x-www-form-urlencoded;charset=" + ostrCharset);
			objXMLHttpRequest.setRequestHeader("If-Modified-Since", "Thu, 01 Jun 1970 00:00:00 GMT");

			if (oblnAsync) {
				objXMLHttpRequest.onreadystatechange = function() {
					if (objXMLHttpRequest.readyState != 4) {
						return;
					}
					if (objXMLHttpRequest.status != 200) {
						_self_.status     = objXMLHttpRequest.status;
						_self_.statusText = objXMLHttpRequest.statusText;
						if (typeof(_self_.onError) == "function") {
							_self_.onError(_self_.status, _self_.statusText);
						}
						return;
					}
					_self_.responseText = objXMLHttpRequest.responseText;
					_self_.responseXML  = objXMLHttpRequest.responseXML;
					if (typeof(_self_.onLoad) == "function") {
						_self_.onLoad();
					}
				};
			}

			objXMLHttpRequest.send(vobjParameters);

			if (!oblnAsync) {
				if (objXMLHttpRequest.status != 200) {
					_self_.status     = _self_.XMLHttpRequest.status;
					_self_.statusText = _self_.XMLHttpRequest.statusText;
					if (typeof(_self_.onError) == "function") {
						_self_.onError(_self_.status, _self_.statusText);
					}
					return;
				}
				_self_.responseText = objXMLHttpRequest.responseText;
				_self_.responseXML  = objXMLHttpRequest.responseXML;
				if (typeof(_self_.onLoad) == "function") {
					_self_.onLoad();
				}
			}
		}
		catch (e) {
			throw e;
		}
	};
} else {
	_Ajax.prototype.sendRequest = function(vstrOpenURL, vobjParameters, oblnAsync, ostrCharset) {
		var _self_ = this;

		var objXMLHttpRequest = null;

		var strMethod = "POST";

		try {
			_self_.status     = 0;
			_self_.statusText = "";

			_self_.responseText = "";
			_self_.responseXML  = "";

			if (vobjParameters == null || vobjParameters.length == 0) {
				strMethod = "GET";
			}
			if (oblnAsync == null) {
				oblnAsync = true;
			}
			if (ostrCharset == null) {
				ostrCharset = "UTF-8";
			}
			if (!_self_.XMLHttpRequest) {
				_self_.XMLHttpRequest = new XMLHttpRequest();
			}
			objXMLHttpRequest = _self_.XMLHttpRequest;
			objXMLHttpRequest.open(strMethod, vstrOpenURL, oblnAsync);
			objXMLHttpRequest.setRequestHeader("content-type", "application/x-www-form-urlencoded;charset=" + ostrCharset);
			objXMLHttpRequest.setRequestHeader("If-Modified-Since", "Thu, 01 Jun 1970 00:00:00 GMT");

			if (oblnAsync) {
				objXMLHttpRequest.onload = function() {
					if (objXMLHttpRequest.readyState != 4) {
						return;
					}
					if (objXMLHttpRequest.status != 200) {
						_self_.status     = objXMLHttpRequest.status;
						_self_.statusText = getStatusText(objXMLHttpRequest);
						if (typeof(_self_.onError) == "function") {
							_self_.onError(_self_.status, _self_.statusText);
						}
						return;
					}
					_self_.responseText = objXMLHttpRequest.responseText;
					_self_.responseXML  = objXMLHttpRequest.responseXML;
					if (typeof(_self_.onLoad) == "function") {
						_self_.onLoad();
					}
				}
			}

			objXMLHttpRequest.send(vobjParameters);

			if (!oblnAsync) {
				if (objXMLHttpRequest.status != 200) {
					_self_.status     = _self_.XMLHttpRequest.status;
					_self_.statusText = getStatusText(objXMLHttpRequest);
					if (typeof(_self_.onError) == "function") {
						_self_.onError(_self_.status, _self_.statusText);
					}
					return;
				}
				_self_.responseText = objXMLHttpRequest.responseText;
				_self_.responseXML  = objXMLHttpRequest.responseXML;
				if (typeof(_self_.onLoad) == "function") {
					_self_.onLoad();
				}
			}
		}
		catch (e) {
			throw e;
		}
	};

	function getStatusText(vobjXMLHttpRequest) {
		var objDocumentElement = null;
		var strErrorString     = null;

		try {
			strErrorString = new String();

			if(!vobjXMLHttpRequest.documentElement || (objDocumentElement = vobjXMLHttpRequest.documentElement).tagName == "parsererror") {
				if(objDocumentElement.tagName == "parsererror") {
					strErrorString += objDocumentElement.firstChild.data + "\n";
					strErrorString += objDocumentElement.firstChild.nextSibling.firstChild.data;
				} else {
					strErrorString += getPaseErrorString(objDocumentElement);
				}
			}

			return strErrorString;
		}
		catch (e) {
			throw e;
		}
		finally {
			if (objDocumentElement) delete objDocumentElement; objDocumentElement = null;
			if (strErrorString)     delete strErrorString;     strErrorString     = null;
		}
	}

	function getPaseErrorString(vobjElement) {
		var objNode = null;
		var strErrorString = "";

		try {
			for (var i=0; i<vobjElement.childNodes.length; i++) {
				switch ((objNode = vobjElement.childNodes[i]).nodeType) {
				case 3: case 4:          strErrorString += objNode.data;                break;
				case 1: case 9: case 11: strErrorString += getPaseErrorString(objNode); break;
				}
			}

			return strErrorString;
		}
		catch (e) {
			throw e;
		}
		finally {
			if (objNode)        delete objNode;        objNode        = null;
			if (strErrorString) delete strErrorString; strErrorString = null;
		}
	}
}
//**************************************************************************************************
//* End Of File
//**************************************************************************************************
