//===================================================
//XML HTTP utility
//===================================================

var isIE = ((navigator.userAgent.toLowerCase().indexOf("msie") != -1) 
			&& 
			(navigator.userAgent.toLowerCase().indexOf("opera") == -1));
			
var isSV1 = (window.navigator.userAgent.indexOf("SV1") > -1);

// static
function getXMLHTTP(){
	var xmlhttp;
	// IE Browsers
	var progIDs = ["msxml2.xmlhttp.5.0","msxml2.xmlhttp.4.0","msxml2.xmlhttp.3.0","msxml2.xmlhttp","Microsoft.XMLHttp"];
	for(var currentProgID = 0;currentProgID < progIDs.length;currentProgID++){
		try{
			xmlhttp = new ActiveXObject(progIDs[currentProgID]);
			isIE = true;
			return xmlhttp;
		}catch(e){}
	}
	// Mozilla Browsers
	if(!xmlhttp && typeof XMLHttpRequest != "undefined") {
		xmlhttp = new XMLHttpRequest();
		isIE = false;
		return xmlhttp;
	}
}

function include_ajax(area_name, url){
	var xmlhttp = getXMLHTTP();
	if(url){
		xmlhttp.open("POST", url, true);
		xmlhttp.onreadystatechange = function(){
			if(xmlhttp.readyState == 4){
				if(xmlhttp.status == 200){
					document.getElementById(area_name).innerHTML = xmlhttp.responseText;
				}else{
					//alert("Error loading " + url + ", " + xmlhttp.status + "("+ xmlhttp.statusText + ")" )'
				}
			}
		}
		xmlhttp.send(null);
	}
	return false;
}

function err_Handler(_user_err_handler, xmlhttp){
	this.err_check = false;
	this.user_err_handler = _user_err_handler;
	this.err=	function(errorMsg){
					this.err_check = true;
					if(this.user_err_handler != null && this.user_err_handler != 'undefined'){
						this.user_err_handler(errorMsg, xmlhttp);
					}else{
						alert(errorMsg);
					}
				};
}

function _after_xmlCall(xmlhttp, _url, _asyncCallback, errorH){
	if(xmlhttp.readyState != 4) return;
	if(xmlhttp.status == 404) {
		errorH.err(_url+" 404 URL doesn't exist!");
		return;
	}else if(xmlhttp.status == 500) {
		errorH.err(_url+" 500 Internal Server Error! \r\n\r\n"+xmlhttp.responseText);
		return;
	}else if(xmlhttp.status != 200) {
		errorH.err("HTTP Error Code:"+xmlhttp.status);
		return;
	}
	
	var xmldoc = xmlhttp.responseXML;
	//The Browser is IE, and XML parse failed
	if (isIE && xmldoc.parseError.errorCode != 0){		
		errorH.err("Error:"+xmldoc.parseError.errorCode+ "\r\n\r\n Reason:" + xmldoc.parseError.reason+ xmlhttp.responseText);
		return;
	}
	// The Browser is not IE, and XML parse failed
	if(!isIE && xmldoc.documentElement.nodeName == 'parsererror' && xmldoc.documentElement.childNodes != null){
		errorH.err(xmldoc.documentElement.childNodes.item(0).nodeValue + xmlhttp.responseText);
		return;
	}
	if(xmldoc.documentElement == null){
		errorH.err("Content type of http response must be 'text/xml'");
		return;
	}
	// status : 200, XML Á¤»óÀûÀ¸·Î parsingµÇ°í, domÀ¸·Î ±¸¼ºµÈ »óÅÂ.
	if(xmldoc.documentElement.nodeName == 'error'){
		var msg_n = xmldoc.documentElement.getElementsByTagName("msg").item(0);
		var reason_n = xmldoc.documentElement.getElementsByTagName("reason").item(0);
		//var exception_n = xmldoc.documentElement.getElementsByTagName("exception").item(0);
		if(msg_n != null && msg_n.firstChild != null && reason_n != null && reason_n.firstChild != null){
			errorH.err("Error:"+msg_n.firstChild.nodeValue+"\r\n\r\n Reason:"+reason_n.firstChild.nodeValue);
			return;
		}
	}
	if(xmldoc.documentElement.nodeName == 'script'){
		eval(xmldoc.documentElement.firstChild.nodeValue);
		return;
	}
	if(_asyncCallback != null && _asyncCallback != 'undefined'){
		_asyncCallback(xmlhttp);
		return;
	}
}

// static
function xmlCall(_url, _data, _asyncCallback, _user_errHandle){
	function xmlCall_processReqChange(){
		_after_xmlCall(xmlhttp, _url, _asyncCallback, errorH);
	}

	var xmlhttp = getXMLHTTP();
	var errorH = new err_Handler(_user_errHandle, xmlhttp);
	if(xmlhttp == null) {
		alert('This Browser can not find XMLHTTP object.');
		return;
	}

	// set Event Listener
	xmlhttp.onreadystatechange = xmlCall_processReqChange;
	if(!isIE) {
		xmlhttp.onload = xmlCall_processReqChange;
		xmlhttp.onerror = function(){
			errorH.err(" Server connect error. Please try it again later.");
			return;
		};
	}
	try{
		xmlhttp.open("POST", _url, (_asyncCallback != null) );
	}catch (e) {
		errorH.err(e.message+"(xmlhttp.open)");
		return;
	}
	try{
		xmlhttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
		xmlhttp.send(_data);
		if(_asyncCallback == null || _asyncCallback == 'undefined'){
			if(errorH.err_check) return null;
			else return xmlhttp;
		}
	}catch (e) {
		errorH.err(e.message+"\r\n Error is occured during connecting with Server. Please try it again later.");
	}
}