// Author:kenit
// ver 0.009
// last modified:ajax,add parameter,method of httprequest.
//				 
function $(id){
	return document.getElementById(id);
}
function deleteAllChild(obj){ //delete all children of obj
	if(obj && obj.hasChildNodes){
		var tmp=obj.childNodes.length;
		for(var i=0;i<tmp;i++)
			obj.removeChild(obj.childNodes.item(0));
	}
}
var ajax=function(){
	this.pool=new Array();
	this.getIdelthread=function(){
		for(var i=0;i<this.pool.length;i++){
			if(this.pool[i].http_request.readyState==4 && this.pool[i].http_request.status == 200)
				return i;
		}
		var newrepuest=new ajax_request();
		this.pool.push(newrepuest);
		return this.pool.length-1;
	};
	return{
		queue:{
			paraqueue:new Array(),
			xhr:null,
			t:null,
			push:function(para){
				this.paraqueue.push(para);
				if(this.t) clearInterval(this.t);
				this.t=setInterval('window.ajax.queue.dequeue()',100);
			},
			dequeue:function(){
				if(this.paraqueue.length>0){
					if( this.xhr==null || (this.xhr.http_request.readyState==4 && this.xhr.http_request.status == 200) || this.xhr.http_request.readyState==0){
						var para=this.paraqueue.shift();
						this.xhr=ajax.request(para.method,para.url,para.callback,para.sync,para.xml);
					}
				}else{
					if(this.t) clearInterval(this.t);
				}
			}
			
		},
		request:function(_method,_url,_callback,_sync,_xml,_para,timeout,onError){

			var index=getIdelthread();
			pool[index].method=_method;
			pool[index].url=_url;
			pool[index].callback=_callback;
			pool[index].sync=_sync;
			pool[index].xml=_xml;
			pool[index].para=_para;
			pool[index].submit();
			if(typeof(timeout)!='undefined' && typeof(onError)=='function' && parseInt(timeout,10)!=NaN){
				pool[index].onError=onError;
				setTimeout('window.ajax.checktimeout('+index+')',parseInt(timeout,10));
			}else{ //default handler,in order to prevent resource being leaked.
				pool[index].onError=new Function;
				setTimeout('window.ajax.checktimeout('+index+')',30000);			
			}
			return pool[index];
		},
		checktimeout:function(index){
			if(pool[index].http_request.readyState!=4 || pool[index].http_request.status != 200){
				pool[index].http_request.abort();
				pool[index].onError();
			}
		}
	}
}();
function ajax_request(_method,_url,_callback,_sync,_xml,_para){
	this.method=_method&&_method.toUpperCase();
	this.url=_url;
	this.callback=_callback;
	this.sync=_sync;
	this.xml=_xml;
	this.para=(typeof(_para)=='undefined' ? null : _para);
	this.newhttprequest=function (){
		return window.ActiveXObject ? new ActiveXObject("Microsoft.XMLHTTP") : new XMLHttpRequest();
	}
	var parent=this;
	this.http_request = this.newhttprequest();
	this.submit=function(){
		this.http_request.abort();		
		this.http_request.onreadystatechange = function(){
			if (parent.http_request.readyState == 4) {
				if (parent.http_request.status == 200) {
					if(parent.xml)
						parent.response = parent.http_request.responseXML;
					else
						parent.response = parent.http_request.responseText;
					if((typeof(parent.callback)).toUpperCase()=='FUNCTION')
						parent.callback(parent.response);
				}
			}
		};
		this.http_request.open(this.method, this.url, this.sync);
		if (this.http_request.overrideMimeType && this.xml) {
			this.http_request.overrideMimeType('text/xml');
		}		
		if(this.method=='POST'){
			this.http_request.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
			this.http_request.setRequestHeader("Content-length", this.para.length);
		}		
		this.http_request.send(this.para);
	}
}
function option_gen(value,innertext,slted){
	var option = document.createElement('option');
	option.setAttribute('value',value);
	option.innerHTML=innertext;
	if(slted)
		option.selected=true;
	return option;
}

function form_value_maker(form,dataname,value){ //build a hidden type form element with specified value and append it to the given form obj.
	var input=document.createElement('input');
	input.setAttribute('type','hidden');
	input.setAttribute('name',dataname);
	input.setAttribute('value',value);
	form.appendChild(input);
}

function Obj2Source(obj,fun){ //recommend to use native or plug-in JSON obj.
	 if(obj==null) return 'null';
	 if(obj.toGMTString) return '(new Date('+obj.valueOf()+'))'; //Date object
	 switch (typeof(obj)){
		case 'string':
		    var tmp=obj;
		    tmp=obj.replace(String.fromCharCode(10),'');
		    tmp=tmp.replace(/"/g,"'");
			return '"'+tmp+'"';
			break;
		case 'object':
			var source='';
			for(var i in obj){
				if(obj.concat)
					source+=','+Obj2Source(obj[i],fun);
				else
					source+=',"'+i+'":'+Obj2Source(obj[i],fun);
			}
			if(obj.concat)
				return '['+source.slice(1)+']'; //array
			else
				return '{'+source.slice(1)+'}'; //object
			break;
		case 'function':
			if(fun)
				return obj;
			else return '';
			break;
		default:
			return obj;
	 }
}

function tdmaker(innerdata,tr,css){
	var tmp=document.createElement('td');
	if(typeof(innerdata)=='string' || typeof(innerdata)=='number')
		tmp.innerHTML=innerdata;
	else tmp.appendChild(innerdata);
	if(css) tmp.className=css;
	tr.appendChild(tmp);
	return tmp;
}

function isFF(){
	// var obj={a:'a',b:'b'};
	// if(obj.toSource)
		// return true;
	// else return false;
	return Boolean(window.MessageEvent);
}

function addCSS(obj,classname){
	if(typeof(obj)!='undefined' && classname!=''){
		obj.className+=' '+classname;
	}
}
function removeCSS(obj,classname){
	if(typeof(obj)!='undefined' && classname!=''){
		var patt=new RegExp(classname,'g');
		if(obj.className.search(patt) > -1)
			obj.className=obj.className.replace(patt,'');
	}
}
function xmlstrtoDOM(txt){
	try{
		xmlDoc=new ActiveXObject("Microsoft.XMLDOM");
		xmlDoc.async="false";
		xmlDoc.loadXML(txt);
	}
	catch(e){
		parser=new DOMParser();
		xmlDoc=parser.parseFromString(txt,"text/xml");
	}
	return xmlDoc;
}
function xmltodom(xslt,xml){
	if(typeof(XSLTProcessor)!='undefined'){ //FF
		var processor = new XSLTProcessor();
		processor.importStylesheet(xslt);
		var fragment = processor.transformToFragment(xml,document);
		var div=document.createElement('div');
		div.appendChild(fragment);
		return div.innerHTML;
	}else if(typeof(xml.transformNode)!='undefined'){ //IE
		return xml.transformNode(xslt);
	}else
		return false;	//unknown browser
}
function htmlspecialchars(str){
	str=str.replace(/&/g,'&amp;');
	str=str.replace(/</g,'&lt;');
	str=str.replace(/>/g,'&gt;');
	str=str.replace(/"/g,'&quot;');
	str=str.replace(/'/g,'&#039;');
	return str;
}
function htmlspecialchars_decode(str){
	str=str.replace(/&amp;/g,'&');
	str=str.replace(/&lt;/g,'<');
	str=str.replace(/&gt;/g,'>');
	str=str.replace(/&quot;/g,'"');
	str=str.replace(/&#039;/g,"'");
	return str;
}
function date2Str(format,timestamp){
	if(!timestamp)
		var time=new Date();
	else 
		var time=new Date(timestamp);
		
	var j=String(time.getDate());
	var d=( j.length < 2 ? '0'+ j : j);
	var n=String(time.getMonth()+1);
	var m=( n.length < 2 ? '0'+ n : n);
	var Y=String(time.getFullYear())
	
	format=format.replace(/d/g,d);
	format=format.replace(/j/g,j);
	format=format.replace(/n/g,n);
	format=format.replace(/m/g,m);
	format=format.replace(/Y/g,Y);
	
	return format;
}
function setobjvisible(obj){
	if(typeof(obj)=='undefined' || obj.nodeType!=1) return false;
	var property='';
	switch(obj.nodeName.toUpperCase()){
		case 'TD':
			property='table-cell';
			break;
		case 'TR':
			property='table-row';
			break;
		case 'TABLE':
			property='table';
			break;
		default:
			property='block';
			break;
	}
	try{
		obj.style.display=property;
	}catch(e){
		obj.style.display='block';
	}
}
function number_format(number,decimals){
	
	if(typeof(decimals)=='undefined') decimals=0;
	number=parseFloat(number,10);
	number=number*Math.pow(10,decimals);
	number=Math.round(number);
	number=number/Math.pow(10,decimals);

	
	if(number<1)
		return  String(number);
	else{
		var firstpart=String(1000+number % 1000);
		if(firstpart.search(/\./)>-1)
			var str=''+firstpart.substring(1,firstpart.search(/\./)+3);
		else
			var str=''+firstpart.substring(1);
		while(number>=1000){
				number=parseInt(number / 1000,10);
				str=String(1000+number % 1000).substring(1)+","+str;
		}
		if(str.search(/[^0]/)>-1)
			str=str.substring(str.search(/[^0]/));
		else
			str='0';
		return str;
	}
}

