//******************************************************
//***  [ ABX (AB AJAX Framework ]					 ***
//***  - Version 1.5                                 ***
//******************************************************
//***     Copyright by Park,SangSun.                 ***
//******************************************************


///////////////////////////////////////////////////////////////////////////////////////////////////
// X-RPC Section
///////////////////////////////////////////////////////////////////////////////////////////////////
function XRPC(uri) {
	this.init(uri);
}

XRPC.prototype = {
	XmlHttp:null,
	Request:null,
	URI:	null,
	REQID:	null,
	RES_TYP:null,
	
	init: function(uri) {
		try{
			this.URI = uri;
			this.Request = new XCall();
			
			if(window.XMLHttpRequest){
				this.XmlHttp = new XMLHttpRequest();
				
				if(this.XmlHttp.readyState == null){
					this.XmlHttp.readyState = 1;
					this.XmlHttp.addEventListener("load",	function (){
															this.XmlHttp.readyState = 4;
															if (typeof this.XmlHttp.onreadystatechange == "function")
																tmpXmlHtp.onreadystatechange();
														}, false	);
				}
			}else{
				this.XmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
			}
			
			
		}catch (e) {
			alert("Your browser does not support XRPC. Please contact to System Management Team.");
		}
	},
	
	open: function (async) {
		if (this.XmlHttp != null) {
			this.XmlHttp.open("post", this.URI, async);
		} else {
			alert ("need to create xmlhttp object");
		}
	},

	// Event handler.
	setOnReadyStateChange: function (funcnm){
		if(this.XmlHttp) 
			this.XmlHttp.onreadystatechange = funcname; 
		else 
			alert ("need to create xmlhttp object");	
	},

	// Response Success Process.
	statusSuccessHandler: function (rsdata){
		alert(rsdata);
	},
	
	setStatusSuccessHandler: function (funcnm){
		this.statusSuccessHandler = funcnm;
	},

	// Response Fail Process. 
	statusErrorHandler: function (status){
		this.rtnText = this.XmlHttp.responseText;	
	},
	
	setStatusErrorHandler: function (funcnm){
		this.statusErrorHandler = funcnm;
	},

	// Set Request Header.
	setRequestHeader: function (key, val){
		this.XmlHttp.setRequestHeader(key, val);	
	},
		
	putParameter: function (key, val){
		this.Request.put(key, val);
	},

	setRequestID: function (val){
		this.Request.put("ABX_REQUEST_ID", val);
		this.REQID = val;
	},
	
	setCommand: function (val){
		this.Request.put("cmd", val);
	},	

	setResponseType: function(val){
		this.RES_TYP = val;
	},
	// Request invoke.
	send: function (){
		this.XmlHttp.send(this.getRequestBody());
	},

	getRequestBody: function(){
		var param = new Array();

		if(this.RES_TYP==null) this.RES_TYP = 1;
		param.push(encodeURIComponent("svc") + "=" + encodeURIComponent(this.RES_TYP));

		if(this.Request.size()>0){
			var keys = this.Request.keyset();
			for(var i=0;i<keys.length;i++){ 
				var v = this.Request.get(keys[i]);
				for(var k=0;k<v.length;k++){
					param.push(encodeURIComponent(keys[i]) + "=" + encodeURIComponent(v[k]));
				}
			}
		}

		return param.join("&");
	},

	// Stop current request session.
	abort: function (){ 
		this.XmlHttp.abort(); 
	},
	
	transTXT: function (txt){
		ABX_CALLBACK(this.REQID, txt);
	},

	transXML: function (xml){
		var rtn = new XData();
	
		if(xml!=null){
	
			this.REQID = xml.getElementsByTagName("REQUEST")[0].childNodes[0].firstChild.nodeValue;
			
			var TBL = xml.getElementsByTagName("TABLESET")[0].childNodes;
	
			if(TBL!=null){
				for(var i=0;i<TBL.length;i++){
					var key = TBL[i].getAttribute("NAME");
					var val = this.BindTable(TBL[i]);
					rtn.put(key, val);
				}
			}
		}
		ABX_CALLBACK(this.REQID, rtn);
	},

	BindTable: function (xml){
		var row = xml.childNodes;
		var rtn = new XList();
	
		for(var i=0;i<row.length;i++){
			rtn.put(this.BindRow(row[i]));
		}
		return rtn;
	},
	
	BindRow: function (xml){
		var col = xml.childNodes;
		var rtn = new XData();
		
		for(var i=0;i<col.length;i++){
			var key = col[i].nodeName;
			var val = col[i].firstChild.nodeValue;
			rtn.put(key, val);
		}
		return rtn;
	}
	
}
///////////////////////////////////////////////////////////////////////////////////////////////////




///////////////////////////////////////////////////////////////////////////////////////////////////
// X-CALL Section
///////////////////////////////////////////////////////////////////////////////////////////////////
function XCall() {
	this.init();
}

XCall.prototype = {
	
	Data:null,

	init: function (){this.Data = new Array();},
	
	size: function (){return this.Data.length;},

	keysize: function (key){return this.get(key).length},
	
	keyset: function (){
		var tmp = new Array();
		
		for(var i=0;i<this.Data.length;i++){
			tmp[i] = this.Data[i][0];
		}
		return tmp;
	},
		
	isEmpty: function (){return (this.size()==0)?true:false;},

	isContainsKey: function (key){
		for(var i=0;i<this.size();i++) if(this.Data[i][0] == key) return true;
		return false;
	},
	
	get: function (key, idx){
		if(this.isContainsKey(key)){
			for(var i=0;i<this.size();i++) {
				if(this.Data[i][0] == key) {
					var tmp = this.Data[i][1];
					if(idx == undefined){
						return tmp;
					}else{
						return tmp[idx];
					}
					
				}
			}
		}else{
			return null;
		}
	},
	
	put: function (key, val){
		if(this.isContainsKey(key)){
			for(var i=0;i<this.size();i++) {
				if(this.Data[i][0] == key) {
					var tmp = this.Data[i][1];
					tmp[tmp.length] = val;
					this.Data[i][1] = tmp;
				}
			}
		}else{
			var vll = new Array(val);
			var tmp = new Array(key, vll);
			this.Data[this.size()] = tmp;
		}
	}
	

}
///////////////////////////////////////////////////////////////////////////////////////////////////



///////////////////////////////////////////////////////////////////////////////////////////////////
// X-LIST Section
///////////////////////////////////////////////////////////////////////////////////////////////////
function XList() {
	this.init();
}

XList.prototype = {

	Data:null,
	
	init: function (){this.Data = new Array();},
	
	size: function (){return this.Data.length},

	isEmpty: function (){return (this.size()==0)?true:false;},

	get: function (idx){ return this.Data[idx]; },

	put: function (val){ this.Data[this.size()] = val; },

	set: function (idx, val){ this.Data[idx] = val; }
}	
///////////////////////////////////////////////////////////////////////////////////////////////////



///////////////////////////////////////////////////////////////////////////////////////////////////
// X-DATA Section
///////////////////////////////////////////////////////////////////////////////////////////////////
function XData() {
	this.init();
}

XData.prototype = {

	Data:null,
	
	init: function() {
		this.Data = new Array();
	},
	
	size: function (){
		return this.Data.length;
	},

	isEmpty: function (){
		return (this.size()==0)?true:false;
	},

	get: function (key){
		for(var i=0;i<this.size();i++)
			if(this.Data[i][0] == key) return this.Data[i][1];
		return null;
	},

	put: function (key, val){
		this.Data[this.size()] = new Array(key, val);
	},

	set: function (key, val){
		for(var i=0;i<this.size();i++){
			if(this.Data[i][0] == key) this.Data[i] = val;
			break;
		}
		this.put(key,val);
	},

	keyset: function (){
		var KeySet = new Array();
		
		
		for(var i=0;i<this.size();i++){
			KeySet[i] = this.Data[i][0];
		}
		return KeySet;
	},

	setCommand: function (val){
		this.set("cmd", val);
	},

	setService: function (val){
		this.set("svc", val);
	},

	setRequestID: function (val){
		this.set("ABX_REQUEST_ID", val);
	}
}
///////////////////////////////////////////////////////////////////////////////////////////////////


///////////////////////////////////////////////////////////////////////////////////////////////////
// X-Util Section
///////////////////////////////////////////////////////////////////////////////////////////////////
function CreateX(requri, async){
	var x = new XRPC(requri);
	
	x.open(async);
		
	x.XmlHttp.onreadystatechange = function (){
		if (x.XmlHttp.readyState == 4) {
			if (x.XmlHttp.status == 200) {
				var cnt_type = x.XmlHttp.getResponseHeader("Content-Type");
				//alert(cnt_type);
				if(cnt_type.indexOf('text/xml') != (-1)){
					x.transXML(x.XmlHttp.responseXML);
				}else if(cnt_type.indexOf('text/html') != (-1)){
					x.transTXT(x.XmlHttp.responseText);
				}
			} else {
				this.statusErrorHandler();
				alert('Error while loading!');
			}
		}
	}
	x.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=euc-kr');
	return x;
}

function ABX_CALLBACK(reqid, data){}

