/* 
 * Ajax通信制御ライブラリ
 * 
 * (C)SmartRams Co.,Ltd. 2008 All Rights Reserved．
 * 
 * 本技術情報には当社の機密情報が含まれておりますので、当社の
 * 書面による承諾がなく第３者に開示することはできません。
 * また、当社の承諾を得た場合であっても、本技術情報は外国為替
 * 及び外国貿易管理法に定める特定技術に該当するため、非居住者
 * に提供する場合には、同法に基づく許可を要することがあります。
 *                                          有限会社 スマート・ラムズ
 *-------------------------------------------------------------------
 * 
 * @package 
 * @author   岡本 順子
 * @language JavaScript
 * @version  1.0
 * @since    2007/06/25 ver1.0 初版作成  岡本 順子
 * @info     ctl_layer.jsと併用して使用すると幸せになれる
 */


/*****************************
  オブジェクト操作
******************************/
/*
 * XMLHttpRequestオブジェクト生成
 * @access	public
 * @param	なし
 * @return	object				XMLHttpRequest
 * @info    なし
 */
function createXMLHttpRequest() {
	if (window.XMLHttpRequest) {			// Mozilla, Firefox, Safari, IE7 ...
		return new XMLHttpRequest();
	} else if (window.ActiveXObject) {		// IE5, IE6
		try {
			return new ActiveXObject("Msxml2.XMLHTTP");			// MSXML2以降
		} catch(e) {
			try {
				return new ActiveXObject("Microsoft.XMLHTTP");	// 旧MSXML
			} catch (e2) {
				return null;
			}
		}
	} else {
		return null;
	}
}

/*****************************
  通信
******************************/
/*
 * GET通信
 * @access	public
 * @param	object	callback	正常終了時コールバック関数
 * @param	string	url			通信先URL
 * @param	boolean	async		通信を非同期とするか否か
 * 									true:非同期 / false:同期-通信完了まで処理がブロックされる
 * @return	なし
 * @info    なし
 */
function getTransfer(callback, url, async) {

	// パラメータが省略された場合の擬似オーバーロード
	if (arguments.length < 3) async = true;

	// XMLHttpRequestオブジェクト生成
	var xmlhttp = createXMLHttpRequest();
	if (!xmlhttp) {
		alert("XMLHttpRequest失敗");
		return;
	}

	// openメソッド
	xmlhttp.open("GET", url, async);

	// 受信時に起動するイベントを指定
	xmlhttp.onreadystatechange = function() {
		// readyState : 0=uninitialized、1=loading、2=loaded、3=interactive、4=complete
		if (xmlhttp.readyState == 4) {
			// status : 200=OK、404=Not Found ...
			if (xmlhttp.status == 200) {
				// 正常終了時コールバック実行
				callback(xmlhttp);
			} else {
				alert("通信エラー");
			}
		}
	}

	// sendメソッド
	xmlhttp.send("");	// Operaではnullを受け付けない為、空白文字列を渡す
}
/*
 * POST通信
 * @access	public
 * @param	object	callback	正常終了時コールバック関数
 * @param	string	url			通信先URL
 * @param	string	param		POSTにて送信するデータ
 * 									key1=value1&key2=value2&key3=value3...形式
 * 									valueにはencodeURIComponentを施すこと
 * @param	boolean	async		通信を非同期とするか否か
 * 									true:非同期 / false:同期-通信完了まで処理がブロックされる
 * @return	なし
 * @info    なし
 */
function postTransfer(callback, url, param, async) {

	// パラメータが省略された場合の擬似オーバーロード
	if (arguments.length < 3) param = "";	// Operaではnullを受け付けない為、空白文字列を渡す
	if (arguments.length < 4) async = true;

	// XMLHttpRequestオブジェクト生成
	var xmlhttp = createXMLHttpRequest();
	if (!xmlhttp) {
		alert("XMLHttpRequest失敗");
		return;
	}

	// openメソッド
	xmlhttp.open("POST", url, async);
	xmlhttp.setRequestHeader("Content-Type" , "application/x-www-form-urlencoded");

	// 受信時に起動するイベントを指定
	xmlhttp.onreadystatechange = function() {
		// readyState : 0=uninitialized、1=loading、2=loaded、3=interactive、4=complete
		if (xmlhttp.readyState == 4) {
			// status : 200=OK、404=Not Found ...
			if (xmlhttp.status == 200) {
				// 正常終了時コールバック実行
				callback(xmlhttp);
			} else {
				alert("通信エラー");
			}
		}
	}

	// sendメソッド
	xmlhttp.send(param);
}

/*****************************
  パラメータ配列操作
******************************/
/*
 * 連想配列のPOSTパラメータ化
 * @access	public
 * @param	object	params		パラメータ格納連想配列
 * 									var param = new Object();
 * 									param["key1"] = "value1";
 * 									param["key2"] = "value2";
 * 									param["key3"] = "value3";
 * 									というふうにして作成する
 * @return	string				key1=value1&key2=value2&key3=value3...形式のPOSTパラメータ文字列
 * @info    なし
 */
function arrayToPostParam(params) {
	var array = new Array();
	for(var key in params) {
		array.push(key + "=" + encodeURIComponent(params[key]));
	}
	return array.join("&");		// key1=value1&key2=value2&key3=value3
}

