/*
 * ajax類
 */

// 定義 XMLHTTP 讀取的各種狀態
var XMLHTTP_READYSTATE_UNLOAD = 0; // send()方法還沒有被調用
var XMLHTTP_READYSTATE_READING = 1; // send()方法已經被調用，請求還是在處理中
var XMLHTTP_READYSTATE_READED = 2; // send()方法已完成，整個應答已接收
var XMLHTTP_READYSTATE_EXCHANING = 3; // 正在解析應答
var XMLHTTP_READYSTATE_FINISHED = 4; // 已解析，準備好進行下一步處理

// 定義 XMLHTTP 服務器返回的狀態
var XMLHTTP_STATUS_OK = 200;	//正常狀態

// 定義其他ajax用的變量
var ajaxUrls = new Array(); // 記錄已經生成ajax對象的url，防止重複點擊。
var ajaxStacks = new Array(0, 0, 0, 0, 0, 0, 0, 0, 0, 0);// ajax 對像時間佔位堆棧。


// AJAX類 @參數：結果類型 1 HTML 2 XML
function ajaxClass(resultType) {

	for(var _stackIndex = 0; _stackIndex < ajaxStacks.length && ajaxStacks[_stackIndex] != 0; _stackIndex++);//note 查詢空閒的時間位
	ajaxStacks[_stackIndex] = 1;// 表示該任務佔位

	var ajax = new Object();

	// 默認為 XML 方式
	ajax._resultType = resultType ? resultType : 'XML';

	ajax._callFunciton = null;	// 回調函數
	ajax._postContent = '';	// post內容
	ajax.ajaxUrl = '';	// ajax的url
	ajax.showArea = null; // 顯示區域
	ajax._stackIndex = 0;
	ajax._stackIndex = _stackIndex;

	
	ajax.setResultType = function(resultType) {
		ajax._resultType = resultType;
	}
	
	// 初始化
	ajax._initiation = function() {
		var q = false;
		 if(window.ActiveXObject) {
			var IExmlhttps = ['Microsoft.XMLHTTP', 'MSXML.XMLHTTP', 'Microsoft.XMLHTTP', 'Msxml2.XMLHTTP.7.0', 'Msxml2.XMLHTTP.6.0', 'Msxml2.XMLHTTP.5.0', 'Msxml2.XMLHTTP.4.0', 'MSXML2.XMLHTTP.3.0', 'MSXML2.XMLHTTP'];
			for(var i=0; i<IExmlhttps.length; i++) {
				try {
					q = new ActiveXObject(IExmlhttps[i]);
					if(q) {						
						return q;
					}
				} catch(e) {
					continue;
				}
			}
		} else if(window.XMLHttpRequest) {
			q = new XMLHttpRequest();
			if(q.overrideMimeType) {
				q.overrideMimeType('text/xml');
			}
		} 
		
		return q;		
	}

	ajax._xmlhttp = ajax._initiation();

	ajax._parseResult = function() {		
		if(ajax._xmlhttp.readyState == XMLHTTP_READYSTATE_FINISHED && ajax._xmlhttp.status == XMLHTTP_STATUS_OK) {
			if(ajaxUrls.length > 0 ) {
				for(k in ajaxUrls) {
					if(ajaxUrls[k] == ajax.ajaxUrl) {
						ajaxUrls[k] = null;
					}
				}
			}
			if(ajax._callFunciton) {
				if(ajax._resultType == 'HTML') {
					ajax._callFunciton(ajax._xmlhttp.responseText, ajax);
				} else if(ajax._resultType == 'XML') {
					//if(ajax._xmlhttp.responseXML.lastChild != null) {
						var result = ajax._xmlhttp.responseXML.lastChild.firstChild.nodeValue != null ? ajax._xmlhttp.responseXML.lastChild.firstChild.nodeValue : ajax._xmlhttp.responseText;
						//result = result != null ? result : '異常錯誤';
						result = execJS(result);						
						ajax._callFunciton(result, ajax);
					//}
				}
			}
			ajaxStacks[ajax._stackIndex] = 0;// 清空標誌位，使其它對像有時間段可以被申請
		}
	}	
	
	ajax.get = function(ajaxUrl, callFunciton) {
		if(in_array(ajaxUrl, ajaxUrls)) {
			return false;
		} else {
			ajaxUrls.push(ajaxUrl);
		}
		ajax.ajaxUrl = ajaxUrl;
		ajax._xmlhttp.onreadystatechange = ajax._parseResult;
		ajax._callFunciton = callFunciton ? callFunciton : null;
		//var delay = attackevasive & 1 ? (ajax._stackIndex + 1) * 1000 : 100;
		var delay = (ajax._stackIndex + 1) * 1000;
		if(window.XMLHttpRequest) {
			setTimeout(function(){
			ajax._xmlhttp.open('GET', ajax.ajaxUrl, true);
			ajax._xmlhttp.send(null);}, delay);
		} else {
			setTimeout(function(){
			ajax._xmlhttp.open("GET", ajax.ajaxUrl, true);
			ajax._xmlhttp.send();}, delay);
		}

	}
	
	ajax.post = function(ajaxUrl, postContent, callFunciton) {
		if(in_array(ajaxUrl, ajaxUrls)) {
			return false;
		} else {
			ajaxUrls.push(ajaxUrl);
		}
		ajax.ajaxUrl = ajaxUrl;
		ajax._postContent = postContent;
		ajax._xmlhttp.onreadystatechange = ajax._parseResult;
		ajax._callFunciton = callFunciton ? callFunciton : null;
		ajax._xmlhttp.open('POST', ajaxUrl);
		ajax._xmlhttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
		ajax._xmlhttp.send(ajax._postContent);
	}
	return ajax;
}

function getOnly(url) {
	var a = new ajaxClass();
	a.get(url);
}

/** 執行ajax返回的javascript腳本
 * @param string ajax返回的內容
 * @return string 剔除js腳本的內容
 */
function execJS(str) {
	
	function get_id() {
		return "script_" + (new Date()).getTime().toString(36)+ Math.floor(Math.random() * 100000000).toString(36);
	}
	
	var temps = [];
	var tempStr = '';
	
	if (str.match(/<\/script>/i)) {
		temps = str.split(/<\/script>/i); // 分割腳本語句
		str = '';	
		
		for (var i = 0; i < temps.length; i++) {
			
			if(temps[i] == null || temps[i] == '') continue;
				    	
			tempStr = temps[i].replace(/<script[\s\S]*$/ig, "");	// 分割後刪除script標籤後的內容
			
			var script = document.createElement("script");
			script.id = get_id();
			script.type =  "text/javascript";
			
			// 獲取script語句的參數   
			var theText,theSrc;
			theText = temps[i].substr(tempStr.length);	// 將非script標籤的內容剔除
			theSrc = theText.substr(0, theText.indexOf('>') + 1); // 獲取script標籤的參數
			theSrc = theSrc.match(/src\s*=\s*(\"([^\"]*)\"|\'([^\']*)\'|([^\s]*)[\s>])/i); // 匹配script的scr參數			
			if (theSrc) {
				if (theSrc[2]) {
					theSrc = theSrc[2];
				} else if (theSrc[3]) {
					theSrc = theSrc[3];
				} else if (theSrc[4]) {
					theSrc = theSrc[4];
				} else {
					theSrc = "";
				}
				theText = "";			   
			} else {
				theSrc = "";
				theText = theText.substr(theText.indexOf('>') + 1); // 獲得script腳本的具體內容
				//script.text =script.text.replace(/^\s*<\!--\s*/g, ""); // 刪除html註釋
				//script.text =script.text.replace(/^\s*-->\s*/g, ""); // 刪除html註釋
			}
			
			// 參數賦值
			if(theSrc) {
				script.scr = theSrc;
			} else {
				script.text = theText;
			}
			
			// 綁定script對像
			try {
				document.getElementsByTagName('head').item(0).appendChild(script);
				var remove_script;
				remove_script = "document.getElementsByTagName('head').item(0)";
				remove_script += ".removeChild(document.getElementById('" + script.id + "'));";
				window.setTimeout(remove_script, i * 10 + 10000);
			}catch(e){};
			str += tempStr;
		}	    
	    
	} 
	return str;
	
}



/** 設置html元素中的內容
 * @param string ajax.php的連接
 * @param string 顯示的元素名稱 （a_ajax 這裡為a）
 * @param string post傳遞的值
 * @param string 載入的時候顯示的文字信息
 */
function setInnerHTML(url, oId, postStr, loading) {
	//var showArea = $(oId + '_ajax');
	
	var a = new ajaxClass();
	
	url += '&showId=' + oId;
	
	a.showArea = exist(oId + '_ajax') ? $(oId + '_ajax') : null;
	
	loading = loading ? loading : 'loading.......';	
	a.showArea.innerHTML = loading;
	
	if(!postStr) {	
		a.get(url, function(s, a){
			a.showArea.innerHTML = s;
			if(exist(oId + '_form')) {
				$(oId + '_form').reset();
			}
		});
	} else {
		a.post(url, postStr, function(s, a){
			a.showArea.innerHTML = s;
			if(exist(oId + '_form')) {
				$(oId + '_form').reset();
			}
		});
	}
}

function getForm(oId) {
	var i, query = '', comma = '';
	var e, eValue; // 元素對像object數組
	var frmObj = $(oId + '_form');
	  
	for(i = 0;i < frmObj.length; i++) {
		e = frmObj[i];// 獲取當前的元素
		//alert(e.name + '=' + e.value);
		if(e.name == null || e.name==""){
			continue;
		} else if(e.type == 'reset' || e.type == 'image') {// ignore this type
			continue;
		} else if((e.type=='checkbox' || e.type=='radio') && e.checked == false) {
			continue;
		}		
		
		query += comma + encodeURIComponent(e.name) + '=' + encodeURIComponent(e.value);		
		comma="&";		
	}
	return query;
}
 

/** 用來顯示ajax消息
 * @param string url值
 * @param object 事件對像
 */
function ajaxMsg(url, e, loading) {
	
	
	loading = loading ? loading : 'loading.......';
	
	pocAlert(loading, e);
	
	var a = new ajaxClass();
	a.get(url, function(s, ajax){
		pocAlert(s);
		
	});
}

var msgw,msgh,bordercolor,titleheight,titlecolor;
msgw = 300; // 提示窗口的寬度
msgh = 100; // 提示窗口的高度
titleheight = 25 // 提示窗口標題高度
bordercolor="#000000"; // 提示窗口的邊框顏色
titlecolor="#c51100"; // 提示窗口的標題顏色

/** pocle增強消息提示框
 * @param string 消息內容
 * @param 點擊後的事件信息
 */
function pocAlert(msg, e){
	
	// 獲取鼠標點擊時的坐標
	if(typeof(e) == 'object') {	
		var x = e.clientX;
		var y = e.clientY;
		
		var offSetLeft = document.documentElement.scrollLeft ? document.documentElement.scrollLeft : document.scrollLeft;
		var offSetTop = document.documentElement.scrollTop ? document.documentElement.scrollTop : document.scrollTop;
		offSetLeft = typeof(offSetLeft) == 'number' ? offSetLeft : 0;
		offSetTop = typeof(offSetTop) == 'number' ? offSetTop : 0;
		if(offSetLeft != 0 || offSetTop != 0) {
			x += offSetLeft;
			y += offSetTop;
			//window.scroll(offSetLeft, offSetTop);
		}	
	
		if(x + msgw > document.body.clientWidth) {
			x = document.body.clientWidth - msgw; 
		}	
	}
	if(!exist('ajaxMsgDiv')) {		
		
	//	var sWidth,sHeight;
	//	sWidth=screen.width;
	//	sHeight=screen.height;
	
		var msgObj = document.createElement("div");
		msgObj.setAttribute("id","ajaxMsgDiv");
		msgObj.setAttribute("align","center");
		msgObj.style.background = "white";
		msgObj.style.border = "1px solid " + bordercolor;
		msgObj.style.position = "absolute";
		msgObj.style.left = x + "px";;
		msgObj.style.top = y + "px";
		msgObj.style.font = "12px/1.6em Verdana, Geneva, Arial, Helvetica, sans-serif";
		//msgObj.style.marginLeft = window.event.clientX+"px";
		//msgObj.style.marginTop = window.event.clienty+"px";
		msgObj.style.width = msgw + "px";
		msgObj.style.height = msgh + "px";
		msgObj.style.textAlign = "center";
		msgObj.style.lineHeight = "25px";
		msgObj.style.zIndex = "30000";
		document.body.appendChild(msgObj);
		
		var title = document.createElement("h4");
		title.setAttribute("id","msgTitle");
		title.setAttribute("align","right");
		title.style.margin = "0";
		title.style.padding = "3px";
		title.style.background = bordercolor;
		title.style.filter = "progid:DXImageTransform.Microsoft.Alpha(startX = 20, startY = 20, finishX = 100, finishY = 100,style = 1,opacity = 75,finishOpacity = 100);";
		title.style.opacity = "0.75";
		title.style.border = "1px solid " + bordercolor;
		title.style.height = "18px";
		title.style.font = "12px Verdana, Geneva, Arial, Helvetica, sans-serif";
		title.style.color = "white";
		title.style.cursor = "pointer";
		title.innerHTML = "×";
		title.onclick = function(){
			//document.body.removeChild(bgObj);
			$("ajaxMsgDiv").removeChild(title);
			document.body.removeChild(msgObj);
		}
		$("ajaxMsgDiv").appendChild(title);
		
		var txt = document.createElement("p");
		txt.style.margin = "1em 0";
		txt.setAttribute("id","ajaxMsgTxt");
		txt.innerHTML = msg;
		$("ajaxMsgDiv").appendChild(txt);
			
	} else {
		
		var msgObj = $("ajaxMsgDiv");
		if(typeof(e) == 'object') {
			msgObj.style.left = x + "px";;
			msgObj.style.top = y + "px";
		}
		$('ajaxMsgTxt').innerHTML = msg;
	}
	
}
