//*************************************
//Author:	Canca Torvals
//V1.0:  	2008.2.18
//V1.2:		2008.4.11
//V1.3:		2008.4.12
//Version:	1.3
//***************
//*************************************
var sync = false;							//is sync?
var isShowLoad = true;						//show the loading message?
var loadingMessage = "<b>Loading...</b>";	//loading message.
/***********************encodeing..*************************/
function UrlEncode(str) {
	/*var s0, i, s, u;
	s0 = "";           // encoded 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 += "+";
		} else {									// SP should be converted to "+"
			if (u == 42 || u == 45 || u == 46 || u == 95 || ((u >= 48) && (u <= 57)) || ((u >= 65) && (u <= 90)) || ((u >= 97) && (u <= 122))) {   // check for escape
				s0 = s0 + s;  				     // don't escape
			} else {               				 // escape
				if ((u >= 0) && (u <= 127)) {  // single byte format
					s = "0" + u.toString(16);
					s0 += "%" + s.substr(s.length - 2);
				} else {
					if (u > 2097151) {   		// quaternary byte format (extended)
						s0 += "%" + (oxf0 + ((u & 1835008) >> 18)).toString(16);
						s0 += "%" + (128 + ((u & 258048) >> 12)).toString(16);
						s0 += "%" + (128 + ((u & 4032) >> 6)).toString(16);
						s0 += "%" + (128 + (u & 63)).toString(16);
					} else {
						if (u > 2047) {     		// triple byte format
							s0 += "%" + (224 + ((u & 61440) >> 12)).toString(16);
							s0 += "%" + (128 + ((u & 4032) >> 6)).toString(16);
							s0 += "%" + (128 + (u & 63)).toString(16);
						} else {               // double byte format
							s0 += "%" + (192 + ((u & 1984) >> 6)).toString(16);
							s0 += "%" + (128 + (u & 63)).toString(16);
						}
					}
				}
			}
		}
	}
	return s0;*/
	
	var newStr = encodeURIComponent(str);
	newStr = encodeURIComponent(newStr);
	return newStr;
}

function UrlDecode(str) {
	var newStr = decodeURIComponent(str);
	newStr = decodeURIComponent(newStr);
	return newStr;
}

/***********************************************************/
var xmlHttp;
function createXMLHttpRequest() {
	if (window.ActiveXObject) {
		xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
	} else {
		if (window.XMLHttpRequest) {
			xmlHttp = new XMLHttpRequest();
		}
	}
}
function getXMLHttpRequest() {
	if (window.ActiveXObject) {
		return new ActiveXObject("Microsoft.XMLHTTP");
	} else {
		if (window.XMLHttpRequest) {
			return new XMLHttpRequest();
		}
	}
}
/*
 * Url:Request's URL can't have query param.ps:servlet/studentFactory   http://abc.jsp
 * queryString:query string��example:name=canca&password=123456
 * sendString:send message.
 * function200:200 state execute function.
 * function404:404 state execute function.
 * function500:500 state execute function.
 * isEncoding:param must encoding?
 * objArray:ajax response dealing's element ID,Name or object (array��
 * */
function doRequestUsingGET(url, queryString, sendString, function200, function404, function500, isEncoding, objArray) {
	var xmlHttpRequest = null;
	//sync..
	if (sync) {
		createXMLHttpRequest();
	} else {	//not sync..
		xmlHttpRequest = getXMLHttpRequest();
	}
	if (isShowLoad) {
		isShowWaitInfo(true);
	}
	var query = url;
	query += "?math=" + new Date().getTime();
	if (queryString != null) {
		if (isEncoding != null && typeof (isEncoding) != "undefined" && isEncoding == true) {
			query += "&" + splitUrlEncode(queryString);
		} else {
			query += "&" + queryString;
		}
	}
  
  	//not sync..
	if (!sync) {
		var callBackFunction = function () {
			if(typeof(handleStateChange) != 'undefined'){
				handleStateChange(xmlHttpRequest, function200, function404, function500, objArray);
			}
		};
		xmlHttpRequest.onreadystatechange = callBackFunction;
		xmlHttpRequest.open("GET", query, true);
		xmlHttpRequest.send(sendString);
	} else {	//sync..
		var callBackFunction = function () {
			if(typeof(handleStateChange) != 'undefined'){
				handleStateChange(null, function200, function404, function500, objArray);
			}
		};
		xmlHttp.onreadystatechange = callBackFunction;
		xmlHttp.open("GET", query, true);
		xmlHttp.send(sendString);
	}
}
/*
 * Url:Request's URL can't have query param.ps:servlet/studentFactory   http://abc.jsp
 * queryString:query string��example:name=canca&password=123456
 * sendString:send message.
 * function200:200 state execute function.
 * function404:404 state execute function.
 * function500:500 state execute function.
 * isEncoding:param must encoding?
 * objArray:ajax response dealing's element ID,Name or object (array��
 * */
function doRequestUsingPOST(url, queryString, function200, function404, function500, isEncoding, objArray) {
	var xmlHttpRequest = null;
	//sync..
	if (sync) {
		createXMLHttpRequest();
	} else {	//not sync..
		xmlHttpRequest = getXMLHttpRequest();
	}
	if (isShowLoad) {
		isShowWaitInfo(true);
	}
	var query = url + "?math=" + new Date().getTime();
	var newQueryString;
	if (queryString != null) {
		if (isEncoding != null && typeof (isEncoding) != "undefined" && isEncoding == true) {
			newQueryString += splitUrlEncode(queryString);
		} else {
			newQueryString = queryString;
		}
	}
	   
    //not sync..
	if (!sync) {
		var callBackFunction = function () {
			if(typeof(handleStateChange) != 'undefined'){
				handleStateChange(xmlHttpRequest, function200, function404, function500, objArray);
			}
		};
		xmlHttpRequest.onreadystatechange = callBackFunction;
		xmlHttpRequest.open("POST", query, true);
		xmlHttpRequest.onreadystatechange = callBackFunction;
		xmlHttpRequest.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
		xmlHttpRequest.send(newQueryString);
	} else {	//sync..
		var callBackFunction = function () {
			if(typeof(handleStateChange) != 'undefined'){
				handleStateChange(null, function200, function404, function500, objArray);
			}
		};
		xmlHttp.onreadystatechange = callBackFunction;
		xmlHttp.open("POST", query, true);
		xmlHttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
		xmlHttp.send(newQueryString);
	}
}
/*
 * Url:Request's URL can't have query param.ps:servlet/studentFactory   http://abc.jsp
 * queryString:query string��example:name=canca&password=123456
 * sendString:send message.
 * function200:200 state execute function.
 * function404:404 state execute function.
 * function500:500 state execute function.
 * isEncoding:param must encoding?
 * objArray:ajax response dealing's element ID,Name or object (array��
 * */
function submitForm(formObj, function200, function404, function500, objArray) {
	var form = getElementObject(formObj);
	if (form != null && typeof (form) != "undefined") {
		var elems = form.elements;
		var queryString = "";
		for (var i = 0; i < elems.length; i++) {
			if (elems[i].name != null && elems[i].name != "") {
				queryString += elems[i].name + "=" + UrlEncode(elems[i].value.trim());
				if (i != elems.length - 1 && elems[i + 1].name != null && elems[i + 1].name != "") {
					queryString += "&";
				}
			}
		}
		queryString = (queryString == "") ? null : queryString;
		var url = form.action;
		var method = form.method;
		if (method == "get") {
			doRequestUsingGET(url, queryString, null, function200, function404, function500, false, objArray);
			return false;
		} else {
			doRequestUsingPOST(url, queryString, function200, function404, function500, false, objArray);
			return false;
		}
	} else {
		alert("\u83b7\u53d6FORM\u5bf9\u8c61\u5931\u8d25.");
		return false;
	}
}
/**
 * get element object.
 * tagEvent:element/ID or object are ok.
 */
function getElementObject(tagEvent) {
	var eventObj = null;
	if (tagEvent != null && typeof (tagEvent) != "undefined") {
		if (typeof (tagEvent) == "object") {
			return tagEvent;
		} else {
			if (typeof (tagEvent) == "string") {
				eventObj = document.getElementById(tagEvent);
				if (eventObj == null || typeof (eventObj) == "undefined") {
					eventObj = document.getElementsByName(tagEvent)[0];
				}
				return (eventObj == null || typeof (eventObj) == "undefined") ? tagEvent : eventObj;
			} else {
				return tagEvent;
			}
		}
	}
}
function handleStateChange(xmlHttpRequest, function200, function404, function500, objArray) {
/*	var newObjArray = new Array();
	if (typeof (objArray) == "object") {
		if (objArray.length) {
			for (var i = 0; i < objArray.length; i++) {
				var eventObj = getElementObject(objArray[i]);
				newObjArray[i] = eventObj;
			}
		} else {
			newObjArray = eventObj;
		}
	} else {
		newObjArray = objArray;
	}*/
	
	//not sync.
	if (xmlHttpRequest != null) {
		if (xmlHttpRequest.readyState == 4) {
			if (xmlHttpRequest.status == 200) {
				if (function200 != null) {
					function200(xmlHttpRequest.responseText, xmlHttpRequest.responseXML, objArray);
				}
			} else {
				if (xmlHttpRequest.status == 404) {
					if (function404 != null) {
						function404(xmlHttpRequest.responseText, xmlHttpRequest.responseXML, objArray);
					} else {
						alert("page not found!! Error Number:404");
					}
				} else {
					if (xmlHttpRequest.status == 500) {
						if (function500 != null) {
							function500(xmlHttpRequest.responseText, xmlHttpRequest.responseXML, objArray);
						} else {
							alert("page had error!! Error Number:500");
						}
					}
				}
			}
			isShowWaitInfo(false);
		}
	} else {	//sync.
		if (xmlHttp.readyState == 4) {
			if (xmlHttp.status == 200) {
				if (function200 != null) {
					function200(xmlHttp.responseText, xmlHttp.responseXML, objArray);
				}
			} else {
				if (xmlHttp.status == 404) {
					if (function404 != null) {
						function404(xmlHttp.responseText, xmlHttp.responseXML, objArray);
					} else {
						alert("page not found!! Error Number:404");
					}
				} else {
					if (xmlHttp.status == 500) {
						if (function500 != null) {
							function500(xmlHttp.responseText, xmlHttp.responseXML, objArray);
						} else {
							alert("page had error!! Error Number:500");
						}
					}
				}
			}
			isShowWaitInfo(false);
		}
	}
}
function isShowWaitInfo(isTrue) {
	var infoId = "ajaxwailtinfo";
	var ajaxInfoObj = document.getElementById(infoId);
	if (isTrue) {
		if (ajaxInfoObj != null) {
			ajaxInfoObj.innerHTML = loadingMessage;
			ajaxInfoObj.style.display = "";
		} else {
			var obj = document.createElement("div");
			obj.style.position = "absolute";
			obj.style.right = "0px";
			obj.style.top = "0px";
			obj.style.backgroundColor = "#EFEBDE";
			obj.setAttribute("id", infoId);
			obj.innerHTML = loadingMessage;
			document.body.appendChild(obj);
		}
	} else {
		if (ajaxInfoObj != null) {
			ajaxInfoObj.style.display = "none";
		}
	}
}

//split encoding.-_-||...
function splitUrlEncode(queryString) {
	var querys = queryString.split("&");
	var newQueryString = "";
	for (var i = 0; i < querys.length; i++) {
		var param = querys[i].split("=");
		newQueryString += param[0] + "=" + UrlEncode(param[1]);
	}
	return newQueryString;
}
String.prototype.trim = function () {
	return this.replace(/(^\s*)|(\s*$)/g, "");
};

