/*** メソッドを省略した場合のデフォルト値 ***/
var AJAX_DEFAULT_METHOD = "GET";


/***************************************40
 * ブラウザに応じたHTTPクライアントな機能を
 * 実現するXMLHttpRequestオブジェクトを作成する
 * *************************************
 * @param 
 * @return 作成されたXMLHttpRequestオブジェクト
 */
function Create_Ajax() {
  var ajax = false;
  
  // IE以外
  if(window.XMLHttpRequest) {
    ajax = new XMLHttpRequest();
  // IE用
  } else if(window.ActiveXObject) {
    try {
       ajax = new ActiveXObject("Msxml2.XMLHTTP");
    } catch(e) {
       ajax = new ActiveXObject("Microsoft.XMLHTTP");
    }
  }
  
  return ajax;
}

/***************************************40
 * サーバより受信したXMLを解析し、
 * 変数またはオブジェクトの形へ加工したものを返す
 * *************************************
 * @param  xml : 処理対象のXML
 * @return 値  : 引数XMLの子要素が1つの場合
 *         オブジェクト : 引数XMLの子要素が複数の場合
 */
function Ajax_SetData(xml) {
  // データの取得に失敗した場合
  if (xml == null) {
    return null;
  }
  
  var len = xml.childNodes.length;
  
  // 値の場合
  if (len == 1 && !xml.childNodes[0].getAttribute('key')) {
    return Ajax_GetData(xml.childNodes[0]);
  }
  
  // オブジェクトの場合
  var obj = new Object();
  for (var i=0; i<len; i++) {
    var item = xml.childNodes[i];
    var key = item.getAttribute('key');
    var val = Ajax_GetData(item);
    obj[key] = val;
    if (item.childNodes.length > 1) {
      obj[key] = Ajax_SetData(item);
    }
  }
  
  return obj;
}

/***************************************40
 * 引数XMLの最初の要素から値を取り出す
 * *************************************
 * @param : xml : 処理対象のXML
 * @return : 引数XMLから取り出した値
 */
function Ajax_GetData(xml) {
    if (xml.childNodes[0]) {
      var val = xml.childNodes[0].nodeValue;
      if (xml.getAttribute('type') == 'n') {
        return eval(val);
      } else {
        return val;
      }
    } else {
      return '';
    }
}

/***************************************40
 * URLを解析し、スクリプト名とデータに分割する
 * *************************************
 * @param : URL
 * @return : 配列 [0]スクリプト名、[1]データ
 */
function Ajax_ParseUrl(Url) {
  var SplitIndex = Url.indexOf('?')
  if (SplitIndex >= 0) {
    var Page = Url.substr(0,SplitIndex);
    var Data = Url.substr(SplitIndex+1);
  } else {
    Page = Url;
    Data = "";
  }
  return Array(Page,Ajax_EncodeURI(Data));
}

/***************************************40
 * リクエストを送信する
 * *************************************
 * @param : ajax   : XMLHttpRequestオブジェクト
 *         Url    : 送信先URL
 *         Method : GETまたはPOST
 * @return  
 */
function Ajax_Open(ajax, Url, Method) {
  Method = Method ? Method : AJAX_DEFAULT_METHOD;
  
  var UrlParts = Ajax_ParseUrl(Url);
  
  if (Method.toUpperCase() == "POST") {
    ajax.open("POST", UrlParts[0]);
  } else {
    ajax.open("GET", Ajax_EncodeURI(Url));
  }
}

/***************************************40
 * データを送信する
 * *************************************
 * @param : ajax   : XMLHttpRequestオブジェクト
 *         Url    : 送信先URL
 *         Method : GETまたはPOST
 * @return : 
 */
function Ajax_Send(ajax, Url, Method) {
  Method = Method ? Method : AJAX_DEFAULT_METHOD;
  
  var UrlParts = Ajax_ParseUrl(Url);
  
  if (Method.toUpperCase() == "POST") {
    ajax.setRequestHeader("Content-Type", "application/x-www-form-urlencoded;charset=UTF-8");
    ajax.send(UrlParts[1]);
  } else {
    ajax.send(null);
  }
}

/***************************************40
 * 文字列をエンコードする
 * *************************************
 * 数値側の場合にも対応
 * @param : str : 文字列
 *         all : 1:すべての文字列をエンコードする
 *               0:予約語（/?:@&=+$#）以外の文字列をエンコードする
 * @return 
 */
function Ajax_Encode(str,all){
    var s0, i, s, u;
    var no_escape_str = "/?:@&=+$#";
    s0 = "";                // encoded str
    if(isNaN(str)) {
		for (i = 0; i < str.length; i++){   // scan the source
			s = str.charAt(i);
			u = str.charCodeAt(i);   // get unicode of the char
			if (s == " "){
				s0 += "+";   // SP should be converted to "+"
			} else if (!all && no_escape_str.indexOf(s) >= 0) {
				s0 += s;
			} else {
				if ( u == 0x2a || u == 0x2d || u == 0x2e || u == 0x5f || ((u >= 0x30) && (u <= 0x39)) || ((u >= 0x41) && (u <= 0x5a)) || ((u >= 0x61) && (u <= 0x7a))){       // check for escape
					s0 = s0 + s;            // don't escape
				}else {                  // escape
					if ((u >= 0x0) && (u <= 0x7f)){     // single byte format
						s = "0"+u.toString(16);
						s0 += "%"+ s.substr(s.length-2);
					}else if (u > 0x1fffff){     // quaternary byte format (extended)
						s0 += "%" + (oxf0 + ((u & 0x1c0000) >> 18)).toString(16);
						s0 += "%" + (0x80 + ((u & 0x3f000) >> 12)).toString(16);
						s0 += "%" + (0x80 + ((u & 0xfc0) >> 6)).toString(16);
						s0 += "%" + (0x80 + (u & 0x3f)).toString(16);
					}else if (u > 0x7ff){        // triple byte format
						s0 += "%" + (0xe0 + ((u & 0xf000) >> 12)).toString(16);
						s0 += "%" + (0x80 + ((u & 0xfc0) >> 6)).toString(16);
						s0 += "%" + (0x80 + (u & 0x3f)).toString(16);
					}else {                      // double byte format
						s0 += "%" + (0xc0 + ((u & 0x7c0) >> 6)).toString(16);
						s0 += "%" + (0x80 + (u & 0x3f)).toString(16);
					}
				}
			}
		}
	}else {
		s0 = str;
	}// end if
    //alert('[' + s0 + ' ]');
    return s0;
}

/***************************************40
 * IE6以降で追加されたencodeURI()関数の代替
 * すべての文字列をエンコードする
 * *************************************
 * @param : 文字列
 * @return : エンコードされた文字列
 */
function Ajax_EncodeURI(str) {
  return Ajax_Encode(str,0);
}

/***************************************40
 * IE6以降で追加されたencodeURIComponent()関数の代替
 * 予約語（/?:@&=+$#）以外の文字列をエンコードする
 * *************************************
 * @param: 文字列
 * @return : エンコードされた文字列
 */
function Ajax_EncodeURIComponent(str) {
  return Ajax_Encode(str,1);
}



/***************************************40
 * データをサーバへ送信し、結果を得る(配列可)。
 * 結果取得後、実行関数名（第3引数）があれば実行する。
 * *************************************
 * @param: Url      : 送信先URL
 *         CallBack : 結果取得後,実行する関数名（省略可）
 *         Method   : GETまたはPOST（省略可）
 * @return 
 */
function Ajax_Query(Url, CallBack, Method) {
  var ajax = Create_Ajax();
  
  Ajax_Open(ajax, Url, Method);
  
  ajax.onreadystatechange = function() {
    if (ajax.readyState == 4 && ajax.status == 200) {
      if (CallBack) {
        try {
			var obj = Ajax_SetData(ajax.responseXML.documentElement);
			CallBack(obj);
        }catch(e){}
      }
    }
  }
  
  Ajax_Send(ajax, Url, Method);
}

/***************************************40
 * 指定したHTMLタグの部分を置き換える
 * *************************************
 * @param  : Url    : 送信先URL
 *         ObjId  : 置き換える部分のHTMLタグ名
 *         Method : GETまたはPOST（省略可）
 * @return  
 */
function Ajax_Replace(Url, ObjId, Method) {
  var ajax = Create_Ajax();
  
  Ajax_Open(ajax, Url, Method);
  
  ajax.onreadystatechange = function() {
    if (ajax.readyState == 4 && ajax.status == 200) {
      var obj = document.getElementById(ObjId);
      obj.innerHTML = ajax.responseText;
    }
  }
  
  Ajax_Send(ajax, Url, Method);
}

/***************************************40
 * リストボックスの内容を置き換える
 * *************************************
 * @param : Url : 送信先URL
 *         Obj : リストボックスオブジェクト名
 *         Method : GETまたはPOST（省略可）
 * @return 
 */
function Ajax_Listbox(Url, Obj, Method) {
  ajax_listbox_callback = function(res) {
    var len = 0;
    for (i in res) {
      len++;
    }
    Obj.length = 0;
    Obj.length = len;
    var j = 0;
    for (i in res) {
      Obj[j].value = res[i].value;
      Obj[j].text = res[i].text;
      if (res[i].selected) {
        Obj[j].selected = true;
      }
      j++;
    }
  }
  Ajax_Query(Url, ajax_listbox_callback, Method);
}

/***************************************40
 * データを付加したURLを生成する
 * *************************************
 * @param : Url     : URL
 *         DataObj : オブジェクト
 * @return : エンコードされたURL
 */
function mkUrl(Url, DataObj) {
  if (!DataObj) {
    return Url;
  } else {
    var QStr = "";
    for (i in DataObj) {
      //alert(i);
      //alert(DataObj[i]);
      QStr += "&" + Ajax_EncodeURIComponent(i) + "=" + Ajax_EncodeURIComponent(DataObj[i]);
    }// end for
    //alert(QStr);
    if(Url.indexOf("?")>1) {
    	return Url + "&" + QStr.substr(1);
    }else {
	    return Url + "?" + QStr.substr(1);
    }// end if
  }
}

/***************************************40
 * データを付加したURLを生成する
 * *************************************
 * @param : Url     : URL
 *        DataArr : 配列
 * @return : エンコードされたURL
 */
function mkUrlArr(Url, DataArr) {
 if (!DataArr) {
   return Url;
 } else {
   var QStr = "";
   for (i in DataArr) {
	 if(typeof(DataArr[i]) == "string"){
		QStr += "&" + Ajax_EncodeURIComponent(i) + "=" + Ajax_EncodeURIComponent(DataArr[i]);
	 }else{
		for(j in DataArr[i]){
			QStr += "&" + Ajax_EncodeURIComponent(i)+"["+j+"]=" + Ajax_EncodeURIComponent(DataArr[i][j]);
		}
	 }
   }
   return Url + "?" + QStr.substr(1);
 }
}

/***************************************40
 * クッキーからの読み込み用関数
 ***************************************
 */
function getCookie(key){
    tmp = document.cookie+";";
    tmp1 = tmp.indexOf(key,0);
    if(tmp1 != -1){
        tmp = tmp.substring(tmp1,tmp.length);
        start = tmp.indexOf("=",0);
        end = tmp.indexOf(";",start);
        return(unescape(tmp.substring(start+1,end)));
    }
    return("");
}

