//========================================================
// SYSTEM : GeoServices 跨瀏覽器Ajax用程式庫
// PROGRAM : 以XMLHttpRequest進行資料來回傳輸
// FILE NAME : geoserv_ajaxXXX.js
// CALL FROM : Ajax 客戶端
// AUTHOR : Ivan Wong
// CREATE : 2007.3.2
// UPDATE : v0.50
//========================================================

////
// 判斷可執行的瀏覽器
//
// @sample if(chkAjaxBrowser()){location.href='nonajax.htm')
// @sample oj = new chkAjaxBrowser();if(oj.bw.safari){
//										/* Safari code */
//                                   }
// Enable list 
// WindIE 5.5+
// Konqueror 3.3+
// AppleWebKit系列(Safari,OmniWeb,Shiira) 123+
// Mozilla系列
// (Firefox, Netscape, Galeon,Epiphany,K-Meleon,Sylera) 20011128+
// Opera 8+

function chkAjaBrowser()
{
	var a,ua = navigator.userAgent;
	this.bw= { 
	  safari    : ((a=ua.split('AppleWebKit/')[1])?a.split('.')[0]:0)>=124 ,
	  konqueror : ((a=ua.split('Konqueror/')[1])?a.split(';')[0]:0)>=3.3 ,
	  mozes     : ((a=ua.split('Gecko/')[1])?a.split(' ')[0]:0) >= 20011128 ,
	  opera     : (!!window.opera) && ((typeof XMLHttpRequest)=='function') ,
	  msie      : (!!window.ActiveXObject)?(!!createHttpRequest()):false 
	}
	return (this.bw.safari||this.bw.konqueror||this.bw.mozes||this.bw.opera||this.bw.msie)
}

////
//  建立XMLHttpRequest物件
//
// @sample ob = createHttpRequest()
// @return XMLHttpRequest物件(實體)
//
function createHttpRequest()
{
	if(window.XMLHttpRequest){
		 //Win Mac Linux m1,f1,o8 Mac s1 Linux k3 & Win e7用
		return new XMLHttpRequest() ;
	} else if(window.ActiveXObject){
		 //Win e4,e5,e6用
		try {
			return new ActiveXObject('Msxml2.XMLHTTP') ;
		} catch (e) {
			try {
				return new ActiveXObject('Microsoft.XMLHTTP') ;
			} catch (e2) {
				return null ;
			}
		}
	} else  {
		return null ;
	}
}
	


////
// 收發訊函式
//
// @sample sendRequest(onloaded,'&prog=1','POST','./about2.php',true,true)
// @sample sendRequest({onload:loaded,onbeforsetheader:sethead},'',','POST','./about3.php',true,true)
// @param {string} callback 收到訊息時要執行的函式名(回呼函示)
// @param {object} callback 收到訊息時要執行的函式名與設定表頭的函式名
//   {onload:函式名,onbeforsetheader:函式名}
// @param {array} callback 收到訊息時要執行的函式名與設定表頭的函式名
//  ary["onload"]=函式名;ary["onbeforesetheader"]=函式名
// @param {string} data 要傳送的資料 string 形式:(&名稱1=值1&名稱2:值2...)
// @param {object} data 要傳送的資料 object 形式:(&名稱1=值1&名稱2:值2...)
// @param {array} data 要傳送的資料 array(雜湊陣列)形式:ary["名稱2"]=值2
// @param method "POST" or "GET"
// @param url 要請求之URL
// @param async true:非同步 / false:同步
// @param sload 強制載入 true:強制/省略c或false:預設值
// @param user 認證頁面使用者名稱
// @param password 認證頁面用密碼
//
function sendRequest(callback,data,method,url,async,sload,user,password)
{	
		var oj = createHttpRequest();
		if( oj == null ) return null;

	
		var sload = (!!sendRequest.arguments[5])?sload:false;
		if(sload || method.toUpperCase() == 'GET')url += '?';
		if(sload)url=url+'t='+(new Date()).getTime();

	
	//瀏覽器設定
		var bwoj = new chkAjaBrowser();
		var opera	  = bwoj.bw.opera;
		var safari	  = bwoj.bw.safari;
		var konqueror = bwoj.bw.konqueror;
		var mozes	  = bwoj.bw.mozes ;

	
	//分解callback
	//{onload:xxxx,onbeforsetheader:xxx}
		if(typeof callback=='object'){
			var callback_onload = callback.onload;
			var callback_onbeforsetheader = callback.onbeforsetheader;
		} else {
			var callback_onload = callback;
			var callback_onbeforsetheader = null;
		}

	
	//收訊處理
	// opera會有onreadystatechange重複發生錯誤,改用onload較安全
	// Moz,FireFox在oj.readyState==3也能讀取資料,故採onload也比較安全
	// Win ie 下onload不能跑
	// Knoqueror的onload不太穩
		if(opera || safari || mozes){
			oj.onload = function () { callback_onload(oj); }
		} else {
		
			oj.onreadystatechange =function () 
			{
				if ( oj.readyState == 4 ){
					//alert(oj.status+'--'+oj.getAllResponseHeaders());
					callback_onload(oj);
				}
			}
		}

	
	//URL編碼
		data = uriEncode(data,url);
		if(method.toUpperCase() == 'GET') {
			url += data
		}

	
	//Open方法//
		oj.open(method,url,async,user,password);

	
	//用來自訂請求表頭的回呼函式
	//使用時,請在呼叫端HTML裡定義window物件底下的全域函式setHeaders
	//並在該函式裡設定setRequestHeader()
	//@sample function setHeaders(oj){oj.setRequestHeader('Content-Type',contentTypeUrlenc)}
	//
		if(!!callback_onbeforsetheader)callback_onbeforsetheader(oj);
	
	//設定表頭為application/x-www-form-urlencoded
	setEncHeader(oj);
	
	//debug
	//alert("////geoserv_ajaxxxx.js////\n data:"+data+" \n method:" + 
	//method+" \n url:"+url+" \n asyuc:"+async);
	
	//send方法
	oj.send(data);

	
	function setEncHeader(oj) {
		//將表頭設定為application/x-www-form-urlencoded
		//@see (enctype的預設值是"application/x-www-form-urlencoded")
		//若想要在POST傳送"multipart/form-data"資料時請自行改寫這個函式
		//這個函式在Win Opera8.0無法正常執行,故獨立處理(8.01則ok)
			var contentTypeUrlenc = 'application/x-www-form-urlencoded; charset=UTF-8';
			if(!window.opera){
				oj.setRequestHeader('Content-Type',contentTypeUrlenc);
			} else {
				if((typeof oj.setRequestHeader) == 'function')
					oj.setRequestHeader('Content-Type',contentTypeUrlenc);
			}	
			return oj
	}
	
	//URI編碼
	//引數data可以string或object的形式傳遞
		function uriEncode(data,url){
			var encdata =(url.indexOf('?')==-1)?'?dmy':'';
			if(typeof data=='object'){
				for(var i in data)
					encdata+='&'+encodeURIComponent(i)+'='+encodeURIComponent(data[i]);
		 	}
			else if (typeof data=='string') {
				if(data=="") return "";
			
			//先分解&與=再encode
				var encdata = '';
				var datas = data.split('&');
				for(var i=1;i<datas.length;i++)
				{
					var dataq = datas[i].split('=');
					encdata += '&'+encodeURIComponent(dataq[0])+'='+encodeURIComponent(dataq[1]);
				}
			} 
			return encdata;
		}

		return oj
	}

