
Xc = {
http : {
	tid : 0,
	hdr : {
		obj : {},
		has : false,
		init : function(l,val){
			var o = this.obj;
			if(o.hasOwnProperty(l)){
				o[l]=val+","+o[l];
			}else{
				o[l]=val;
			}
			this.has = true;
		},

		set : function(x){
			var o = this.obj;
			for( var p in o ){
				var e=o[p];
				if( "string"==typeof(e) ){
					x.xhr.setRequestHeader(p,e);
				}
			}
			o={};
			this.has = false;
		}

	},
	has : false,
	pid : ['MSXML2.XMLHTTP.5.0','MSXML2.XMLHTTP.4.0','MSXML2.XMLHTTP.3.0','MSXML2.XMLHTTP','Microsoft.XMLHTTP'],
	create : function(){
		var o,h;
		try{
			h=new XMLHttpRequest();
			o={ xhr:h, tid:this.tid };
		}catch(e){
			var xp = Xc.http;
			var len = xp.pid.length;
			for( var i=0; i<len; i++ ){
				try{
					var id=xp.pid[i];
					h=new ActiveXObject(id);
					if(h){
						o={ xhr:h, tid:this.tid };
						break;
					}
				}catch(e){

				}
			}
		}finally{
			return o;
		}
	},

	get : function(){
		var o;
		try{
			o = this.create();
			if( o ) this.tid++;
		}catch(e){

		}finally{
			return o;
		}
	},

	asyncReq : function( m, u, c, d){
		// m -> method
		// u -> URI
		// c -> call back function
		// d -> data
		var xp = Xc;
		var o = this.get();
		if( !o ){
			return null;
		}else{
			var f = xp.form;
			if( f.isSubmit ){
				if( m=='GET' ){
					u += "?"+f.data;
				}else
				if( m=='POST' ){
					d = f.data;
				}
				f.isSubmit='';
				f.isSubmit=false;
			}
			
			var x = o.xhr;
			x.open(m,u,true);
			xp.http.wait(o,c);
			if( d ){
				x.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
			}
			var h = xp.http.hdr;
			if( h.has ){
				h.set(o);
			}
			if( d ){
				x.send(d);
			}else{
				x.send(null);
			}
		}
	},

	wait : function(o,c){
		// o -> Xhr object
		// c -> callback
		var xp = Xc;
		try{
			var p = xp.poll;
			var w = window;
			p.ids[o.tid] = w.setInterval( function(){

											if(o.xhr&&o.xhr.readyState==4){
												w.clearInterval(p.ids[o.tid]);
												p.ids.splice(o.tid);
												xp.http.tsRes(o,c);
											}
										},p.interval);
		}catch(e){

		}
	},

	tsRes : function(o,c){
		if( !c ){
			this.release(o);
			return;
		}
		var s;
		var ret;
		var xp = Xc;
		try{
			s = o.xhr.status;
		}catch(e){
			s = 13030;
		}
		if( s==200 ){
			ret = xp.resObj.create(o,c.arg);
			if( c.s ){
				c.s(ret);
			}
		}else{
			switch(s){
			case 12002:
			case 12029:
			case 12030:
			case 12152:
			case 13030:
				ret = xp.excObj.create(o,c.arg);
				break;
			default:
				ret = xp.resObj.create(o,c.arg);
				break;
			}
			if( c.f ){
				c.f(ret);
			}
		}
		this.release(o);
	},

	abort : function(o){
		if( isCallProg(o) ){
			var w = window;
			var p = Xc.poll;
			w.clearInterval(p.ids[o.tid]);
			p.ids.splice(o.tid);
			o.xhr.abort();
			this.release(o);
			return true;
		}else{
			return false;
		}
	},

	isCallProg : function(o){
		var x = o.xhr;
		if( x ){
			var st = x.readyState;
			return st!=4&&st!=0;
		}else{
			return false;
		}
	},

	release : function(o){
		o.xhr=null;
		o=null;
	}
	
},
poll : {
	ids : [],
	interval : 50,
	setInterval : function(t){
		if( (typeof(t)=='number')&&isFinite(t) ){
			var poll = this.poll;
			poll.interval=t;
		}
	}
},
form : {
	isSubmit : false,
	data : null,
	set : function(n){
		this.data = '';
		var d = document;
		var f = d.forms[n];
		var elems = f.elements;
		var $N,$E,$V,$D;
		var len = elems.length;
		for( var i=0; i<len; i++ ){
			$E = elems[i];
			$D = $E.disabled;
			$N = $E.name;
			$V = $E.value;
			if( !$D ){
				var euc = encodeURIComponent;
				switch( $E.type ){
					case 'select-one':
					case 'select-multiple':
						var opts = $E.options;
						for( var j=0; j<opts.length; j++ ){
							var opt = opts[j];
							if(opt.selected){
								this.data+=euc($N)+'='+euc(opt.value||opt.text)+'&';
							}
						}
						break;
					case 'radio':
					case 'checkbox':
						if( $E.checked ){
							this.data += euc($N)+'='+euc($V)+'&';
						}
						break;
					case undefined:
						break;
					default:
						this.data += euc($N)+'='+euc($V)+'&';
						break;
				}
				
			}

		}
		this.isSubmit = true;
		this.data     = this.data.substr(0,this.data.length-1);
	}
},
resObj : {
	create : function(o,c){
		var ret = {};
		var hdr = {};
		try{
			var x = o.xhr;
			var s=x.getAllResponseHeaders();
			var a=s.split("\n");
			var len = a.length;
			for(var i=0; i<len; i++ ){
				var e = a[i]
				var dpos = e.indexOf(':');
				if( dpos != -1 ){
					hdr[e.substring(0,dpos)]=e.substring(dpos+1);
				}
			}
			ret.tid     = o.tid;
			ret.st      = x.status;
			ret.stTxt   = x.statusText;
			ret.hdr     = hdr;
			ret.allHdrs = s;
			ret.txt     = x.responseText;
			ret.xml     = x.responseXML;

			if( typeof(c) != 'undefined' ){
				ret.arg = c;
			}
		}catch(e){

		}finally{
			return ret;
		}
	}
},
excObj : {
	create:function(o,c){
		var ret   = {};
		ret.tid   = o.tid;
		ret.st    = 0;
		ret.stTxt = 'failure';
		if( c ){
			ret.arg = c;
		}
		return ret;
	}
},
cookie : {
	name:'mu-moGT',
	enabled:function(){
		return window.navigator.cookieEnabled;
	},
	set:function(dp,d){
		if( d=='' || d==null ){
			document.cookie = this.name+'='+escape(dp)+';';
		}else{
			var day = new Date();
			day.setTime(day.getTime()+(d*1000*60*60*24));
			document.cookie = this.name+'='+escape(dp)+';expires='+day.toGMTString();
		}
	},
	get:function(){
		var arr = document.cookie.split(' ');
		var len = arr.length;
		for( var i=0; i<len; i++ ){
			var e = arr[i];
			if( this.name==e.substr(0,this.name.length) ){
				var tmp =e.split('=');
				var t = unescape(tmp[1]);
				if((t.length-1) == t.lastIndexOf(';')){
					t = t.slice(0,t.length-1);
				}
				var c = t.split('&');
				var n = c.length;
				var ret  = new Array();
				var tret = new Array();
				for( var j=0;j<n;j++ ){
					tret = c[j].split('=');
					ret[tret[0]]=tret[1];
				}
				return ret;
			}
		}
		return null;
	}
}
};
