//postget class
// version 1.2.1  2006/12/19
// by wakufactory.jP
// license BSD 

function Postget(url) {
	var resp_text ;
	var resp_array;
	var req ;
	var callback = null ;
	this.err_stat = 0;
	this.err_msg = ""; 

	this.url = url ;
	var _copy = this ;

	this.post = function(vars) {
		this.err_stat = 0;
		this.err_msg = "" ;
		req = undefined ;
		req = _createXMLHttpRequest() ;
		req.onreadystatechange = this._resp ;
		req.open("POST",this.url,true ) ;
		req.setRequestHeader("content-type", "application/x-www-form-urlencoded;charset=UTF-8");
		req.send(_encode_vars(vars)) ;
	}

	this.get = function(vars) {
		this.err_stat = 0;
		this.err_msg = "" ;
		req = undefined ;
		req = _createXMLHttpRequest() ;
		req.onreadystatechange = this._resp ;
		if(vars) req.open("GET",this.url+((this.url.match(/\?/))?'&':'?')+_encode_vars(vars),true ) ;
		else req.open("GET",this.url,true ) ;
		req.send(null) ;
	}
	this.setCallback = function( func ) {
		callback = func ;
	}

	this._resp = function() {
		if (req.readyState == 4) {
			resp_array = null ;
			if (req.status == 200) {
				resp_text = req.responseText ;
				try {
					eval( "resp_array = "+resp_text ) ;
				} catch(err) { 
					_copy.err_stat = -1 ;
					_copy.err_msg = err+"\n"+resp_text ; 
				}
				resp_text = undefined ;
			} else {
				_copy.err_stat = req.status ;
				_copy.err_msg =  req.statusText;
			}
			if(callback) callback.call(_copy,resp_array) ;
			resp_array= undefined ;
		}
	}

	function _encode_vars(vars) {
		var e = new Array()  ;
		var ev ;
		for(v in vars) {
			if(typeof vars[v] == 'object' ) {	//array
				for(vv in vars[v]) {
					ev = encodeURIComponent(vars[v][vv]) ;
					ev = ev.replace(/\+/g,"%2b") ;
					e.push( v+"[]="+ev ) ;	
				}
			}else{
				ev = encodeURIComponent(vars[v]) ;
				ev = ev.replace(/\+/g,"%2b") ;
				e.push( v+"="+ev ) ;	
			}
		}
		return e.join("&") ;
	}

	function _createXMLHttpRequest() {
 	  return this.XMLHttpRequest ?
 	     new XMLHttpRequest() : new ActiveXObject("Microsoft.XMLHTTP");
	}
}

//collect form values
function getFormValues( name) {
	var r={} ;
	function setobj(key,val) {
		if(r[key]) {
			if( typeof r[key] == "object" ) {
				r[key].push(val) ;
			} else r[key] = [ r[key], val ] ;
		} else r[key] = val ;
	}
	var o = document.getElementsByName(name)[0].elements ;
	for(i=0;i<o.length;i++) {
		e = o[i] ;
		switch(e.type){
			case 'text':
			case 'hidden':
				setobj(e.name,e.value) ;
				break;
			case 'textarea':
				setobj(e.name,e.value) ;
				break;
			case 'radio':
				if(e.checked) {
					setobj(e.name,e.value) ;
				}
				break;
			case 'select-one':
				setobj(e.name,e.value) ;
				break;
			case 'checkbox':
				if(e.checked) {
					setobj(e.name,e.value) ;
				}
				break;
		}
	}
  return r;
}

// query dispatch class
function Query(url,msgdiv){
	var _url ;
	var _msgdiv ;

	//constructor 
		_url = url ;
		_msgdiv = msgdiv ;
	
	this.msg = function(m) {
		if(_msgdiv) $I(_msgdiv,m ) ;
	}
	
	this.get = function(method,param,callback,opt) {
		var _o = new Postget(_url) ;
		var _opt = opt ;
		_o.setCallback( function(dat) {
			if(dat) {
				callback(dat,_opt) ;
			} else {
				if(_msgdiv) $I(_msgdiv,_o.err_msg ) ;
			}
			_o = undefined ;
		});
		param['method'] = method ;
		_o.get(param) ;
	}
	,
	this.post = function(method,param,callback,opt) {
		var _o = new Postget(_url) ;
		var _opt = opt ;
		_o.setCallback( function(dat) {
			if(dat) {
				callback(dat,_opt) ;
			} else {
				if(_msgdiv) $I(_msgdiv,_o.err_msg ) ;
			}
			_o = undefined ;
		});
		param['method'] = method ;
		_o.post(param) ;
	}
}

