/*
* @purpose			:a light weight js pack (start from xpWait()...) 
 * @auther			:xp wang(xpw365@gmail.com)
 * @date			:2005-01-19
 * @dateModified		:2007-11-24
 * @licence			:
 * 
 * @note 			:combine with xpAjax.js for xpAjaxsearch..
 * 	likely name conflict : $,$$,$$$ change if you want
 * 	function start with _ (= _xpMask()) are function to class obj without _ (= new xpMask() )
 */
var xpGLOBALS=[];			//! those gloabl vars for 
var xpNoop=function(){};
/* singleton handle for class handle
 * global xpObjects is array to store all class object's handles
 * param pass as 'classname',argv[0],argv[1],...
 * bewared: param string should not quoted by single quote(') !!
 */
var	xpObjects =[];
function xpGetClassObject() //singleton (argv[0]=className, argv[1],argv[2]...
{
	var argv = xpGetClassObject.arguments;
	if(argv.length<1) return xpNoop;
	var className = argv[0];
	if(!xpObjects[className]){
		var args='';
		for(i=1;i<argv.length;i++)
			args += "'"+argv[i]+"',";
		args +=''
		var cmd = "xpObjects["+className+"] = new "+className+"("+args+")";
		eval(cmd);
	}
	return 	xpObjects[className] ;
}


var $ = function(x,el){if(!el) el=document ; return el.getElementById(x);  }; //humen are lazy,if you must know!
var $$ = function(x,el){ if(!el) el = document; return el.getElementsByTagName(x)}; //group of elements
var $$$ = function(n,d){	//return elements by name ;avoid if possible.
	if(!d) d =document.body
	var els =[];
	if(d.name == n ) els.push(d);
	if(d.childNodes.length >0)
		for(var i=0;i<d.childNodes.length;i++)
			els=els.concat($$$(n,d.childNodes[i]))
	return els;	
}
var $class = function(cn,d){	//return elements by  class name; avoid if possible.
	if(!d) d =document.body
	var els=[];
	if(typeof cn == 'function') var regx = cn;
	else eval( 'var regx = new RegExp( /(^|\\s)'+cn+'(\\s|$)/ )');
	if(regx.test(d.className)) els.push(d);
	if(d.childNodes.length >0)
		for(var i=0;i<d.childNodes.length;i++)
			els =els.concat( $class(regx,d.childNodes[i]) );
	return els;	
}


/* window related */
//************ w$ Lib xpWindow ******************************************************************
//{
//do this way for IE	
	//lib name
	function xpWindow()	{}
	
	
	// window co-ord
	xpWindow.findWindowSize = function() {
		var sX =document.documentElement.clientWidth?document.documentElement.clientWidth:document.body.clientWidth;
		//var sY =window.innerHeight?window.innerHeight:document.documentElement.clientHeight;
		var sY =window.innerHeight?window.innerHeight : document.documentElement.clientHeight?document.documentElement.clientHeight:document.body.clientHeight;
		return {x:sX,y:sY};
	}
	xpWindow.ws =function(){ var s= xpWindow.findWindowSize(); return {w:s.x,h:s.y}; }

	xpWindow.findWindowPosition = function(){
		var scrOfX = window.pageXOffset | document.body.scrollLeft | document.documentElement.scrollLeft | window.scrollX;
		var scrOfY = window.pageYOffset | document.body.scrollTop | document.documentElement.scrollTop | window.scrollY;
		return {x:scrOfX , y:scrOfY}
	}
	xpWindow.wp=xpWindow.findWindowPosition;
	
	xpWindow.findWindowCenter=function(){
		var ss =this.findWindowSize();
		var pp =this.findWindowPosition();
		return {x:parseInt(pp.x+ss.x/2),y:parseInt(pp.y+ss.y/2)}
	}	
	xpWindow.wc = xpWindow.findWindowCenter;
	
	
	//element infos
	xpWindow.pr=function(obj) {
		return {x:obj.offsetLeft,y:obj.offsetTop};
	}
	xpWindow.findPositionXY=function(obj) {
		var curleft = 0
		var curtop = 0;
		if (obj.offsetParent) {
			curleft = obj.offsetLeft
			curtop = obj.offsetTop
			while ( (obj = obj.offsetParent) ) {
				curleft += obj.offsetLeft
				curtop += obj.offsetTop
			//	alert(obj.tagName+'='+obj.id+'='+obj.offsetLeft); 
			}
		}
		return {x:curleft,y:curtop};
	}
	xpWindow.p = xpWindow.findPositionXY
	
	xpWindow.findSizeWH=function(e)	{
		return {w:e.offsetWidth,h:e.offsetHeight};
	}
	xpWindow.s = xpWindow.findSizeWH	;
	/* find whole page size: with exception(a array of elements' id) */
	xpWindow.findPageSize=function(exceptions){
		var body = document.body;
		var childs = body.childNodes;
		var s = xpWindow.ws()
		var p = xpWindow.wp()
		var x = p.x+s.w;
		var y = p.y+s.h;
		for(var i=0;i<childs.length;i++){
			if(childs[i].tagName && (childs[i].tagName.toLowerCase()=='div' ||childs[i].tagName.toLowerCase()=='p')){
				if( !(childs[i].id && exceptions && xpWindow.inArray(childs[i].id,exceptions) ) ){
					p = xpWindow.p(childs[i]);
					s = xpWindow.s(childs[i]);
					x= Math.max(x, p.x+s.w)
					y= Math.max(y, p.y+s.h)
				}
			}
		}
		return {w:x,h:y}
	}
	
	xpWindow.findCenterXY=function(e)	{
		
		var xy = xpWindow.findPositionXY(e);
		var wh = xpWindow.findSizeWH(e)
		return {x: (xy.x + parseInt(wh.w/2)) ,y: (xy.y + parseInt(wh.h/2))};
	}
	xpWindow.c = xpWindow.findCenterXY
	//element control
	xpWindow.opacity=function(el,op) {
	//	if(op==100) op=99	//safari some time unable to crunch 100: if setTimeout used
		if(!el) return;
		el.style.opacity = op/100 ;
		el.style.filter = 'progid:DXImageTransform.Microsoft.alpha(opacity=' + parseInt(op) + ')';
	}
    	
	xpWindow.disable=function(element,time) {
		element.readonly = true;
		element.disabled = true;
		if(time) setTimeout(xpWindow.PF(xpWindow.enable,element), time);
		
	}
	xpWindow.enable = function (element, time) {
		element.readonly = false;
		element.disabled = false;
		if(time) setTimeout(xpWindow.PF(xpWindow.disable,element), time);
	}
	
	xpWindow.toggle=function (el) {
		if (el.disabled)	w$.enable(el);
		else	w$.disable(el);
	}	
	xpWindow.toggleDisplay=function (el) {
		if (el.style.display)	el.style.display='';
		else	el.style.display='none'
	}	
	xpWindow.toggleVisibility=function (el) {
		if (el.style.visibility == 'hidden')	el.style.visibility == 'visible';
		else	el.style.visibility == 'hidden'
	}	
	
	xpWindow.show=function(element, time){
		element.style.visibility='visible';
		if(time) setTimeout(xpWindow.PF(xpWindow.hide,element), time);
	}
	xpWindow.hide=function(element,time){
		element.style.visibility='hidden';
		if(time) setTimeout(xpWindow.PF(xpWindow.show,element), time);
	}
	xpWindow.on=function(element, time){
		element.style.display='';
		if(time) setTimeout(xpWindow.PF(xpWindow.off,element), time);
	}
	xpWindow.off=function(element,time){
		element.style.display='none';
		if(time) setTimeout(xpWindow.PF(xpWindow.on,element), time);
	}
	
	xpWindow.findAncestorsByTag=function(el,tag){
		tag = tag.toUpperCase();
		while(el.parentNode){
			el = el.parentNode;
			if(el.tagName && el.tagName.toUpperCase() == tag)
				return el;
		}
		return null;	
	}
	xpWindow.findDescendantsByTag=function(el,tag){
		tag = tag.toUpperCase();
		var children = el.childNodes;
		for(var i=0; i<children.length;i++){
			if(children[i].tagName && children[i].tagName.toUpperCase() == tag) return children[i];
			var find = xpWindow.findDescendantsByTag(children[i],tag);
			if(find) return find;
		}
		return null;	
	}
	
	xpWindow.createElement=function(id_name,type,mum,before){
		var el= document.createElement(type);
		el.setAttribute('id',id_name);	
		//el.innerHTML = ' ';
		if(!mum){
			document.body.appendChild(el);
		}else{
			if (mum!=-1) 
				if(before) mum.insertBefore(el,before);
				else mum.appendChild(el);
		}
		
		return $(id_name);
	}	
	xpWindow.removeElement=function(el)	{
		el.parentNode.removeChild(el);
	}
	xpWindow.copyElement=function(el){
		var new_el = el.cloneNode(true);
		document.body.appendChild(new_el);
		return new_el;	
	}
	xpWindow.createDiv=function(id_name)	{
		var div= document.createElement('div');
		div.setAttribute('id',id_name);	
		div.innerHTML = ' ';
		document.body.appendChild(div);
		return $(id_name);
	}
	xpWindow.removeDiv= xpWindow.removeElement
	xpWindow.iframeDocument=function(iframe_element){
		if(typeof(iframe_element) == 'string') iframe_element = $(iframe_element);
	      	var doc = iframe_element.contentDocument;
        		if (doc == undefined || doc == null)
            		doc = iframe_element.contentWindow.document;
            	return doc;	
	}
	/*change height*/
	xpWindow.WH=function(el,dw,dh,type,speed,step){//type 4 :center +  2: y: up + 1 x:right 
		if(!dw && ! dh ) return;
		var id;
		if(!el.id) id = 'xpMovingObject_'+Math.random();
		else id = el.id;
		var ctl ={ speed:!speed?50:speed,step:!step?20:step,type:!type?4:type }
		var os = w$.s(el);
		var op = w$.p(el);
		var dx = dw/ctl.step;
		var dy = dh/ctl.step;
		var c = ctl.type&4;
		var y = ctl.type&2
		var x = ctl.type&1
		for(var i=1; i<=ctl.step;i++){
			setTimeout('$("'+id+'").style.left='+parseInt(op.x-(c?dx/2:(x?dx:0))*i) +'+"px"; $("'+id+'").style.top='+parseInt(op.y-(c?dy/2:(y?dy:0))*i ) +'+"px";  $("'+id+'").style.width	= '+parseInt(os.w+dx*i) +'+"px"; $("'+id+'").style.height = '+parseInt(os.h+dy*i) +'+"px";',ctl.speed*i)	
		}	
	}
	// move a element around window,  only position=absolute
	xpWindow.move=function(el,dx,dy,destW,destH,type,speed,step){
		//if(!dx && !dy ) return;
		var id =w$.getId(el);
		var ctl ={ speed:!speed?15:speed,step:!step?20:step,type:!type?1:type }
		var os = w$.s(el);
		var op = w$.p(el);
		var ds = {w:(!destW? os.w:destW),h:(!destH? os.h:destH)}
		var dp = { 	x:( op.x + os.w/2 + dx - ds.w/2 ),y:( op.y + os.h/2 + dy - ds.h/2 )	}
		var dr = 1/ctl.step;
		
		for(var i=1; i<=ctl.step;i++){
			setTimeout('$("'+id+'").style.left = '+parseInt(op.x+(dp.x-op.x)*dr*i) +'+"px"; $("'+id+'").style.top = '+parseInt(op.y+(dp.y-op.y)*dr*i) +'+"px"; $("'+id+'").style.width  	= '+parseInt(os.w+(ds.w-os.w)*dr*i) +'+"px"; $("'+id+'").style.height 	= '+parseInt(os.h+(ds.h-os.h)*dr*i) +'+"px";',ctl.speed*i)	
		}	
		
//		for(var i=1; i<=ctl.step;i++){
//			setTimeout('$("'+id+'").style.left = '+parseInt(op.x+(dp.x-op.x)*dr*i) +'+"px";  $("'+id+'").style.width	= '+parseInt(os.w+(ds.w-os.w)*dr*i/2) +'+"px";',ctl.speed*i)	
//		}
//		for(var i=1; i<=ctl.step;i++){
//			setTimeout(' $("'+id+'").style.top = '+parseInt(op.y+(dp.y-op.y)*dr*i) +'+"px";  $("'+id+'").style.height= '+parseInt(os.h+(ds.h-os.h)*dr*i/2)+'+"px";',ctl.speed*(ctl.step+i))	
//		}	
//		for(var i=1; i<=ctl.step;i++){
//			setTimeout(' $("'+id+'").style.width= '+parseInt(ds.w/2+(ds.w-os.w)*dr*i/2 ) +'+"px";',ctl.speed*(ctl.step*2+i))	
//		}
//		for(var i=1; i<=ctl.step;i++){
//			setTimeout('  $("'+id+'").style.height='+parseInt(ds.h/2+(ds.h-os.h)*dr*i/2)+'+"px";',ctl.speed*(ctl.step*3+i))	
//		}
		
		
	}
	xpWindow.move1=function(el,dx,dy,call_back,time,step){
		if(!el.style.position) el.style.position ='absolute'
		if(el.style.position =='relative') var p =w$.pr(el)
		else	var p=w$.p(el);
		var time=!time?1000:time
		var step=!step?20:step;
		var speed = time/step;
		var mx = dx/step;
		var my = dy/step;
		var index=0;
		el.moving=function(){
			if(index==step) return;
			el.style.left = p.x + mx*(++index) +'px';	
			el.style.top  = p.y + my*(index) +'px';	
			setTimeout(el.moving,speed);
		}
		el.moving();
	}	
	
	//open element fade in
	xpWindow.EF=function(id,speed){
		speed=!speed?55:parseInt(speed/10);
		speed=speed?speed:1;		//if speed=0 ; safari will not output timeout as order(the time =0;
//		var noid=!id.id?1:0;
//		if(noid)id.id = "effectdivo"+Math.random();
		var idname = w$.getId(id);
		xpWindow.opacity(id,1)
		id.style.visibility="visible";		
		id.style.display="";
		var i
		for(i=1;i<=10;i++){ 
			setTimeout("w$.opacity($('"+idname+"'),"+parseInt(i*10)+")", parseInt(speed*i));
		}
		//setTimeout("w$.opacity($('"+idname+"'),"+100+")", 2050);

		//if(noid) setTimeout("$('"+idname+"').id=''", speed*11);
	}
	//close element fade out
	xpWindow.EFC=function(id,speed,die){
		
		speed=!speed?15:speed;
		speed=speed?speed:1;		//if speed=0 ; safari will not output timeout as order(the time =0;		
//		var noid=!id.id?1:0;
//		//alert(noid)
//		if(noid)id.id = 'effectdivc'+Math.random();
		var idname = w$.getId(id);
		xpWindow.opacity(id,100)
		for(var i=10;i>=0;i--) setTimeout("w$.opacity($('"+idname+"'),"+(i*10)+")", speed*(10-i));		
		setTimeout("$('"+idname+"').style.visibility='hidden'", speed*11+10)
		setTimeout("$('"+idname+"').style.display='none'", speed*11+20);
		//if(noid) setTimeout("$('"+idname+"').id=''", speed*11+30);		
		if(die) setTimeout("w$.removeElement($('"+idname+"'))", speed*11+40);		
	}
	xpWindow.fade=function(el,in_out,callback,time,step,callback){
		var time=!time?500:time
		var step=!step?10:step;
		var speed = time/step;
		var od =in_out? 100/step : - 100/step;
		var index=0;
		//el.data.fade = {time:time,step:step,speed:speed,index:index}
		el.fading=function(){
			if(index==step) return;
			w$.opacity(el,(in_out?0:100 ) + od*(++index) );
			setTimeout(el.fading,speed);
		}
		el.fading();
	}
	xpWindow.fadeIn=function(el,callback,time,step,callback){
		var time=!time?500:time
		var step=!step?10:step;
		var speed = time/step;
		var od =  - 100/step;
		var index=0;
		//el.data.fade = {time:time,step:step,speed:speed,index:index}
		el.fading=function(){
			if(index==step){ el.style.display='none';return;}
			w$.opacity(el,100  + od*(++index) );
			setTimeout(el.fading,speed);
		}
		el.fading();
	}
	xpWindow.fadeOut=function(el,callback,time,step,callback){
		var time=!time?500:time
		var step=!step?10:step;
		var speed = time/step;
		var od =100/step;
		var index=0;
		//el.data.fade = {time:time,step:step,speed:speed,index:index}
		el.style.display='';
		el.fading=function(){
			if(index==step) return;
			w$.opacity(el,0 + od*(++index) );
			setTimeout(el.fading,speed);
		}
		el.fading();
	}	
	
	//close element to center
//	xpWindow.CC=function(id,speed,die){
//		speed=!speed?35:speed;
//		speed=speed?speed:1;		//if speed=0 ; safari will not output timeout as ordered(the time =0);		
//		var step = 20;
//		var noid=!id.id?1:0;
//		if(noid)id.id = 'effectdivc'+Math.random();
//		var idname = id.id;
//		var wc = xpWindow.wc();
//		var p  = xpWindow.p(id)		
//		var s  = xpWindow.s(id)
//		var x1=p.x
//		var y1=p.y
//		var x2=p.x+s.w
//		var y2=p.y+s.h
//		
//		var dx1 = (wc.x-p.x)/step
//		var dy1 = (wc.y-p.y)/step
//		var dx2 = s.w/step
//		var dy2 = s.h/step
//		
//		for(var i = 0 ;i<=step; i++){
//			setTimeout("$('"+idname+"').style.left='"+(p.x+parseInt(i*dx1))+"px'" , 1+i*speed)
//			setTimeout("$('"+idname+"').style.top='"+(p.y+parseInt(i*dy1))+"px'" , 2+i*speed)
//			setTimeout("$('"+idname+"').style.width='"+(s.w-parseInt(i*dx2))+"px'" , 3+i*speed)
//			setTimeout("$('"+idname+"').style.height='"+(s.h-parseInt(i*dy2))+"px'" , 4+i*speed)
////			setTimeout("$('"+idname+"').style.left='"+(parseInt(dx1))+"px'" , 1+i*speed)
//		}
//		if(noid) setTimeout("$('"+idname+"').id=''", speed*(step+1)+30);		
//		if(die) setTimeout("w$.removeElement($('"+idname+"'))", speed*(step+1)+40);		
//	}
	


	/*drop down */
	xpWindow.DD=function(el){
		var s0 = w$.s(el);
		var  cp = xpWindow.copyElement(el)
		/* must have new id to deattach from old one */
		var new_id = "effectdivd_new"+Math.random()
		cp.id = new_id
		cp = $(new_id);
		cp.style.visibility = 'hidden';
		cp.style.height='';
		cp.style.width=s0.w;
		cp.style.overflow='auto';
		var s = w$.s(cp);
		w$.removeElement(cp);
		el.style.display="";
		el.style.visibility = 'visible'
		w$.move(el,0,0,s0.w,s.h);		
	}
	/*close up*/
	xpWindow.CU=function(el){
		var s0 = w$.s(el);
		el.style.overflow='hidden'
		w$.move(el,0,0,s0.w,1);		
	}

	
	/*drop down */
	xpWindow.expend=function(el,type,x,y,speed){
		type=!type?0:type;
		speed=!speed?1000:speed;
		var  cp = xpWindow.copyElement(el)
		/* must have new id to deattach from old one */
		var new_id = "effectdiv_new"+Math.random()
		cp.id = new_id
		cp = $(new_id);
		cp.style.visibility = 'hidden';
		cp.style.position = 'absolute';
		cp.style.left=cp.style.top = '0';
		cp.style.height='';
		cp.style.width='';
		cp.style.overflow='auto';
		var s = w$.s(cp);
		w$.removeElement(cp);
		el.style.display="";
		el.style.visibility = 'visible'
		switch(type){
			case 0:
				var dx = 0
				var dy = 0
				break;
			case 1:
				var dx = -s.w/2
				var dy = -s.h/2
				break;			
			case 2:
				var dx = s.w/2
				var dy = -s.h/2
				break;			
			case 3:
				var dx = s.w/2
				var dy = s.h/2
				break;
			case 4: 
				var dx = -s.w/2
				var dy = s.h/2
				break;		
		}
		w$.move(el,dx,dy,s.w,s.h);		
	}	
	
	
	xpWindow.blink=function(el,stop){
		var opt =100;
		var d=5;
		var flag = true
		if(stop){
			flag = false;
			//don't stop , continue to do blink() to reset;
		}
		el.blink=function(){
			if(opt <30) d=-5
			if(opt>100) d=5
			opt-=d;
			xpWindow.opacity(el,opt)
			if(flag) setTimeout(xpWindow.PF(el.blink),50);
			else xpWindow.opacity(el,100)
		}
		el.blink();
	}
	
	
	xpWindow.DoOnKey=function(event,theCode,doThing){
		var keyCode = window.event?window.event.keyCode : event.which;
		if(theCode == keyCode){
			if(typeof(doThing) == 'string')
				eval(doThing)
			else
				doThing();	
		}
		
		
	}
	xpWindow.checkImg=function(el,width){
		width=width?width:5
		if( el.offsetWidth< width ) el.style.display='none';
	}
	
	xpWindow.replaceImg=function(el,img,seconds){
		var source =  el.src;
		var id = xpWindow.getId(el);
		el.src = img;
		if(seconds>0)
			setTimeout("xpWindow.replaceImg($('"+id+"'),'"+source+"')",seconds);
	}
	xpWindow.replaceHtml=function(el,html,seconds){
		var source =  el.innerHTML;
		var id = xpWindow.getId(el);
		el.innerHTML = html;
		if(seconds>0)
			setTimeout("xpWindow.replaceHtml($('"+id+"'),'"+source+"')",seconds);
	}
	
	xpWindow.stopSubmitOnReturn =function(e){
			if(e) k = e.which 
			else k = window.event.keyCode 
			if(k==13)		return false;
			return true
	}	
	
	/* clear input field's tips, some thing like:  '(please xxx...)' */
	xpWindow.inputFocus=function(el){
		var value = el.value;
		if(value.search( /\(.+\)/ )  != -1){
		 	el.value = '';
			el.tips = value
			el.onblur = function(){ if(w$.trim(el.value)==''){ el.value = el.tips; } }   
		}
	}
	xpWindow.getInput=function(el){
		if(el.value.search( /\(.+\)/ )  != -1) 
			return ''; 
		else 
			return el.value; 
	}
	
	//attache event to element
	xpWindow.hookEventFlag=null;
	xpWindow.hookEvent=function (element, type, handler) {
		if(!xpWindow.hookEventFlag)	xpWindow.hookEventFlag = (element.addEventListener)?1:((element.attachEvent)?2:3);
		switch(xpWindow.hookEventFlag){
			case 1: element.addEventListener(type, handler, false);break;
			case 2: element.attachEvent("on" + type, handler);break;
			case 3: break;
		}
	}
	xpWindow.dropEvent=function (element, type, handler) {
		if(!xpWindow.hookEventFlag)	xpWindow.hookEventFlag = (element.addEventListener)?1:((element.attachEvent)?2:3);
		switch(xpWindow.hookEventFlag){
			case 1: element.removeEventListener(type, handler, false);break;
			case 2: element.detachEvent("on" + type, handler);break;
			case 3: break;
		}
	}
	//set select by selected value
	xpWindow.setOptionByValue=function(element,optionValue){
		var options = element.options
		for(var i=0; i<options.length;i++)
			if(options[i].value == optionValue)
				element.options[i].selected = true;
	}
	xpWindow.getRadioValue=function(radios){
			for (i=0;i<radios.length;i++) 
				if (radios[i].checked) 
					return radios[i].value;
	}
	xpWindow.setRadioByValue=function(radios,value){
			for (i=0;i<radios.length;i++) 
				if (radios[i].value == value) 
					radios[i].checked=true;
	}

	//kill cache even on back button
	xpWindow.killCache=function (timeout){	//timeout in seconds; best 30 ; 
		timeout=(timeout==null)?30:timeout;
		var date = new Date();
		var time = date.getTime()
		var url = window.location + '';
		var uri = xpWindow.regexGet(/([^#|^?]*)/ , url);
		var mark  = xpWindow.regexGet(/#(.*)/, url);
		var param = xpWindow.regexGet(/\?([^#]*)/ , url)
		if(!param) param = 'cssfysxck='; 
		//else must be ?xxx...
		if(! xpWindow.regexGet(/(cssfysxck=)/ ,param))
			param += '&cssfysxck='
		var r = xpWindow.regexGet(/cssfysxck=([^&|^#]*)/ ,param);
		var diff = Math.abs(time-parseInt(r));
		if(diff<timeout*1000){ alert(diff +'='+timeout*1000);return}
		param = param.replace(/cssfysxck=[^&|^#]*/, 'cssfysxck='+time);
		var href = uri+'?'+param+(mark?('#'+mark):'')
		window.location = href; 
	}
	//get element's id( <.. id="abc"../>; if not set a temp one; 	
	xpWindow.getId=function(id){
		if(typeof id == 'string')	return id
		var name = id.id
		if(!name) {
			name= 'temp_id_' + Math.random()
			id.id = name;
		}
		return name;
	}
	xpWindow.getName=function(el){
		if(typeof el == 'string')  el = $(el);
		var name = el.name
		if(!name) {
			name= 'temp_id_' + Math.random()
			el.name = name;
		}
		return name;
	}
	// make self to the top
	xpWindow.onTop=function(){
		  if (top.location != self.location)     top.location.href = self.location.href ;
	}
	xpWindow.topSelf=function(){
		    if (top.location!=document.location) top.location=document.location;
  	}
	
	
	//refresh window 	
	xpWindow.reload= function (){
		xpWindow.killCache(0);
		return;
	}
	//test point(x,y) inside a rectangle
	xpWindow.inside=function(point,range,tolerance)	//poinh={x:x,y:y} range={x:x,y:y,w:w,h:h};
	{
		if(!tolerance) tolerance=0;
		if(point.x < range.x-tolerance || point.x > (range.x+range.w+tolerance) ) return false;
		if(point.y < range.y-tolerance || point.y > (range.y+range.h+tolerance) ) return false;
		return true;
	}
	//test point in side an element
	xpWindow.insideElement=function(point,el,tolerance)	//poinh={x:x,y:y} range={x:x,y:y,w:w,h:h};
	{
		if(!tolerance) tolerance=0;
		var p = xpWindow.findPositionXY(el)		
		var s = xpWindow.findSizeWH(el)		
		
		return xpWindow.inside(point,{x:p.x,y:p.y,w:s.w,h:s.h},tolerance)
	}
	//convert mice's window position to page position
	xpWindow.mice2window=function(point)
	{
		var woff = xpWindow.findWindowPosition()
		return {x:(point.x+woff.x), y:(point.y+woff.y)}
	}
	//creative global transferable data buffer as global javascript variables
	xpWindow.SetAnchor = function(name,data)
	{
		var id = xpWindow.createDiv(name+'_buffer');
		id.style.display="none";
		id.innerHTML = data;
	}
	xpWindow.GetAnchor = function(name)	{
		var id=$(name+'_buffer')
		var data=id.innerHTML;
		xpWindow.removeDiv(id);
		return data;
	}
	//delay entry  
	xpWindow.delayEntry=function(timerId,name,delay) {
		delay=!delay?250:delay; //default 250ms
		if(timerId) clearTimeout(timerId);
		return setTimeout(name,delay);
	}
	//cookie : read ,write, delete; 
	xpWindow.CookieWrite = function(name,value,day,hour,minute,second) {
		if (day || hour || minute || second) {
			var date = new Date();
			date.setTime(date.getTime()+((!day?0:day)*24*60*60*1000) +((!hour?0:hour)*60*60*1000) +((!minute?0:minute)*60*1000) +((!second?0:second)*1000) );
			var expires = "; expires="+date.toGMTString();
		}
		else var expires = "";
		document.cookie = name+"="+value+expires+"; path=/";
	}
	xpWindow.CookieRead=function(name) {
		var nameEQ = name + "=";
		var ca = document.cookie.split(';');
		for(var i=0;i < ca.length;i++) {
			var c = ca[i];
			while (c.charAt(0)==' ') c = c.substring(1,c.length);
			if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
		}
		return null;
	}
	xpWindow.CookieDelete=function(name) {
		xpWindow.CookieWrite(name,"",-1);
	}
	//limited alert in case of dead loop
	xpWindow.echoCount=0;
	xpWindow.echoMax=20;
	xpWindow.echo=function(str,max){
		if(max) 	xpWindow.echoCount=max;
		xpWindow.echoCount++;
		if(xpWindow.echoCount<xpWindow.echoMax)
			alert(str);		
	}
	//get money from a text field ($23.85 return {sn:$, v:23.85})
	xpWindow.get$=function(s){
		var sn = '';
		s = s.replace(',','')
		if(/[^\d]*/.test(s) ){
			sn=s.substr(0,1);
			s = s.substr(1);
		}
		return {sn:sn,v:s};
	
	}

	//utf-8 to GB2312
	xpWindow.gb2312=function(key) {
		var r = "";
		for(var i=0;i<key.length;i++){
			var t = key.charCodeAt(i);
			if(t>=0x4e00 || t==0x300A || t==0x300B){
//				try{execScript("ascCode=hex(asc(\""+key.charAt(i)+"\"))", "vbscript"); r += ascCode.replace(/(.{2})/g, "%$1"); }
//				catch(e){}
			}
			else{r += escape(key.charAt(i))}
		}
		return r;
	}	

	
	// trim string whilt space (front & end)  String.prototype.trim
	xpWindow.trim=function(str) { return str.replace(/^\s+|\s+$/g, ''); }
	//pad space in left
	xpWindow.lpad=function(str,n,chr) { 
		chr = chr?chr:'&nbsp;'
		for(var i=0;i<n;i++)
			str = chr+str;
		return str;
	}	
	//pad space in right
	xpWindow.rpad=function(str,n,chr) { 
		chr = chr?chr:'&nbsp;'
		for(var i=0;i<n;i++)
			str += chr
		return str;
	}	
	
	xpWindow.padNumber=function(str,len){
		var sl =len - (' '+str).length +1;
		if(sl >0) return xpWindow.lpad(str,sl,'0');
		return str; 
	}
	
	
	
	/*
		exec 		A RegExp method that executes a search for a match in a string. It returns an array of information.
		test 		A RegExp method that tests for a match in a string. It returns true or false.
		match 		A String method that executes a search for a match in a string. It returns an array of information or null on a mismatch.
		search 		A String method that tests for a match in a string. It returns the index of the match, or -1 if the search fails.
		replace 	A String method that executes a search for a match in a string, and replaces the matched substring with a replacement substring.
		split 		A String method that uses a regular expression or a fixed string to break a string into an array of substrings.	
	*/
	//regex get a string must in () ; eg. w$.regexGet(/action="(.*?)"/i , form);
	xpWindow.regexGet=function(regex,str){
		var m = str.match(regex);
		if(m && m[1]) return m[1];
		return null;
	}
	// Array.prototype.unique:
	// clear array: no prototype function bundle with array
	// array index by number arr[0] arr[1] ..
	xpWindow.unique = function (arr){
		var trr = [];	//temp array for storage 
		var rrr = [];	//result array 
		var i=0;	
		for(var k in arr) trr[arr[k]] = arr[k];
		for(var k in trr) rrr[i++] = trr[k]; 	 
		return rrr;	
	}	
	//test in a array
	xpWindow.inArray = function (the_needle, the_haystack){
	    var the_hay = the_haystack.toString();
	    if(the_hay == '') return false;
	    var the_pattern = new RegExp(the_needle, 'g');
	    var matched = the_pattern.test(the_haystack);
	    return matched;
	}	
	
	xpWindow.range=function(v,s,e){
		while(v<s)	v = e- (s-v)+1;
		while(v>e) 	v = s+ (v-e)-1;
		return v		
	}
	//pass a function to ...
	xpWindow.passFunction=function(func, arg) { 
		return function() { func(arg?arg:null) }; 
	}	
	xpWindow.PF = xpWindow.passFunction;
	/* return true/false for called function */
	xpWindow.returnFasle = function(){return false;}
	xpWindow.returnTrue = function(){return true;}
	//for setTimeout  to delete obj
	xpWindow.cleanUp=function(obj){
		delete(obj);
	}

	xpWindow.loadFile=function(file,callback) {
//this.node = document.createElement('SCRIPT');
//this.node.type = 'text/javascript';
//this.node.src = 'http://www.serversite.com';
//var head = document.getElementsByTagName('HEAD')[0];
//head.appendChild(this.node);		
	    var heads = document.getElementsByTagName('head')
	    var html_doc = heads[0];
	    js = document.createElement('script');
	    js.setAttribute('type', 'text/javascript');
	    js.setAttribute('src', file);
	    html_doc.appendChild(js);
	    setTimeout(callback,1);
	    return js;
	}
	//produce integral  in(include) (x,y)
	xpWindow.random=function(x,y){
		x= parseInt(x)
		y= parseInt(y)
		var d =  y-x +1
		return Math.ceil(Math.random()*d) +(x-1)
	}
	
	//encyption simple	
	xpWindow.roller=function(str,key,keyLength){
		keyLength = keyLength?keyLength:128;	//keep with php 
		var cipher = key.split("");
		while(cipher.length < keyLength){
			var v = cipher.slice();
			v.reverse();
			cipher = cipher.concat(v);
		}	
		keyLength = cipher.length;
		// * xor string;  */
		var len = str.length;
		var b = []
		cipher = cipher.join("");
		for(var i=0;i<len;i++){
			b[i] = String.fromCharCode(str.charCodeAt(i)   ^   cipher.charCodeAt(i % keyLength) );
		}
		return b.join("");
		
	}
	//
	xpWindow.nice=function(s){
		var l = s.length;
		var ns ='';
		var a;
		var j=0;
		for(var i=0;i<l;i++){  
			a = s.substr(i,1).charCodeAt(0);
			if(a<10) ns += "1"+a;
			if(9<a&& a<100) ns += "2"+a;
			if(99<a&& a<1000) ns += "3"+a;
			if(999<a&& a<10000) ns += "4"+a;
			if(9999<a&& a<100000) ns += "5"+a;
			if(99999<a&& a<1000000) ns += "6"+a;
			if(999999<a&& a<10000000) ns += "7"+a;
			if(9999999<a&& a<100000000) ns += "8"+a;
			if(99999999<a&& a<1000000000) ns += "9"+a;

		}
		return ns;	
	
	}
	/**
	 * change back from int string
	 *
	 * @param string $s	: string has been niced
	 * @return string
	 */
	xpWindow.ugly=function(s){
		var ns='';
		var p=0;
		var l = s.length ;
		var v=0;
		var w=0;
		while(p<l){
			w =parseInt(s.substr(p,1));
			v = parseInt(s.substr(p+1,w));
			ns += String.fromCharCode(v);
			p +=w+1;
		}
		return ns;	
	}	
	
	/** from webtookit utf8.html  **/
	/** unicode to utf8 **/
	xpWindow.u2u8=function(u) {
		u = u.replace(/\r\n/g,"\n");
		var u8 = "";
		for (var n = 0; n < u.length; n++) {
			var c = u.charCodeAt(n);
			if (c < 128) {
				u8 += String.fromCharCode(c);
			}else{ 
				if((c > 127) && (c < 2048)) {
					u8 += String.fromCharCode((c >> 6) | 192);
					u8 += String.fromCharCode((c & 63) | 128);
				}else {
					u8 += String.fromCharCode((c >> 12) | 224);
					u8 += String.fromCharCode(((c >> 6) & 63) | 128);
					u8 += String.fromCharCode((c & 63) | 128);
				}
			}
		}
		return u8;
	}
	/** utb-8 to unicode **/
	xpWindow.u82u=function(u8) {
		var u= "";
		var i = 0;
		var c = c1 = c2 = 0;
		while ( i < u8.length ) {
			c = u8.charCodeAt(i);
			if (c < 128) {
				u += String.fromCharCode(c);
				i++;
			}else{
				if((c > 191) && (c < 224)) {
					c2 = u8.charCodeAt(i+1);
					u += String.fromCharCode(((c & 31) << 6) | (c2 & 63));
					i += 2;
				}else {
					c2 = u8.charCodeAt(i+1);
					c3 = u8.charCodeAt(i+2);
					u += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));
					i += 3;
				}
			}
		}
		return u;
	}
	/** follow two only work in utf-8 string **/
	xpWindow.nice=function(s){
		var l = s.length;
		var ns ='';
		var a;
		for(var i=0;i<l;i++){  
				a = s.substr(i,1).charCodeAt(0);
				ns+= (a<10)?("00"+a):((a<100)?("0"+a):a);
		}
		return ns;	
	}
	/**
	 * change back from int string
	 *
	 * @param string $s	: string has been niced
	 * @return string
	 */
	xpWindow.ugly=function(s){
		var ns='';
		var l = s.length
		for(var i=0; i<l ; i+=3){
			ns += String.fromCharCode(1*s.substr(i,3));
		}
		// why ? why why? !!!
		ns = xpWindow.u82u(ns);
		return ns;	
	}
	/**
	*	keep session a live
	*	@param server : server connection (one with session_start)
	*	@param time: polling time in millisecond, default 30 second 
	*/
	xpWindow.keepAlive=function(server,time){
		if(time) 		XPX(0,0,server)
		time=!time?5*60*1000: time;
		setTimeout("w$.keepAlive('"+server+"',"+ time+")",time);
	}
	
	xpWindow.debug=function(a,deep,maxDeep){
		var b='';
		deep=deep?deep:0
		maxDeep=maxDeep?maxDeep:20		// only to 20 level
		if(deep > maxDeep) return '**';
		if(typeof(a)=='function' || typeof(a)=='undefined' || typeof(a)=='boolean' ||typeof(a)=='number' || typeof(a)=='string' || a==null )  b+=xpWindow.lpad('['+a+']'+'\n' , deep*8,'.');
		else	for ( key in a ){
				//if(typeof(a[key])=='function' || typeof(a[key])=='undefined' || typeof(a[key])=='boolean' ||typeof(a[key])=='number' || typeof(a[key])=='string' || a[key]==null )  b+=xpWindow.lpad('['+key +']'+ '=>'+a[key]+'\n' , deep*8,'.');
				//else 
				b+= (xpWindow.lpad('['+key +']'+ '=>[\n',deep*8,'.') + xpWindow.debug(a[key],deep+1,maxDeep) + xpWindow.lpad(']\n',xpWindow.lpad('['+key +']'+ '=>[\n',deep*8,'.').length,'.') );
			}
		if(deep) return b;
		else alert(b)
	}
	
	
	
	
	//name alias 
	var w$ = xpWindow;	

//}
//***** end of $w lib ***************************************************




//end of xpWindow //////////////////////////////////////////////////////


/* *
 *	mouse obj;
 *	@obj		:name of mice obj itself
 *	@moving		:called function  when mice moved
 *	@obj.up/down(f)	:	called when mice button up or down
 *	@eg.	
		var mice
		function showmice(el)	{
			var id = xpFloat(el,'miceXY');
			id.innerHTML ="sdgfsdfg";
			mice = new xpMice('mice',"showxy()");
			mice.Up("mup(0)")
			mice.Down("mup(1)")
		}
		
		function mup(x)	{
			if(x)			alert("y="+mice.y);
			else			alert("x="+mice.x);
		}
		
		function showxy()	{
			var id=document.getElementById('miceXY');
			id.innerHTML = '<div style="width:100px;height:50px;background:red;">x='+mice.x+'</div>'
		}	
	
*/
function _xpMice(moving,up,down)
{
	var name = "xpMice"+Math.random();
	var obj = 'xpGLOBALS["'+name+'"]';
	xpGLOBALS[name] = new xpMice(obj,moving,up,down)	
	return obj
}
function  xpMice(obj,moving,up,down){
	this.obj = obj;
	this.moving = !moving?'':moving;
	this.x=0;
	this.y=0
	this.move = function(e)	{
		x = ((document.getElementById&&!document.all) ? e.clientX: event.clientX )
		y = ((document.getElementById&&!document.all) ? e.clientY: event.clientY )		
		eval(obj+'.x='+x)
		eval(obj+'.y='+y)
		eval(moving);		
	}
	setTimeout('document.onmousemove = '+this.obj+'.move',1);	
	this.Up=function(up){document.onmouseup= new Function(eval('"'+up+'"'));	}
	this.Down=function(down){document.onmousedown= new Function(eval('"'+down+'"'));}
	if(down)this.down(down)
	if(up  )this.up(up)
}

/* @mice scroll obj
 * @obj	:	name of obj itself , global variable
 * @handle:	callback handle when scroll(wheel) happened
 * eg.
 *		wheel = new xpMiceScroll('wheel', 'func_of_scroll' )
 *	
 *	* note:
 *		wheel need be global variable
 *		handle as pass as name not function so it will be 'func_of_scroll' instead normal 'func_of_scroll()'
 */

function xpMiceScroll(obj,handle){
	this.obj = obj;
 	this.wheel=function(event){
        var delta = 0;
         var delta = 0;
        if (!event) event = window.event;
        if (event.wheelDelta) {
                delta = event.wheelDelta/120;
                if (window.opera) delta = delta*3/5;
        } else if (event.detail) {
                delta = -event.detail/5;
        }
        if (delta){	//? how handle been trans to here, but it work
                eval(handle+"("+delta+")" );
        }
 	}

	if (window.addEventListener)         /** DOMMouseScroll is for mozilla. */
        		setTimeout("window.addEventListener('DOMMouseScroll', "+this.obj+".wheel , false)",1);
	//else /** IE/Opera./safari */
		setTimeout("window.onmousewheel = document.onmousewheel = "+this.obj+".wheel",1);
}




/*
 *will insert animated waiting logo 
 * name alias 	:xpWait =  xpMask (function _xpMask
 * @xpWait(obj,speed,opacity)
 * @obj			:self's name; must be a global variable
 * @speed		:speed in ms , default=150ms 
 * @opacity		:opacity of mask; 0 - 1;
 * @public method:
 *	@msg(str)	:show str
 *	@str		:message;
 *	@stop()		:stop this
 * Usage		: wait = new xpWait('wait');
 * note	:
 *	don't use style.visibility on <select..> tag; using on it parent element or create container for it!! 		
 */

function _xpMask(opacity,backcolor,logo,speed){
	var d = new Date();
	var name = "xpMask"+d.getTime();
	var obj = 'xpGLOBALS["'+name+'"]';
	xpGLOBALS[name] = new xpMask(obj,opacity?opacity:0,backcolor?backcolor:0,logo?logo:0,speed?speed:0)
	return obj;
}	 

function xpMask(obj, opacity,backcolor,wait,speed,zindex){ //be careful to use z-index!!

	this.obj=obj		//must have 
	this.speed=!speed?150:speed;
	this.wait=!wait?0:1;
	this.opacity =(!opacity)?0.01:opacity;
	this.backcolor = (!backcolor)?'#000':backcolor;
	
	//get window size and position & page size & position	
	this.pageSize = xpWindow.findSizeWH(document.body)
	this.windowSize = xpWindow.findWindowSize();	
	this.windowPosition = xpWindow.findWindowPosition()
	var left = parseInt(this.windowSize.x/2-155);
	var top  = parseInt(this.windowSize.y/2-110); 

	var d = new Date();
	this.name = "xpBotBG"+d.getTime();

	this.div = xpWindow.createDiv(this.name)
	this.div.style.position='absolute';
	this.div.style.background=this.backcolor;
	this.div.style.left='0px';
	this.div.style.top='0px';
	//pageSize.y is correct, but pageSize.x is not alway
	this.div.style.width=Math.max(this.windowPosition.x+this.windowSize.x,this.pageSize.w)+'px';
	this.div.style.height=Math.max(this.windowSize.y,this.pageSize.h)+'px';
	if(zindex)
		this.div.style.zIndex=zindex;

	var w = this.w = Math.max(this.pageSize.w,this.windowSize.x);
	var h = this.h = Math.max(this.pageSize.h,this.windowSize.y);

	xpWindow.opacity(this.div, this.opacity*100)
	//for Ie6  (screw the M$!)
	this.div.innerHTML = 	'<!--[if lte IE 6.5]><iframe id="bloody_ie6" style="width:'+w+'px; height:'+h+'px; position:absolute;left:0px;top:0px; display:none;display:block;	z-index:-1;" ></iframe><![endif]--> ' 
	if(this.wait){
//		var gif = "/img/wait_m.gif"
//		this.logo='<div id="'+name+'_0" style="background-color:'+backcolor+' ;'+(gif?'  background : url('+gif+') 50% 50% no-repeat;  ':'')+'margin:0;padding:0;width:50px;height:50px;position:absolute; ">&nbsp;</div>'

		var left = this.windowPosition.x+parseInt(this.windowSize.x/2-155);
		var top  = this.windowPosition.y+parseInt(this.windowSize.y/2-110); 
		this.logo=''
		+'<p id="'+this.name+'_0" style="margin:0;padding:0;width:20px;height:20px; Position:absolute;top:'+(50+top)+'px;left:'+(150+left)+'px;  background-color:#fff"> </p>'
		+'<p id="'+this.name+'_1" style="margin:0;padding:0;width:20px;height:20px; Position:absolute;top:'+(65+top)+'px;left:'+(185+left)+'px;  background-color:#fff"> </p>'
		+'<p id="'+this.name+'_2" style="margin:0;padding:0;width:20px;height:20px; Position:absolute;top:'+(100+top)+'px;left:'+(205+left)+'px; background-color:#fff"> </p>'
		+'<p id="'+this.name+'_3" style="margin:0;padding:0;width:20px;height:20px; Position:absolute;top:'+(135+top)+'px;left:'+(185+left)+'px; background-color:#fff"> </p>'
		+'<p id="'+this.name+'_4" style="margin:0;padding:0;width:20px;height:20px; Position:absolute;top:'+(150+top)+'px;left:'+(150+left)+'px; background-color:#fff"> </p>'
		+'<p id="'+this.name+'_5" style="margin:0;padding:0;width:20px;height:20px; Position:absolute;top:'+(135+top)+'px;left:'+(115+left)+'px; background-color:#fff"> </p>'
		+'<p id="'+this.name+'_6" style="margin:0;padding:0;width:20px;height:20px; Position:absolute;top:'+(100+top)+'px;left:'+(100+left)+'px; background-color:#fff"> </p>'
		+'<p id="'+this.name+'_7" style="margin:0;padding:0;width:20px;height:20px; Position:absolute;top:'+(65+top)+'px;left:'+(115+left)+'px;  background-color:#fff"> </p>'
		this.div.innerHTML+=this.logo;
	}
	this.setMsg=function(msg){
		this.div.innerHTML+= '<div id="wait_message"  style="text-align:center;border-top:16px solid #fff ;margin:auto;margin-top:'+(this.windowPosition.y+parseInt(this.windowSize.y/2-110))+'px;width:300px;padding: 8px 16px 16px 30px;background:#e8e8e8 url(img/wait_srl_trn.gif) 5px 9px no-repeat; ">'
					+msg+'</div>';
		
	}
	this.loop=0;
	this.looping=function()	{
		xpWindow.opacity($(this.name+'_'+this.loop),10);
		xpWindow.opacity($(this.name+'_'+((this.loop+1)>7?(this.loop  )-7:(this.loop+1))),25);
		xpWindow.opacity($(this.name+'_'+((this.loop+2)>7?(this.loop+1)-7:(this.loop+2))),45);
		xpWindow.opacity($(this.name+'_'+((this.loop+3)>7?(this.loop+2)-7:(this.loop+3))),60);
		xpWindow.opacity($(this.name+'_'+((this.loop+4)>7?(this.loop+3)-7:(this.loop+4))),75);
		xpWindow.opacity($(this.name+'_'+((this.loop+5)>7?(this.loop+4)-7:(this.loop+5))),100);
		this.loop=(this.loop+1)==8?0:(this.loop+1);	
		this.timeoutID = setTimeout(this.obj+".looping()",this.speed);
	}
	if(this.wait) 	
		this.looping();
	this.stop=function(){
		window.clearTimeout(this.timeoutID);
		xpWindow.removeDiv(this.div);
		setTimeout('delete('+this.obj+')',1)
	}
	this.flash=function (){
		w$.reload();
	}
	this.test=function(){
		alert(ajax.data);
		this.stop();	
	}
	
}
//name alias
var xpWait = xpMask;

/* function type wait. using gif for logo
 * call div stop to remove it or just w$.removeElement?(div)
 * @usage:
 *	var mask = xpMG('img/wait_l.gif',0.8,'#f00',100);
 *	...
 *	...
 *	...
 *	mask.stop();
 * 	//..or..
 * 	setTimeout(w$.passFunction(mask.stop),3000);
 * 	this one not comp with ie6
 */
function xpMG(gif, opacity,backcolor,zindex){ //be careful to use z-index!!

	gif = gif?gif:(gif==null?null:'/img/wait_m.gif');
	opacity =(!opacity)?0.01:opacity;
	backcolor = (!backcolor)?'#000':backcolor;
	//get page size 
	var size = w$.findPageSize();
	var name = "xpBotBG_"+Math.random();
	var div = xpWindow.createDiv(name)
	div.style.position='absolute';
	div.style.background=backcolor;
	div.style.left='0px';
	div.style.top='0px';
	//pageSize.y is correct, but pageSize.x is not alway
	//div.style.width=size.w+'px';
	//div.style.height=size.h+'px';
	//div.data = {name : {div:name,iframe:'bloody_ie6_frame',logo:name+'_0'}, gif:gif};
	if(zindex)
		div.style.zIndex=zindex;

		
	xpWindow.opacity(div,opacity*100)
	div.innerHTML = '<!--[if lte IE 6.5]><iframe id="bloody_ie6_frame" style="position:absolute;left:0px;top:0px;display:none;display:block;z-index:-201;" ></iframe><![endif]--> ' 
	//div.innerHTML = '<iframe id="bloody_ie6_frame" style="position:absolute;left:0px;top:0px;display:none;display:block;z-index:1;" ></iframe>' 
	if(gif){
		var logo='<div id="'+name+'_0" style="background-color:'+backcolor+' ;'+(gif?'  background : url('+gif+') 50% 50% no-repeat;  ':'')+'margin:0;padding:0;width:50px;height:50px;position:absolute; ">&nbsp;</div>'
		div.innerHTML += logo;
	}
	div.data = {element:{},name : {div:name,iframe:'bloody_ie6_frame',logo:name+'_0'}, gif:gif ,hideObjects:[],showObjects:[]};
	//div.data = {hideObjects: $$('object')};
	div.data = {hideObjects: document.getElementsByTagName('object')};
	var so = [];
	for(var i= 0 ;i< div.data.hideObjects.length;i++){
			var p = w$.findAncestorsByTag(div.data.hideObjects[i],'div') 
			if(p && p.style.display !='none') {
				so.push(div.data.hideObjects[i])
				p.parentNode.style.display = 'none';
			}
	}	

	div.data.showObjects = so;	
	div.resize=function(){
		var wp = w$.wp();
		var ws = w$.ws();
		var wc = w$.wc();

		if($('bloody_ie6_frame')){
			$('bloody_ie6_frame').style.width = wp.x+ws.w+'px'
			$('bloody_ie6_frame').style.height = wp.y+ws.h+'px'
		}
		this.style.width=wp.x+ws.w+'px';
		this.style.height=wp.y+ws.h+'px';		
		if(gif){
			$(name+'_0').style.left = wc.x-25+"px";
			$(name+'_0').style.top = wc.y-25+"px";
//			$(this.data.name.logo).style.left = wc.x-25+"px";
//			$(this.data.name.logo).style.top = wc.y-25+"px";
		}
		var ps = w$.findPageSize();
		if($('bloody_ie6_frame')){
			$('bloody_ie6_frame').style.width = ps.w+'px'
			$('bloody_ie6_frame').style.height = ps.h+'px'
		}
		this.style.width=ps.w+'px';
		this.style.height=ps.h+'px';		
		
	}
	div.resize();
	
	div.stop=function(instant){
		if(div.data.showObjects)
			for(var i= 0 ;i< div.data.showObjects.length;i++){
				var p = w$.findAncestorsByTag(div.data.showObjects[i],'div')
				if(p) p.parentNode.style.display ='' ;
			}		
		if(instant) 	w$.removeDiv(div);
		else		w$.EFC(div,null,true);		
	}
	return div;
}






/*
 * create div with transparented border in center screen 
 * default border width=10;
 * @id			:self name
 * @w			:div width
 * @h			:div height
 * @border		:border width	
 * @bg			:background color
 *
 * Usage		:box = new xpCenterDiv('box',200,300);
 */
function xpCenterDiv(obj,w,h,border,bg,zIndex){	
	var center = xpWindow.findWindowCenter();
	
	var x=w?((1*center.x - (w*1)/2)):-1;
	var y=h?((1*center.y - (h*1)/2)):-1;
	w=w?w:-1;
	h=h?h:-1;
	this.div =new  xpBox(obj,x,y,w,h,border,bg,1,0,zIndex)
	this.setContent=function(con,hide){
		this.div.setContent(con,hide);
	}	
	this.stop=function(){
		this.div.stop();
	}
	this.hide=function(){
		this.div.hide();
	}	
	this.show=function(){
		var msg = ajax.data
		if(msg.substr(0,2) != "ok")
			this.setContent(msg);	
		else
			wait.flash();
	}
}

function  _xpCenterDiv(con,w,h,border,bg,zIndex){
	var d = new Date();
	var name = "xpCenterDiv"+d.getTime();
	var obj = 'xpGLOBALS["'+name+'"]';
	xpGLOBALS[name] = new xpCenterDiv( obj, w?w:0,h?h:0,border?border:0,bg?bg:0,zIndex?zIndex:0);
	xpGLOBALS[name].setContent(con);
	return obj;
}


/*
 * create div with transparented border  
 * default border width=10;
 * @id			:self name
 * @x			:left
 * @y			:top
 * @w			:div width
 * @h			:div height
 * @border		:border width	
 * @bg			:background color
 *
 * Usage		:box = new xpCenterDiv('box',200,300);

 */
function  _xpBox(con,x,y,w,h,border,bg,speed,opacity){
	var d = new Date();
	var name = "xpCenterDiv"+d.getTime();
	var obj = 'xpGLOBALS["'+name+'"]';
	xpGLOBALS[name] = new xpBox( obj,x?x:0,y?y:0, w?w:0,h?h:0,border?border:0,bg?bg:0,speed?speed:0,opacity?opacity:0);
	xpGLOBALS[name] .setContent(con);
	return obj;
}
function xpBox(obj,x,y,w,h,border,bg,speed,opacity,zIndex)
{
	if(!obj) return;
	this.obj = obj;
	this.speed=!speed?350:speed;
	this.x=(!x)?-1:x;
	this.y=(!y)?-1:y;
	this.w=(!w)?-1:w;
	this.h=(!h)?-1:h;
	this.border = (!border)?10:border;
	this.bg = (!bg)?"#d8d9da":bg;
	this.opacity = (!opacity)?0.8:opacity;
	this.outer = this.obj+"_outer";
	this.outerID = xpWindow.createDiv(this.outer);
	this.outerID.style.visibility="hidden";

	this.inner = this.obj+"_inner";
	this.innerID = xpWindow.createDiv(this.inner);
	this.innerID.style.position="absolute";
	
	this.innerID.style.visibility="hidden";	
	if(zIndex && parseInt(zIndex))
		this.zIndex = parseInt(zIndex);
//need intercept move handle without upset already hooked handle 
//	this.drop=function(){
//		alert(miceX+'='+miceY)
//	}
//	var _this = this
//	this.drag=function(){
//		_this.move = true;
//		_this.pickX = miceX ;
//		_this.pickY = miceY ;
//		_this.outerID.onmouseup = _this.drop;
//	}

	
	this.setContent=function(con, hide){
		
		this.innerID.style.width="auto";
		this.innerID.style.height="auto";
		this.innerID.innerHTML=con;
		var s = xpWindow.findSizeWH(this.innerID);
		var w=(this.w==-1)?s.w:this.w;			
		var h=(this.h==-1)?s.h:this.h;

		var c = xpWindow.findWindowCenter();
		var x=(this.x==-1)?(1*c.x - (w*1)/2):this.x;
		var y=(this.y==-1)?(1*c.y - (h*1)/2):this.y;
		x=(x<this.border)?this.border:x
		y=(y<this.border)?this.border:y
		this.outerID.style.position="absolute";
		//this.outerID.style.zIndex= -1 ;
		this.outerID.style.left=(1*x-this.border)+"px";
		this.outerID.style.top=(1*y-this.border)+"px";
		this.outerID.style.width =(1*w+ 2*this.border)+"px";
		this.outerID.style.height =(1*h+ 2*this.border)+"px";
		this.outerID.style.background ='#829c9c';
//		this.outerID.style.cursor ='move';
//		this.outerID.onmousedown = this.drag;
		if(this.zIndex)
		 	this.outerID.style.zIndex =this.zIndex;
		
		xpWindow.opacity(this.outerID,this.opacity*100);


		//this.outerID.style.zIndex =30000;
		/*mask for bl**d ie6's <select> */
		/* */this.outerID.innerHTML='<!--[if lte IE 6.5]><iframe style="left:0px;top:0px;width:'+(1*w+2*this.border)+'px; height:'+(1*h+2*this.border)+'px; position:absolute; display:none;display:block;z-index:-1; 	filter:mask();" ></iframe><![endif]--> ' 
		this.innerID.style.position="absolute";
		this.innerID.style.left=(x*1 )+"px";
		this.innerID.style.top=(y*1 )+"px";
		this.innerID.style.width =(w*1)+"px";
		this.innerID.style.height =(h*1)+"px";
		this.innerID.style.background ='#fff' //this.bg;
		if(this.zIndex)
		 	this.innerID.style.zIndex =this.zIndex+1;
		//this.innerID.style.border="1px #789 solid;"
		//xpWindow.opacity(this.innerID,100);	
		//this.innerID.style.zIndex =30001;

		if(!hide){
			this.outerID.style.visibility="visible";
			
			this.innerID.style.visibility="visible";
			//this.innerID.style.display="";
		
			xpWindow.EF(this.innerID,speed);

//			this.innerID.style.visibility="visible";
		}
	}
	this.getContainer=function(){
		return this.innerID;
	}
	
	this.hide=function(s,v){
		this.outerID.style.visibility="hidden";
		this.innerID.style.visibility="hidden";
		this.innerID.style.display="none";
	}
	this.setStyle=function(s,v){
		eval('this.outerID.style.'+s+' ="'+ v+'"');
		eval('this.innerID.style.'+s+' ="'+ v+'"');
	}
	this.stop=function(){
		xpWindow.removeDiv(this.innerID);		
		xpWindow.removeDiv(this.outerID);	
		eval(this.obj+'=null;');
	}
}
//name alias
var xpDiv = xpBox;

//renewed xpBox
function popBox(x,y,w,h,border,bg,speed,opacity)
{
	speed=!speed?350:speed;
	x=(!x)?-1:x;
	y=(!y)?-1:y;
	w=(!w)?-1:w;
	h=(!h)?-1:h;
	border = (!border)?10:border;
	bg = (!bg)?"#4F6F6F":bg;
	opacity = (!opacity)?0.8:opacity;
	var name = "xp_pop_up_" + Math.random();
	
	var outer = name +"_outer";
	var outerID = xpWindow.createDiv(outer);
	outerID.style.visibility="hidden";

	var inner = name+"_inner";
	var innerID = xpWindow.createDiv(inner);
	innerID.style.position="absolute";
	innerID.style.visibility="hidden";	

	outerID.data ={name:outer,outer:outerID,inner:innerID,x:x,y:y,w:w,h:h,opacity:opacity,border:border,background:bg,speed:speed}
	outerID.setContent=function(con, hide){
		this.data.inner.style.width="auto";
		this.data.inner.style.height="auto";
		this.data.inner.innerHTML=con;
		var s = xpWindow.findSizeWH(this.data.inner);
		
		
		var w=(this.data.w==-1)?s.w:this.data.w;			
		var h=(this.data.h==-1)?s.h:this.data.h;

		var c = xpWindow.findWindowCenter();
		var x=(this.data.x==-1)?(1*c.x - (w*1)/2):this.data.x;
		var y=(this.data.y==-1)?(1*c.y - (h*1)/2):this.data.y;
		x=(x<this.data.border)?this.data.border:x
		y=(y<this.data.border)?this.data.border:y

		//this.outerID.style.zIndex =30000;
		/*mask for bl**d ie6's <select> */
		this.data.inner.style.position="absolute";
		this.data.inner.style.left=(x*1 )+"px";
		this.data.inner.style.top=(y*1 )+"px";
		this.data.inner.style.width =(w*1)+"px";
		this.data.inner.style.height =(h*1)+"px";
		this.data.inner.style.background ='#fff' //this.bg;
		//this.innerID.style.border="1px #789 solid;"
		//xpWindow.opacity(this.innerID,100);	
		//this.innerID.style.zIndex =30001;
			
		this.data.outer.style.position="absolute";
//		//this.outerID.style.zIndex= -1 ;
		this.data.outer.style.left=(1*x-this.data.border)+"px";
		this.data.outer.style.top =(1*y-this.data.border)+"px";
		this.data.outer.style.width  =(1*w+ 2*this.data.border)+"px";
		this.data.outer.style.height =(1*h+ 2*this.data.border)+"px";
		this.data.outer.style.background = this.data.background;
		xpWindow.opacity(this.data.outer,this.data.opacity*100);
		/**/this.data.outer.innerHTML='<!--[if lte IE 6.5]><iframe style="left:0px;top:0px;width:'+(1*w+2*this.data.border)+'px; height:'+(1*h+2*this.data.border)+'px; position:absolute; display:none;display:block;z-index:-1;	filter:mask();" ></iframe><![endif]--> ' 


		if(!hide){
			this.data.outer.style.visibility="visible";
			
			this.data.inner.style.visibility="visible";
		
			xpWindow.EF(this.data.inner,this.data.speed);

//			this.innerID.style.visibility="visible";
		}
	}
	
	outerID.getContent=function(){
		return this.data.inner.innerHTML;
	}
	
	outerID.hide=function(s,v){
		this.data.outer.style.visibility="hidden";
		this.data.inner.style.visibility="hidden";
	}
//	outerID.setStyle=function(s,v){
//		eval('this.outerID.style.'+s+' ="'+ v+'"');
//		eval('this.innerID.style.'+s+' ="'+ v+'"');
//	}
	outerID.stop=function(){
		xpWindow.removeDiv(this.data.inner);		
		xpWindow.removeDiv(this.data.outer);	
	}
	return outerID ;
}

/*
make a div'conner become round
	@id		:div's id (=$('theDiv')
	@r		:radius
	@bd		:border's color
	@bg		:background color
*/
function xpRoundConnerById(id,r,bd,bg,opacity,ext)
{
	var xy=	xpWindow.findPositionXY(id)
	var size=xpWindow.findSizeWH(id)
	var content = id.innerHTML;
	id.style.padding="0";
	id.style.margin="0";
	var idName = id.id;
	var bgcolor = id.style.backgroundColor;
	var color = id.style.color;
	var bdcolor = id.style.borderColor;
	if(!r) r = 8;
	opacity=!opacity?1:opacity;
	opacity = opacity/r;
	ext = !ext?0:ext;
	if(!bd) bd=bdcolor;
	if(!bg) bg=bgcolor;
	//var background = id.style.background;
	//if(background) {bd = bg = background; };
	//if(bd.indexOf('gb(')>0) { bd = bd.substr(0,bd.indexOf(')')+1);	} //ff returen bdColor as rgb,rgb,rgb,rgb
	id.style.backgroundColor = id.parentNode.style.backgroundColor;
	id.style.borderColor = id.parentNode.style.backgroundColor;
	id.style.background = '';
	var d = new Date()
	var newName = idName+d.getTime();
	id.id = newName;	//change id ,save for new div
	var innerDiv='';
	var dy=r;
	var dx=0
	for(var i=0;i<=r;i++){
		if(dx>dy){	dx=i;  dy=Math.round(Math.sqrt(r*r-i*i));}
			else {  dy=r-i;dx=Math.round(Math.sqrt(r*r-dy*dy));}
		innerDiv = innerDiv + '<div style="position:absolute; left:'+(r-dx)+'px;top:'+(r-dy)+'px;width:'+(size.w-2*r+2*dx+ext)+'px;height:'+(size.h-2*(r-dy))+'px;margin: 0 0 0 0; padding:0 0 0 0; background:'+bd+';opacity: '+opacity+'; filter: alpha(opacity='+(opacity*100)+') "></div>'
	}
	innerDiv = innerDiv +'<div id="'+idName+'" style="position:absolute; left:'+r+'px;top:'+r+'px;width:'+(size.w-2*r)+'px;height:'+(size.h-2*r)+'px;  background:'+bg+';"></div>'
	innerDiv = '<div style="position:relative; left:0px;top:0px;width:'+(size.w)+'px;height:'+(size.h)+'px; ">'+innerDiv+'</div>'
	id.innerHTML = innerDiv;
	var newID = $(idName);
	newID.innerHTML = content;
	return newID;
}


/*roundDiv create html string 
 *	@id		:selfname,required div's id name
 *	@x		:x of upper left conner
 *	@y		:y of upper left conner
 *  @w		:div width
 *  @h		:div height
 *  @r		:round conner 's radius
 *	@bg		:background color
 *
 *	Usage	: box = new xpRoundDiv("myBox",200,200,30,60)
 */
function xpRoundDiv(idname,x,y,w,h,r,bg,ext)
{
	if(!bg) bg="#425c5c";	//lightblue
	if(!r) r=20;
	this.idname =idname;		//id name, not document.id
	
	
	//this.container = this.id+"_container";
	
	var logoDiv = document.createElement('div');
	logoDiv.setAttribute('id',this.idname);	
	//funcking ie dose not able use info set in setAttribute;  except z-index
	//this.logoDiv.setAttribute('style','z-index:20000; position:absolute; left:'+x+'px;top:'+y+'px;width:'+w+'px;height:'+h+'px;margin: 0 ; padding:0;  ');
	//logoDiv.setAttribute('style','z-index:30000;');
	document.body.appendChild(logoDiv);
	
	this.id = $(this.idname);
	this.id.style.position="absolute"
	this.id.style.padding="0px"
	this.id.style.margin="0px"
	this.id.style.left=x+"px"
	this.id.style.top=y+"px"
	this.id.style.width=w+"px"
	this.id.style.height=h+"px"
	this.id.innerHTML=' '
	ext=!ext?0:ext;
	this.nid = xpRoundConnerById(this.id,r,bg,bg,0.9,ext);

	this.setContent=function(con){
		this.nid.innerHTML = con;
	}
	this.stop=function(){
		this.id.parentNode.removeChild(this.id);
		setTimeout('delete('+this.idname+')',1)
	}
	this.div = function (){
		return this.nid
	}

}

/* a few popup window
	thanks to IE, we have do this ourself!!
	@type 		:0=alert,1=confirmatin, 2=prompt(text input), 3=textArea input
	@obj 		:objself's name
	@title		:showed title
	@ok;cancel 	:callback on ok or cancel  
*/	

function xpPop(title,ok,cancel,type)	
{
	title=title?title:'';
	type=!type?0:type;

	var d = new Date();
	var name = "xpPop"+d.getTime();
	var obj = 'xpGLOBALS["'+name+'"]';
		
	ok=(ok?ok:'') + ';'+obj+'.stop()';

	cancel=(cancel?cancel:'') + ';'+obj+'.stop()';

	var div='<center><b>'+ title +'</b>';
		div +=(type==2?'<br/><input type="text" id="xpPopText" style="width:200px;"/><br/>':(type==3?'<textarea id="xpPopText" style="width:460px; height:220px;">':''));
		div +=''
		div +=(type==0?'':'')
		div +='';
		var box = xpGLOBALS[name] = new xpBox(obj);
		box.setContent(div);
		return box;
}

//type: 0=alert; 1=prompt; 2=input;
function xpPopDiv(obj,title,callback,callback_cancel,type)	
{
	this.type=!type?0:type;
	var height=[80,80,100,300];		
	var width=[300,300,300,500];	
	var div='<center><b>'+ title +'</b><br/>';
		div +=(type==2?'<input type="text" id="xpPopText"  /><br/>':(type==3?'<textarea id="xpPopText" style="width:460px; height:220px;"></textarea><br/>':''));
		div +='<input type="button" onclick="'+obj+'.OK()" value="OK" />'
		div +=(type==0?'':'<input type="button" onclick="'+obj+'.Cancel()" value="Cancel" />')
		div +='</center>';
	this.obj=obj
	this.callback=callback;
	this.callback_cancel=(!callback_cancel)?callback:callback_cancel;
	var hh=height[type];
	var ww=width[type];
	//var win = new xpWindow();
	var winP = xpWindow.findWindowCenter();
	this.box=new xpRoundDiv("xpPopDivEdit",winP.x-ww/2,winP.y-hh/2,ww,hh-20,1,40);
	//this.box=new xpCenterDiv("xpPopDivEdit",ww,hh,15,'#425c5c');
	this.box.div().style.backgroundColor="#eee";
	this.box.div().style.border="15px #829c9c solid";
	this.box.div().style.padding="10px 0 0 0";
	$('xpPopDivEdit').innerHTML = div; 	

	this.OK=function (){
		if(this.callback){
			if(this.type>1) this.msg = $('xpPopText').value;
			eval(this.callback) 
		}else{
			this.stop()
		}
	}
	this.Cancel=function (){
		eval(this.callback_cancel) 
	}
	this.stop=function(){
		this.box.stop();
		setTimeout('delete('+this.obj+')',1)		
	}
}





/* 
*/
function xpLB(x,y,w,h,close,speed,wait)
{	

	speed = speed?speed/100: 25
	var mask = xpMG(null,0.85,'#000')
	var name = "xplb" + Math.random();
	var outer = name +"_outer";
	var outerID = xpWindow.createDiv(outer);
	outerID.style.visibility="hidden";
	outerID.style.background = '#FFF';


	var innerID = xpWindow.createDiv(name+"_inner");
	innerID.style.position="absolute";
	if(wait){
		innerID.style.backgroundImage="url("+wait+")";
		innerID.style.backgroundPosition="50% 50%";
		innerID.style.backgroundRepeat="no-repeat";
	}//w$.opacity(innerID,0)

	var tempID = xpWindow.createDiv(name+'_temp');
	tempID.style.position="absolute";
	tempID.style.visibility="hidden";
	tempID.style.width="auto";
	tempID.style.height="auto";	
	//tempID.style.border="1px #f00 solid";	
	w$.opacity(tempID,0)

	
	outerID.data ={mask:mask,name:outer,outer:outerID,inner:innerID,temp:tempID, ox:x,oy:y,ow:w,oh:h,x:x,y:y,w:w,h:h,close:close,timer:null}

	outerID.setContent=function(con,close){
		outerID.data.stop = 0;
		//w$.opacity(this.data.inner,0)
		this.data.temp.innerHTML=con;


		
		var s = xpWindow.findSizeWH(this.data.temp);
		this.data.inner.style.width="auto";
		this.data.inner.style.height="auto";
		this.data.inner.style.visibility="visible";

		var w=(this.data.ow==null)?s.w:this.data.ow;			
		var h=(this.data.oh==null)?s.h:this.data.oh;

		var c = xpWindow.findWindowCenter();
		var x=(this.data.ox==null)?(1*c.x - (w*1)/2):this.data.x;
		var y=(this.data.oy==null)?(1*c.y - (h*1)/2):this.data.y;

		this.data.w0 = this.data.w0 == null ? 70:this.data.w0;
		this.data.h0 = this.data.h0 == null ? 50:this.data.h0;
		
		this.data.data = con;
		this.data.inner.style.position="absolute";
		this.data.left = parseInt(c.x-this.data.w0/2);
		 this.data.inner.style.left = this.data.left +"px";
		this.data.top = parseInt(c.y-this.data.h0/2);
		this.data.inner.style.top = this.data.top+"px";
		this.data.inner.style.width =this.data.w0+"px";
		this.data.inner.style.height =this.data.h0+"px";
		this.data.inner.style.backgroundColor ='#fff' //this.bg;
		this.data.outer.style.position="absolute";
		this.data.outer.style.left =this.data.left-10+"px";
		this.data.outer.style.top =this.data.top-10+"px";
		this.data.outer.style.width  =20+this.data.w0+"px";
		this.data.outer.style.height =20+this.data.h0+"px";

		this.data.outer.style.visibility="visible";	
	//	this.data.outer.style.backgroundImage='url(img/wait_s.gif)'	
		this.data.outer.style.backgroundRepeat='no-repeat'	
		this.data.outer.style.backgroundPosition='50% 50%'		
		if(close||this.data.close){
			var level =this.data.close = close|| this.data.close;
			this.data.temp.innerHTML   = '<a alt="no/stop/cancel !" title="no/stop/cancel !" id="'+this.data.name+'_cancel'+'"  onmouseover="this.style.color=\'#fff\' "    onmouseout="this.style.color=\'#888\'; "    style="cursor:pointer;font-family:verdana,arial;font-weight:bold;display:block;padding:3px 6px;            color:#888;float:right; margin-top:3px;" >&times;</a>'
			this.data.temp.innerHTML += '<a  alt="yes/ok/submit !" title="yes/ok/submit !" id="'+this.data.name+'_ok'+'"       onmouseover="this.style.color=\'#eee\' "  onmouseout="this.style.color=\'#666\'; "    style="cursor:pointer;font-family:verdana,arial;font-weight:bold;display:block;padding:6px 6px 3px 6px;color:#666;float:right;font-size:0.6em;visibility:'+(level>1?'visible':'hidden')+'" >&radic;</a>'
			this.data.temp.innerHTML += '<a id="'+this.data.name+'_close'+'" onmouseover="this.style.color=\'#fff\' "  onmouseout="this.style.color=\'#777\'; "  style="cursor:pointer;font-family:verdana,arial;font-weight:bold;font-size:0.6em;display:block;padding:3px 6px;color:#777;float:right;visibility:'+(level>2?'visible':'hidden')+'" >_</a>'
			this.data.temp.style.backgroundColor = '#111';
			w$.opacity(this.data.temp,100);
		}else{
			this.data.temp.innerHTML='';
		}
		this.data.w = w 
		this.data.h = h

		this.data.x = x
		this.data.y = y
		this.data.opacity = 100;
		this.data.dx =/*(w-this.data.w0<0)?-1:1;//*/ ( (Math.abs(w-this.data.w0)<1)?0:((w - this.data.w0)/5) )	
		this.data.dy =/*(h-this.data.h0<0)?-1:1;//*/ ( (Math.abs(h-this.data.h0)<1)?0:((h - this.data.h0)/5))	
		if(this.data.timer)  clearTimeout(this.data.timer)
		this.data.step=0;
		setTimeout(w$.PF(this.settle,this) ,1);

		var newdiv = document.createElement("div");
		newdiv.style.position = 'relative';

		//newdiv.innerHTML = con;
//		var container = document.getElementById("container");
//		container.appendChild(newdiv);
		this.data.inner.innerHTML='';
		this.data.inner.appendChild(newdiv);
		this.data.con = con
		//this.data.inner.innerHTML = con;
		
	}

	outerID.settle=function(x){
		x.settlex(x)
	}
	outerID.settlex=function(x){
	
			if((x.data.w0 < x.data.w && x.data.dx > 0) ||(x.data.w0+x.data.dx > x.data.w && x.data.dx < 0) )
			//while((x.data.w0 < x.data.w && x.data.dx > 0) ||(x.data.w0+x.data.dx > x.data.w && x.data.dx < 0) )
			{
				x.data.w0+=x.data.dx;
				x.data.inner.style.width =parseInt( x.data.w0)+ "px";
				x.data.outer.style.width = parseInt(x.data.w0)+20+ "px";
				x.data.left -= x.data.dx/2
				if(x.data.left <10) x.data.left=10
				x.data.inner.style.left = parseInt(x.data.left) +"px"
				x.data.outer.style.left = parseInt(x.data.left)-10 +"px"
				x.data.timer = setTimeout(w$.PF(x.settlex,x) ,1);
				return;
			}else/*
			//alert(1)
			if(1)*/{
				x.data.inner.style.width = x.data.w+ "px";
				x.data.outer.style.width = x.data.w+20+ "px";
				x.data.step=1;
				x.settley(x)
			}
	}	
	outerID.settley=function(x){
			//height control
			if((x.data.h0 < x.data.h && x.data.dy >0 ) ||(x.data.h0+x.data.dy >x.data.h && x.data.dy <0 ))
			//while((x.data.h0 < x.data.h && x.data.dy >0 ) ||(x.data.h0+x.data.dy >x.data.h && x.data.dy <0 ))
			{
				x.data.h0+=x.data.dy;
				x.data.inner.style.height =parseInt( x.data.h0)+ "px";
				x.data.outer.style.height = parseInt(x.data.h0)+20+ "px";
				x.data.top -= x.data.dy/2
				if(x.data.top<10) x.data.top = 10
				x.data.inner.style.top =parseInt( x.data.top) +"px"			
				x.data.outer.style.top = parseInt(x.data.top)-10 +"px"			
				x.data.timer = setTimeout(w$.PF(x.settley,x) ,1);
				return;
			}else/*
			if(1)*/{
				x.data.inner.style.height = x.data.h+ "px";
				x.data.outer.style.height = x.data.h+20+ "px";
				x.data.step=2
				x.settleo(x)
			}
	}	
	outerID.settleo=function(x){
		x.data.inner.childNodes[0].innerHTML = x.data.con;
			//close control
			if(x.data.close && x.data.temp.style.visibility=='hidden'){
				var s = w$.s(x.data.inner)
				x.data.temp.style.left = parseInt(x.data.left -10)+"px";
				x.data.temp.style.top = parseInt(x.data.top+s.h)+10+"px";
				x.data.temp.style.width = parseInt(x.data.w)+20+"px";
				x.data.temp.style.borderBottom = "1px #333 solid";
				//$(x.data.name+'_ok').onclick = function(){ x.stop(2);}
				$(x.data.name+'_cancel').onclick = function(){ x.stop(1);}	
				//$(x.data.name+'_close').onclick = function(){ x.stop(3);}
				x.data.temp.style.visibility = 'visible';
			}else{
				x.data.step =3
				x.settles(x);
			}
	}
	outerID.settles=function(x){
		w$.opacity(x.data.inner,100)
		w$.opacity(x.data.temp,100)
		x.data.mask.resize();
	}
	outerID.getContent=function(){
		return this.data.inner.innerHTML;
	}
	outerID.resize=function(){
		this.setContent(this.getContent());
	}
	innerID.resize=function(){
		var id = this.id.split('_');
		var outer = id[0]+'_outer';
		$(outer).resize();
	}
	outerID.stop=function(act){
		if(this.data.stop) return;
		xpWindow.removeDiv(this.data.inner);		
		xpWindow.removeDiv(this.data.outer);	
		xpWindow.removeDiv(this.data.temp);	
		this.data.stop=1		
		this.data.mask.stop();
		if(act==2 && this.ok){ this.ok(); return;}
		if(act==1 && this.cancel){this.cancel();return;}
		if(act==3 && this.hide){this.hide();return;}

	}
	return outerID ;
}


/* cast shadow for div 
	@is		:div's id =$('id_name')
	@conner	:shadowed conner: as 0=se,1=sw,2=nw, 3=ne
	@width	:shadow width
	@dark	:start color
	@dir	:0= dark to light; 1=light to dark
*/
function xpShadow(id,conner,width,dark,dir)
{
	var p = w$.findPositionXY(id);
	var s = w$.findSizeWH(id);
	conner = (!conner)?0:conner;
	width = (!width)?3:width;
	dark = (!dark)?170:dark;
	dir = (!dir)?256:dir;
	switch(conner)		{
		case 0:	dx=1; dy=1; x=p.x+s.w;y=p.y+s.h;break; 
		case 1:	dx=-1; dy=1;x=p.x;    y=p.y+s.h;break; 
		case 2:	dx=-1;dy=-1;x=p.x;    y=p.y;    break; 
		case 3:	dx=1;dy=-1; x=p.x+s.w;y=p.y;    break; 
	}
	var t=parseInt((dir - dark)/width);
	for(i=0;i<width;i++)
	{
		var sdy = w$.createDiv('shadow_y'+i);
			sdy.style.position = "absolute";
			sdy.style.borderWidth="0px";
			sdy.style.left = x+i*dx +"px";
			sdy.style.top =  p.y+width*dy +"px";
			sdy.style.width=1+"px";
			sdy.style.height=s.h-(width-i)*dy+"px";
			sdy.style.background = "rgb(" + (dark+t*i) + "," + (dark+t*i) + "," + (dark+t*i)+" )";	
			w$.opacity(sdy,50)			
			var sdx = w$.createDiv('shadow_x'+i);
			sdx.style.position = "absolute";
			sdx.style.left = p.x+width*dx +"px";
			sdx.style.top =  y+i*dy-1 +"px";
			sdx.style.width=s.w-(width-i)*dx+"px";
			sdx.style.height=1+"px";
			sdx.style.background = "rgb(" + (dark+t*i) + "," + (dark+t*i) + "," + (dark+t*i)+" )";
			w$.opacity(sdx,50)	
	}
	
}

/* create shadow for text such p or scan. best apply on parent div
	@id			:element
	@offset		:shadow offset(*note y =x+1;
	@color		:shadow color 
*/
function xpShadowWord(id,color,offset)
{
	offset=(!offset)?2:offset;
	color=(!color)?"#ddd":color;
	var s = w$.findSizeWH(id)
	var p = w$.findPositionXY(id);
	var type=id.tagName;
	var zi = id.style.zIndex ;
	var fcolor = id.style.color;
	var content = id.innerHTML;
	var cl = id.className;
	zi=!zi?0:zi;
	//w$.opacity(id,50);
	id.style.color=color;
	id1 = xpWindow.createElement('shadowWord',type);
	id1.style.zIndex = zi +1;
	id1.style.position = 'absolute';
	id1.className =cl;
	id1.style.left = 1*(p.x-offset)+"px";
	id1.style.top = 1*(p.y-offset*2)+"px";
	id1.style.width = s.w+"px";
	id1.style.height = s.h+"px";
	id1.style.color = fcolor;
	id1.innerHTML =content;
}	
/* creative float div beside a given element
	@obj		: given element
	@id			: name of id will use for float div
	
	@xpFloatStop: stop float div
*/	
function xpFloat(obj,id,dx,dy)
{
		if(!id) id = 'xpFloatDiv';
		var objXY = w$.findPositionXY(obj);

		var objWH = w$.findSizeWH(obj);
		var objCxy = w$.findCenterXY(obj);
		var wCxy = w$.findWindowCenter();

		var myid = w$.createDiv(id);

		myid.style.position = "absolute";
		myid.style.left = objXY.x + (dx?dx:0) +"px";
		myid.style.top = objXY.y+objWH.h  + (dy?dy:0) + 1 +"px";
		//myid.style.zIndex = 111000;
		return myid;
}

function xpFloatStop(id)
{
	//alert(id);
	if(!id) id =document.getElementById('xpFloatDiv');
	w$.removeElement($(id));
}

//show hint beside the field( obj ),dispeared on mouse out!
function xpHint(el,hint,idname)
{
	var d = new Date()
	
	idname = !idname?'xpHint_div' : idname
//	var id = xpFloat(el,idname);
	var id = $(idname) 
	id = !id ? w$.createDiv(idname) : id ;
	id.style.position='absolute'	
	//id.style.visibility = 'hidden';
	w$.opacity(id,0);
	id.innerHTML='<div style="background:#fff;border-top:1px solid #ada; border-left:1px solid #ada;border-right:2px solid #6a6;border-bottom:2px solid #6a6;margin:2px;padding:3px 5px;"><pre>'+hint+'</pre></div>';
	var cw = w$.wc();
	var cp =w$.wp();
	var hs = w$.s(id);
	var ep = w$.p(el);
	var es = w$.s(el);
	if(hs.w+3 < ep.x -cp.x)	var left = ep.x+es.w - hs.w  
	else		var left = ep.x
	if(hs.h + 3  > ep.y - cp.y)	var top = ep.y+es.h+3
	else		var top =ep.y-hs.h  -3	
	id.style.top = top +'px';
	id.style.left = left +'px';
	//w$.EF(id);
	w$.fade(id,1);
	id.stop = function(){
		w$.EFC(id,0,1);
		//w$.fade(id,0); //this will cause block ; since it not close(minimize/delete) div
	}
	el.onmouseout = id.stop
}



/*upload file using iframe 
	@formID 	: form's id
	@callback	: called when upload finish
*/

function xpIframeUpload(formID,callback) {
	var wrap = $('xp_iframe_wrap') ? $('xp_iframe_wrap') : w$.createDiv('xp_iframe_wrap')  
	wrap.style.display="none";
	var flag =  $('xp_iframe_data')?$('xp_iframe_data') : xpWindow.createDiv('xp_iframe_data');
	//flag.style.display="none";
	flag.innerHTML='yes';
	$('xp_iframe_wrap').innerHTML = '<iframe onload="if($(\'xp_iframe_data\').innerHTML != \'yes\'){ $(\'xp_iframe_data\').innerHTML=\'yes\'; '+callback+'; }else{ $(\'xp_iframe_data\').innerHTML=12345 ;}   " id="xpIframeUploadFrame" name="xpIframeUploadFrame"></frame>' 
    	$(formID).target = 'xpIframeUploadFrame'; // 
   	setTimeout("$('"+formID+"').submit()",1)
	
}


/**
  *	fake ajax througt hidden iframe ;give a old trick a new means!
  * 	@formID 	: form's id or form element
  *	@callback	: called when upload finish
  *   	* note somehow this.form.target unable set  in some case so use getElementById().target
  *	modified : 2008-09-28
  */	
function iPost1(form,callback){
	var action = form.action ? form.action :'';
	XPX(0,2,action,form,callback);
} 

function iPost(form,callback){
	var name = 'xpPost_';
	var iFrame = $(name+'_div') ? $(name+'_div') : w$.createDiv(name+'_div')  
	iFrame.style.visibility ='hidden';
	iFrame.flag = 0;
   	iFrame.load=function(){
   		if(!iFrame.flag){
   			iFrame.flag = 1
   			 form.submit(); 

    		return
    	}
    	var con = w$.iframeDocument($(name+'_frame')).body.innerHTML   
		setTimeout(w$.PF(callback,con),1);
	//	setTimeout(function(){w$.removeElement(iFrame )},5)
    }
    form.target = name+'_name';
   	iFrame.innerHTML = '<iframe lang="utf-8" style="visibility:hidden;height:1px;width:1px; z-index:500000"  id="'+name+'_frame"  name="'+name+'_name" onload="$(\''+name+'_div\').load()"></frame>' 
} 






/**
  * 2006-10-08 xpw365@gmail.com
  *open cs editor in div 
 */
function xpEditing(el,text,save)
{
	var p = w$.p(el);
	var s = w$.s(el);
	var id = el.id;
	var name = id + Math.random();
	text=text?text:el.innerHTML;
	el.innerHTML='<div id="'+name+'_ctrl">&nbsp;</div>' //&nbsp; make sure not to close div
	
 	/* prepare color data: 	*******************/
 	var colors=["AliceBlue","AntiqueWhite","Aqua","Aquamarine","Azure","Beige","Bisque","Black","BlanchedAlmond","Blue","BlueViolet","Brown","BurlyWood","CadetBlue","Chartreuse","Chocolate","Coral","CornflowerBlue","Cornsilk","Crimson","Cyan","DarkBlue","DarkCyan","DarkGoldenRod","DarkGray","DarkGrey","DarkGreen","DarkKhaki","DarkMagenta","DarkOliveGreen","Darkorange","DarkOrchid","DarkRed","DarkSalmon","DarkSeaGreen","DarkSlateBlue","DarkSlateGray","DarkSlateGrey","DarkTurquoise","DarkViolet","DeepPink","DeepSkyBlue","DimGray","DimGrey","DodgerBlue","FireBrick","FloralWhite","ForestGreen","Fuchsia","Gainsboro","GhostWhite","Gold","GoldenRod","Gray","Grey","Green","GreenYellow","HoneyDew","HotPink","IndianRed ","Indigo ","Ivory","Khaki","Lavender","LavenderBlush","LawnGreen","LemonChiffon","LightBlue","LightCoral","LightCyan","LightGoldenRodYellow","LightGray","LightGrey","LightGreen","LightPink","LightSalmon","LightSeaGreen","LightSkyBlue","LightSlateGray","LightSlateGrey","LightSteelBlue","LightYellow","Lime","LimeGreen","Linen","Magenta","Maroon","MediumAquaMarine","MediumBlue","MediumOrchid","MediumPurple","MediumSeaGreen","MediumSlateBlue","MediumSpringGreen","MediumTurquoise","MediumVioletRed","MidnightBlue","MintCream","MistyRose","Moccasin","NavajoWhite","Navy","OldLace","Olive","OliveDrab","Orange","OrangeRed","Orchid","PaleGoldenRod","PaleGreen","PaleTurquoise","PaleVioletRed","PapayaWhip","PeachPuff","Peru","Pink","Plum","PowderBlue","Purple","Red","RosyBrown","RoyalBlue","SaddleBrown","Salmon","SandyBrown","SeaGreen","SeaShell","Sienna","Silver","SkyBlue","SlateBlue","SlateGray","SlateGrey","Snow","SpringGreen","SteelBlue","Tan","Teal","Thistle","Tomato","Turquoise","Violet","Wheat","White","WhiteSmoke","Yellow","YellowGree"];
	fc='<select id="fcolor" name="fcolor" class="color" style="background:'+colors[0]+'" onchange="$(\''+id+'\').cmd(\'ForeColor\',this.value);this.style.backgroundColor=this.value;">';
	for(i=0;i<colors.length;i++) fc +='<option value="'+colors[i]+'" style="background:'+colors[i]+';">'+colors[i]+'</option>'; 
	fc+='</select>';
	bc='<select id="bcolor" name="bcolor" class="color" style="background:'+colors[0]+'" onchange="$(\''+id+'\').cmd(\'BackColor\',this.value);this.style.backgroundColor=this.value;">';
	for(i=0;i<colors.length;i++) bc +='<option value="'+colors[i]+'" style="background:'+colors[i]+';">'+colors[i]+'</option>';
	bc+='</select>';

	var fonts=["Arial","Arial black","Courier new","Impact","Script","Symbol","system","Verdana","Webdings","Wingdings","Wingdings 2","Wingdings 3"];
	var font='<select style="width:120px" onchange="$(\''+id+'\').cmd(\'fontname\',this.value);">';
	for(var i=0;i<fonts.length;i++) font += '<option value="'+fonts[i]+'" style="font-family:'+fonts[i]+';">'+fonts[i]+': abcABC </option>';	
	font+='</select>';
	var htmla=	''
			+'<style>a.xpEditCtrl{border:1px #eee solid;margin:1px;padding:1px 4px;display:block;float:left;};a.xpEditCtrl:hover{color:#ff0;};</style>'
			+'<table width="100%" ><tr align=center><td align="left">'
			+'Controls:</td><td colspan="2">'
			+'<a class="xpEditCtrl" href="javascript:void(0)" title="bold" onclick="$(\''+id+'\').cmd(\'Bold\',0)"><b>B</b></a>'
			+'<a class="xpEditCtrl" href="javascript:void(0)" title="italic"  onclick="$(\''+id+'\').cmd(\'Italic\',0)"><i>I&nbsp;</i></a>'
			+'<a class="xpEditCtrl" href="javascript:void(0)" title="underline"  onclick="$(\''+id+'\').cmd(\'Underline\',0)"><u>U</u></a>'
			+'<a class="xpEditCtrl" href="javascript:void(0)" title="super_script"  onclick="$(\''+id+'\').cmd(\'superscript\',0)">&uarr;</a>'
			+'<a class="xpEditCtrl" href="javascript:void(0)" title="sub_script"  onclick="$(\''+id+'\').cmd(\'subscript\',0)">&darr;</a>'
			+'<a class="xpEditCtrl" href="javascript:void(0)" title="clear format"  onclick="$(\''+id+'\').cmd(\'RemoveFormat\',0)">&Oslash;</a>'
			+'<a class="xpEditCtrl" href="javascript:void(0)" title="left"  onclick="$(\''+id+'\').cmd(\'Justifyleft\',0)">&larr;</a>'
			+'<a class="xpEditCtrl" href="javascript:void(0)" title="center"  onclick="$(\''+id+'\').cmd(\'JustifyCenter\',0)">&rsaquo;=&lsaquo;</a>'
			+'<a class="xpEditCtrl" href="javascript:void(0)" title="right" onclick="$(\''+id+'\').cmd(\'JustifyRight\',0)">&rarr;</a>'
			+'<a class="xpEditCtrl" href="javascript:void(0)" title="just full" onclick="$(\''+id+'\').cmd(\'JustifyFull\',0)">&hArr;</a>'
			+'<a class="xpEditCtrl" href="javascript:void(0)" title="link"  onclick="$(\''+id+'\').lnk()">Link</a>'
			+'<a class="xpEditCtrl" href="javascript:void(0)" title="unlink"  onclick="$(\''+id+'\').cmd(\'Unlink\',0)"><del>Link</del></a>'
			+'<a class="xpEditCtrl" href="javascript:void(0)" title="horizontal line" onclick="$(\''+id+'\').cmd(\'InsertHorizontalRule\',0)">&mdash;</a>'
			+'<a class="xpEditCtrl" href="javascript:void(0)" title="block"  onclick="$(\''+id+'\').cmd(\'FormatBlock\',\'span\')">[-]</a>'
			+'</td><td align="left">'
			+'Foreground Color:</td><td align="left">'+fc+'</td><td align="left">'
			+'</tr><tr>'
			+'<td align="left">Font:</td><td align="left">'+font+'</td>'
			+'<td align="left">'
			+'<a class="xpEditCtrl" href="javascript:void(0)" onclick="$(\''+id+'\').cmd(\'fontsize\',1)">1</a>'
			+'<a class="xpEditCtrl" href="javascript:void(0)" onclick="$(\''+id+'\').cmd(\'fontsize\',2)">2</a>'
			+'<a class="xpEditCtrl" href="javascript:void(0)" onclick="$(\''+id+'\').cmd(\'fontsize\',3)">3</a>'
			+'<a class="xpEditCtrl" href="javascript:void(0)" onclick="$(\''+id+'\').cmd(\'fontsize\',4)">4</a>'
			+'<a class="xpEditCtrl" href="javascript:void(0)" onclick="$(\''+id+'\').cmd(\'fontsize\',5)">5</a>'
			+'<a class="xpEditCtrl" href="javascript:void(0)" onclick="$(\''+id+'\').cmd(\'fontsize\',6)">6</a>'
			+'<a class="xpEditCtrl" href="javascript:void(0)" onclick="$(\''+id+'\').cmd(\'fontsize\',7)">7</a>'
			+'</td><td align="left">'
			+'Background Color:</td><td align="left">'+bc+'</td></tr></table>'			
	var control = $(name+'_ctrl');
	control.innerHTML=htmla;	
	var iframe = w$.createElement(name,'iframe',el);
	var pad //= iframe.contentWindow.document;
	if(!save){
		var saveIt = w$.createElement('xpEditSave','div',el);
		var saveItClick = w$.createElement('xpEditSaveClick','a',saveIt);
		saveItClick.innerHTML="save"
		saveItClick.style.cursor="pointer"
		saveItClick.style.styleFloat="right"
		saveItClick.style.cssFloat="right"
		saveItClick.onclick=function(){
										el.save();
										return;
									}
	}
	el.save=function(){
		var con = el.get();
		el.innerHTML = con;
	}
	el.data={name:name,iframe:iframe,text:text,init:true,s:s,p:p};
	el.init= function(){
		pad = iframe.contentWindow.document;
		var s1 = w$.s(control);
		pad.designMode="on";	
		iframe.style.height = Math.max(s.h, s.h - s1.h - 2) + "px";
		iframe.style.width = s1.w - 2  + "px";
		iframe.style.border="1px #bbb dashed"
		iframe.style.cursor = 'text'
		pad.body.innerHTML = el.data.text;
		iframe.contentWindow.focus()
	}
	/**
	  * use this to release control to browser for settle the iframe
	  */
	setTimeout(w$.PF(el.init,null),1);
	
	el.cmd =function (x,y){
		pad.execCommand(x,false,y);
		return false;
	};
	el.lnk=function(){
		var url=prompt("URL (*must start with http:// or https://)",'');
		if(url) this.cmd('createLink',url);
	}
	el.get=function(){ return pad.body.innerHTML; };
	el.set=function(text){ pad.body.innerHTML =text;}
	return el
}



/*	edit a div
 *	@obj			:selfname
 *	@id			:edited div id
 *	@onOk			:call back on ok
 *	@onCance		:call back on cancel(ESC key)
 *
 *	Usage			: ediv = new xpEditDiv('ediv',id);
 */
function xpEditDiv(obj_self_name,id,bg,onOk,onCancel,autoSave)
{
	//need div size & position:
	this.obj = obj_self_name;
	this.id = id;
	this.autoSave=(autoSave)?autoSave:5000	//delay autosave;
	var p=xpWindow.findPositionXY(id)	//	return {x:curleft,y:curtop};

	if(!onOk) 		onOk = '';
	if(!onCancel) 	onCancel = '';
	if(!bg)  		bg="#ffd";
	var s =xpWindow.findSizeWH(id)		//return {w:e.offsetWidth,h:e.offsetHeight};
	var d = new Date()
	var t = d.getTime()
	this.container = "xpEditWindow"+t
	this.cid = xpWindow.createDiv(this.container)	
	this.cid.style.position="absolute"
	this.cid.style.width=s.w+"px";
	this.cid.style.height=s.h+"px";
	this.cid.style.left=p.x+"px";
	this.cid.style.top=p.y+"px";
	this.tid = 	'xpEditTexeArea'+t;

	this.oldString = id.innerHTML.replace(/<br>/g, String.fromCharCode(13))
	this.oldString = this.oldString.replace(/<br\/>/g, String.fromCharCode(13))
	var textArea = '<textarea id="'+this.tid+'" onkeyup="'+this.obj+'.onkeyup(event)" onblur="'+this.obj+'.onblur();" style="border:#aaa 1px dashed;font-family:verdina;left:'+(p.x)+'px;top:'+(p.y)+'px;width:'+(s.w)+'px;height:'+(s.h)+'px; background:'+bg+';cursor:text;">'+this.oldString+'</textarea>'
	this.cid.innerHTML = textArea;

	setTimeout('$("'+this.tid+'").focus()',1);

	this.saveTimer = setTimeout(this.obj+'.onblur()',this.autoSave);
	
	this.onblur=function(){
		clearTimeout(this.saveTimer);
		this.newString = $(this.tid).value;
		this.newString=this.newString.replace(/\n/g, "<br>");
		this.newString=this.newString.replace(/\&/g, " and ");
		this.id.innerHTML=this.newString;
		xpWindow.removeDiv(this.cid);		
		setTimeout(onOk,1);
		setTimeout('delete('+this.obj+')',1)
	}
	
	this.onkeyup=function(e){
		clearTimeout(this.saveTimer);
		if(document.all)e = event;
		switch(e.keyCode){
			case 27:	//cancel
				xpWindow.removeDiv(this.cid);
				setTimeout(onCancel,1);
				setTimeout('delete('+this.obj+')',1)
				return;
				break;
			case 9:	//do itself
			break;	
		}
		this.saveTimer = setTimeout(this.obj+'.onblur()',this.autoSave);		
	}
}


/*	edit a text input field
 *	@obj			:selfname
 *	@id				:edited input field  id
 *	@onOk			:call back on ok
 *	@onCance		:call back on cancel(ESC key)
 *
 *	Usage			: ediv = new xpEditDiv('ediv',id);
 */
function xpEditText(obj_self_name,id,bg,onOk,onCancel,autoSave)
{
	//need div size & position:
	this.obj = obj_self_name;
	this.id = id;
	this.autoSave=(autoSave)?autoSave:3000	//delay autosave;
	var p=xpWindow.findPositionXY(id)	//	return {x:curleft,y:curtop};

	if(!onOk) 		onOk = '';
	if(!onCancel) 	onCancel = '';
	if(!bg)  		bg="#ffd";
	var s =xpWindow.findSizeWH(id)		//return {w:e.offsetWidth,h:e.offsetHeight};
	var d = new Date()
	var t = d.getTime()
	this.container = "xpEditWindow"+t
	this.cid = xpWindow.createDiv(this.container)	
	this.cid.style.position="absolute"
	//this.cid.style.width=s.w+"px";
	//this.cid.style.height=s.h+"px";
	this.cid.style.left=p.x+"px";
	this.cid.style.top=p.y+"px";
	this.tid = 	'xpEditTexeArea'+t;
	
	this.oldString = id.value
	var textInput = '<input id="'+this.tid+'" onkeyup="'+this.obj+'.onkeyup(event)" onblur="'+this.obj+'.onblur();" style="border:#aaa 1px dashed;left:'+(p.x)+'px;top:'+(p.y)+'px;width:'+(s.w)+'px;height:'+(s.h-2)+'px; background:'+bg+';cursor:text;" />'
	this.cid.innerHTML = textInput;
	$(this.tid).value = id.value;
	
	setTimeout('$("'+this.tid+'").focus()',1);

	this.saveTimer = setTimeout(this.obj+'.onblur()',this.autoSave);
	
	this.onblur=function(){
		clearTimeout(this.saveTimer);
		this.newString = $(this.tid).value;
		this.id.value=this.newString;
		xpWindow.removeDiv(this.cid);		
		setTimeout(onOk,1);
		setTimeout('delete('+this.obj+')',1)
	}
	
	this.onkeyup=function(e){
		clearTimeout(this.saveTimer);
		if(document.all)e = event;
		switch(e.keyCode){
			case 27:	//cancel
				xpWindow.removeDiv(this.cid);
				setTimeout(onCancel,1);
				setTimeout('delete('+this.obj+')',1)
				return;
				break;
			case 9:	//do itself
			break;	
		}
		this.saveTimer = setTimeout(this.obj+'.onblur()',this.autoSave);		
	}
}

/*
 *	ajax search item
 *	@obj	:self name
 *	@target	:target DOM element(normal will be input field
 *	@ch		:ajax search channel;point to server script(SSI)
 *	
 *	Usage	:search = new xpSearch('search',id,'lists.php?category=12&item=')
 *  this need mod:xpAjax.js
 */

function _xpAjaxSearch(target,ch,back){
	var d = new Date();
	var name = "xpAjaxSearch"+d.getTime();
	var obj = 'xpGLOBALS["'+name+'"]';
	xpGLOBALS[name] = new xpAjaxSearch(obj,target,ch,back?back:'')
	return obj;
}

function xpAjaxSearch(obj,target,ch,back)
{
	this.working= false;
	this.obj = obj;
	this.ch = ch;
	this.value='';
	this.delayId=null;
	this.delay=400;			//delay for 400 ms
	this.timerId=null;
	this.back = !back ?2500:back;
	this.target = target;
	this.ajax = new xpAjax();
	this.point = null //point to before first element
	//create a div according to target
	//this.func = new xpWindow();
	this.xy = xpWindow.findPositionXY(target);	
	this.wh = xpWindow.findSizeWH(target);
	//because we're not using border (ie get wrong size) 
	//so we create two div as one for border; the border size=4;
	this.bsize=4;
	//background bg;
	if($(obj+"xpASearchBG")) xpWindow.removeDiv($(obj+"xpASearchBG"))
	if(!this.index) this.index=1;
	this.bgId  = xpWindow.createDiv("xpASearchBG");
	this.bgId.style.display="none";
	this.bgId.style.position="absolute"
	this.bgId.style.background="#000"	
	this.bgId.style.margin="0"	
	this.bgId.style.padding="0"	
	this.bgId.style.left = (this.xy.x) +"px"
	this.bgId.style.top  = (this.xy.y + this.wh.h ) +"px"	
	xpWindow.opacity(this.bgId,30);	
	//container
	if($(obj+"xpASearchCont")) xpWindow.removeDiv($(obj+"xpASearchCont"))	
	this.ctId=xpWindow.createDiv("xpASearchCont");
	this.ctId.style.display="none";
	this.ctId.style.position="absolute"
	this.ctId.style.background="#fff"	
	this.ctId.style.margin="0"	
	this.ctId.style.padding="0px"	
	//this.ctId.style.width="190px"	
	this.ctId.style.left = (this.xy.x +this.bsize) +"px"
	this.ctId.style.top  = (this.xy.y + this.wh.h + this.bsize) +"px"	
	var con = obj+"xpASList";
	this.ctId.innerHTML ='<table style="width:auto;" border="0" cellspacing="0" cellpadding="0" ><tr><td id="'+con+'"></td></tr></table>';	
	this.list='';
	this.container = $(con);
	this.display=function(){
		this.ctId.style.display="";
		var s = xpWindow.findSizeWH(this.ctId);
		this.bgId.style.display="";
		this.bgId.style.width = (s.w + (this.bsize*2)) +"px"
		this.bgId.style.height = (s.h + (this.bsize*2)) +"px"
		/*mask for bl**d ie6's <select> */
		/**/this.bgId.innerHTML='<!--[if lte IE 6.5]><iframe id="ajax_search_mask" style="left:0px;top:0px;width:'+(s.w+2*this.bsize)+'px; height:'+(s.h+2*this.bsize)+'px; position:absolute; display:none;display:block;z-index:-1;	filter:mask();" ></iframe><![endif]-->&nbsp;' 
		if(this.back)	{
			clearTimeout(this.timerId)
			this.timerId = setTimeout(this.obj+".hide()",this.back);	//will hide after 4 second
		}
	}
	this.setCH=function(ch){
		this.ch = ch;
	}
	this.hide=function(){
		this.ctId.style.display="none";
		this.bgId.style.display="none";	
	}
	this.show=function(){
		this.ctId.style.display="";
		this.bgId.style.display="";	
	}
/*	
	this.get=function(){
		if(this.delayId) clearTimeout(this.delayId);
		if(this.target.value=='') return;
		this.delayId = setTimeout(this.obj+".doing()", this.delay)
	}
	*/
	this.doing=function(e){	
		if(this.delayId) clearTimeout(this.delayId);
		if(document.all)e = event;
	
		if(e){
			switch(e.keyCode){
				case 38:	//ARROW UP
					if(this.listLength) {
						this.lowlite();
						this.show();
						this.index--;
						//alert(this.index)
						//if(!this.index) this.index=this.listLength;
						if(this.index<0) this.index=this.listLength;
						this.highlite();
						return
					}
					break;				
				case 40:	//ARROW DOWN
				
					if(this.listLength) {
						this.lowlite();
						this.show();
						this.index++;

						if(this.index >this.listLength) this.index=0;
						this.highlite();
						return
					}
					break;
				case 13:	//return;
					if(this.index){
						this.select($(this.obj+'xpASList_'+(this.index-1)));
						return false;
					}else{
						this.hide();
					}
					break;
				case 27:	//esc
					this.hide();
					return;
					break;	
			}
		}
		else
			return;
		clearTimeout(this.timerId);	
		if(this.working) return;
		this.working=true;

		this.ajax.aget(this.ch+this.target.value,obj+'.received()');
		
		return;
		
//		var sr =this.ajax.get(this.ch+this.target.value);
//
//		this.working=false;
//		if(sr)	{
//			var list = sr.split(":");
//			this.container.innerHTML ='';	
//			this.listLength = list.length;
//			if(this.index>list.length) this.index=list.length;
//			for(var i=0;i<list.length;i++) {
//				this.container.innerHTML += '<div id="'+this.obj+'xpASList_'+i+'" style="cursor:pointer;padding:3px;margin:4px;border-bottom:1px #ddd dotted;font-weight:900;" onmouseout="'+this.obj+'.mout(this,'+i+');" onmouseover="'+this.obj+'.mover(this,'+i+');" onclick="'+this.obj+'.select(this);" >'+list[i]+'</div>';
//			}
//			this.display();
//			setTimeout(obj+'.highlite()',1);
//		}
//		this.target.onchange();
//		if(this.back){
//			this.timerId = setTimeout(this.obj+".hide()",this.back);
//		}
	}
	
	this.received = function(){
		this.working=false;
		var sr = this.ajax.data
		if(sr)	{
			var list = sr.split(":");
			this.container.innerHTML ='';	
			this.listLength = list.length;
			if(this.index>list.length) this.index=list.length;
			for(var i=0;i<list.length;i++) {
				this.container.innerHTML += '<div id="'+this.obj+'xpASList_'+i+'" style="cursor:pointer;padding:3px;margin:4px;border-bottom:1px #ddd dotted;font-weight:900;" onmouseout="'+this.obj+'.mout(this,'+i+');" onmouseover="'+this.obj+'.mover(this,'+i+');" onclick="'+this.obj+'.select(this);" >'+list[i]+'</div>';
			}
			this.display();
			setTimeout(obj+'.highlite()',1);
		}
		this.target.onchange();
		if(this.back){
			clearTimeout(this.timerId)
			this.timerId = setTimeout(this.obj+".hide()",this.back);
		}
	
	}
	
	
	/* */
	
	this.highlite=function(){
		if(this.index-1 >=0)
		$(this.obj+'xpASList_'+(this.index-1)).style.background = "#ccc";
	}
	this.lowlite=function(){
		if(this.index-1 >=0)
		$(this.obj+'xpASList_'+(this.index-1)).style.background = "#fff";
	}
	
	this.mover=function(id,i){
		clearTimeout(this.timerId);
		this.lowlite();
		this.index = i+1;
		this.highlite();
		//id.style.background = "#ccc";
	}

	this.mout=function(id,i){
		//id.style.background = "#fff";
		this.timerId = setTimeout( this.obj+".hide()",this.back)
	}

	this.select= function(id){
		if(id) 		this.target.value=id.innerHTML;
		clearTimeout(this.timerId);
		this.target.onchange();	
		this.hide();	
	}
	
}

/* post form in a xpBox 
  * 2008-06-08
  * will close box if 1>cancel button cliked 2>after submit return ok
  * @return : return xpBox handle (with extra xpFrame funtion & data  )
  * @server : called server script
  * @param : 1st time call's params
  * @ok_callback : when submit ok (will return string after ok)
  * @cancel_callback : when cancel button clicked
  * --follow are for wait mask --
  * @wait : has wait mask;
  * @gif : mask gif;
  * @bg : backgeound;
  * @logo : use logo;
  * NOTE :
  *	FORM must use id for submit & cancel button id="submit" id="cancel" !
  *  	You can not ajax file!!
  *  @usage:
  ..
  ..
  <script type="text/javascript">
	function test_form(){ 	new xpFrame('tstpform1.php','?first=1',onok,oncancel,1); }
	function onok(a){ alert(a); }
	function oncancel(){alert('canceled');}
  </script>
  ..
  ..
  
  "php-file: tstpform1.php"
	<?
		if($_REQUEST['a'] ==15) echo 'ok';
		if($_REQUEST['first'] ==1) echo 'first time call<br/>';
	?>
	<div style="padding:30px;background:#def">	
		<form > 
			<input name="a" /><br/> <input name="b" /><br/> 
			<input type="button" id="cancel" name="cancel" value="cancel" /><br/>
			<input type="submit" id="submit" name="save" value="submit" /><br/>
		</form>
	</div>
  *	
  */
function xpFrame(server,param,ok_callback,cancel_callback,bk) //
{
	var pop = xpLB()

	if(bk) pop.style.backgroundColor=bk
	pop.server = server;

	pop.cancel=function(){
		xpWindow.removeDiv(pop.channel);	
		pop.stop();
		if(cancel_callback!=null && cancel_callback)
			setTimeout(w$.passFunction(cancel_callback,0 ),1)
	}
	pop.display=function(con){
	
		if(con==null || con.length<1) {
			if(pop.waiting) pop.waiting.stop();	
			alert('source error #404'); 
			pop.stop();
			return;
		}
		if(con.substr(0,2).toLowerCase() =='ok'){
			
			//if(pop.wait) pop.waiting.stop();	
			var cm = con.split(':');	

			pop.stop();	//call parent stop in pop func/class
			if(cm[1]){
				//for encode url string &amp;
				cm[1] = cm[1].replace(/&amp;/g,'&');
				eval(cm[1]);	
			}else{
				if(ok_callback!=null && ok_callback)
					setTimeout(w$.passFunction(ok_callback,con.substr(2) ),1)
			}
			return;
		}


		var form = con.match(/\<form.*?\>/ig)
//		var act 
//		if(form[0]){
//			if(act = form[0].match(/action=\".*?\"/i) ){
//				if(act = act[0].replace(/(action=\")(.*?)\"/i,function($0,$1,$2){ return $2; } ))
//					pop.server = act;
//			}else{
//				if(act = form[0].match(/action=[^\"\>\/\s]*/i))
//					if(act = act[0].replace(/(action=)([^\"\s\/\>]*?)/i,function($0,$1,$2){ return $2; } ))
//						pop.server = act;
//			}
//		}
		if(form){
			var newform = form[0].replace(/target=\"?[^\"]*?\"?/i, ' '); 
			newform = newform.replace(/\/?\>/i, ' target="'+pop.pid+'_target" \>' ); 
			var onSubmit = form[0].match(/onsubmit=\"?([^\"]*)?\"?/i)
			onSubmit = onSubmit && onSubmit[1] ? onSubmit[1] : '';
			onSubmit = "$('"+pop.pid+"').submiting(this) ;"+onSubmit
			newform = newform.replace(/onsubmit=\"?[^\"]*?\"?/i, ' '); 
			newform = newform.replace(/\/?\>/i, ' onsubmit="'+onSubmit+'" \>' ); 
			
			newform = newform.replace(/action=\"?[^\"]*?\"?/i, ' '); 
			//newform = newform.replace(/\/?\>/i, ' action="'+$(pop.pid+'_target').src+'" \>' ); 
			newform = newform.replace(/\/?\>/i, ' action="'+pop.server+'" \>' ); 
			con = con.replace(form[0],newform);
		}
		//change server
		pop.submiting=function(form){
			pop.server = form.action
			return true;
		}
		
		var flag=0;
		var submit =' this.disabled=\'true\'; return $(\''+pop.data.name+'\').post(this.form); " ';
		var mt = con.match(/\<[^\>]*?(?:id|type|name)=\"?submit\"?[^\"]*?\/?\>/ig )
		if(mt)for(var i=0; i<mt.length;i++){
			
			var newElement = mt[i].replace(/type=\"[^\"]*?\"/i, '' );
			var newElement = newElement.replace(/\/?\>/ig,' type=\"submit\" \/\>' );
			con = con.replace(mt[i],newElement)
			flag=1;
		}

		var cancel = ' this.disabled=\'true\'; $(\''+pop.data.name+'\').cancel();" ';
		var mt = con.match(/\<[^\>]*?(?:id|name)=\"?cancel\"?.*?\/?\>/ig )
		if(mt)for(var i=0; i<mt.length;i++){
			var nt			
			var onclick = mt[i].match(/onclick=\"?([^\"]*?)\"?/i )

			if(onclick){
				nt = mt[i].replace(/onclick=\".*?\"/i , ' onclick="' + onclick[1] +'; '+cancel);				
			}else{
				nt = mt[i].replace(/\/?\>/ , ' onclick="'+cancel);				
			}
			con = con.replace(mt[i],nt)
			flag=1;
		}

		pop.setContent(con,flag?0:1) //call parent class method (this point to pop)
	}
	param = param?param:'';
	pop.pid = w$.getId(pop);
	pop.channel = w$.createDiv(pop.pid+'_channel');
	pop.channel.style.height = '1px';
	pop.channel.style.visibility = 'hidden';
	pop.channel.innerHTML = '<iframe id="'+pop.pid+'_target" name="'+pop.pid+'_target"  onload="var con=w$.iframeDocument(this).body.innerHTML;w$.iframeDocument(this).body.innerHTML=\'\';  $(\''+pop.pid+'\').display(con)" src="'+pop.server+'" ></iframe>';
	
	//1st time call (method get , asyn)
	return pop;
//
///////////////////////////////////////////////////////////////////////////
//	var pop = xpLB()
//	pop.post=function(form){
//		form.action = server;
//		
//		iPost(form,this.display);
//		pop.data.inner.innerHTML = '';
//		return false;
//	}
//	pop.cancel=function(){
//		pop.stop();
//		if(cancel_callback!=null && cancel_callback)
//			setTimeout(w$.passFunction(cancel_callback,0 ),1)
//	}
//	pop.display=function(con){
//		if(con==null || con.length<1) {
//			if(pop.waiting) pop.waiting.stop();	
//			alert('source error #407'); 
//			pop.stop();
//			return;
//		}
//		if(con.substr(0,2) =='ok'){
//			
//			//if(pop.wait) pop.waiting.stop();	
//			var cm = con.split(':');	
//
//			pop.stop();	//call parent stop in pop func/class
//			if(cm[1]){
//				//for encode url string &amp;
//				cm[1] = cm[1].replace(/&amp;/g,'&');
//				eval(cm[1]);	
//			}else{
//				if(ok_callback!=null && ok_callback)
//					setTimeout(w$.passFunction(ok_callback,con.substr(2) ),1)
//			}
//			return;
//		}
//		
//		var flag=0;
//		var submit =' this.disabled=\'true\'; return $(\''+pop.data.name+'\').post(this.form); " ';
//		var mt = con.match(/\<.*?(?:id|type|name)=\"submit\".*?\/?\>/ig )
//		if(mt)for(var i=0; i<mt.length;i++){
//			var nt;
//			var onclick = mt[i].match(/onclick=\"(.*?)\"/i )
//			if(onclick){
//				nt =mt[i].replace(/onclick=\".*?\"/ , 'onclick="' + onclick[1] +'; '+submit);				
//			}else{
//				nt = mt[i].replace(/\/?\>/ , 'onclick="'+submit);				
//			}
//			con = con.replace(mt[i],nt)
//			flag=1;
//		}
//
//		var cancel = ' this.disabled=\'true\'; $(\''+pop.data.name+'\').cancel();" ';
//		var mt = con.match(/\<.*?(?:id|name)=\"cancel\".*?\/?\>/ig )
//		if(mt)for(var i=0; i<mt.length;i++){
//			var nt			
//			var onclick = mt[i].match(/onclick=\"(.*?)\"/i )
//			if(onclick){
//				nt = mt[i].replace(/onclick=\".*?\"/ , 'onclick="' + onclick[1] +'; '+cancel);				
//			}else{
//				nt = mt[i].replace(/\/?\>/ , 'onclick="'+cancel);				
//			}
//			con = con.replace(mt[i],nt)
//			flag=1;
//		}
//	
//		pop.setContent(con,flag?0:1) //call parent class method (this point to pop)
//	}
//	param = param?param:'';
//	
//	//1st time call (method get , asyn)
//	XPX(0,0,server,param,pop.display);
//	return pop;


}


/////////////////////////////////////////////////////////////////////////////////////////////


/*  javascript:
	@purpose		:create ajax class with easy
	@author			:xp wang (xpw365@gmail.com)
	@date			:2005-02-06
	@dateModified	:2007-05-10
	@licence		:GPL
	@work:
		example:
		--------------------------------------------------------------------------
		var server = new AJAX();
		var xmlData = server.get("passing_data.php?data_id=3393771930232");
		server.aget("passing_data.php?data_id=3393771930232","showData()");
			-------
		function showData()		{
			if(!server.error) alert(server.data);
			else alert('error!')
		}
		--------------------------------------------------------------------------
	@function:(public)
	String get(query);			send url request use GET method and return result
		@param (String) query; 	url request, eg,"datasource.php?id=12&user=me&level=250"
		@retrun server send data
	String post(url,data);		send url request use POST method and return result
		@param (string) url; 	server script, eg., "datasource.php"; 
		@param (string) data; 	POST data , eg., "id=12&user=me&level=250"; 
		@retrun server send data
	Void aget(query,callback)	use asynchronous xmlHttp.method , send url request use GET method 
		@param (String) query; 	eg,"datasource.php?id=12&user=me&level=250"
		@param (String) callback; callback function, eg, "showData()";
		@retrun none, get date by this.data	eg: server.data;
	Void apost(url,data,callback);	use asynchronous xmlHttp.method ,	send url request use POST method 
		@param (string) url; 	server script, eg., "datasource.php"; 
		@param (string) data; 	POST data , eg., "id=12&user=me&level=250"; 	
		@param (String) callback; callback function, eg, "showData()";		
		@retrun none, get date by this.data	eg: server.data;	

*/
function xpAjax(obj)	//create a class objext
{
	this.obj = (!obj)?'ajax':obj; 
	this.error='';
	this.data='';
	//get xmlHttpObject. *not all browser support!
	this.GetXmlHttpObject=function() { 
		var objXMLHttp=null;
		if (window.XMLHttpRequest)	objXMLHttp=new XMLHttpRequest();
		if(objXMLHttp==null) objXMLHttp=new ActiveXObject("MSXML2.XMLHTTP.3.0")
		if(objXMLHttp==null) objXMLHttp=new ActiveXObject("Msxml2.XMLHTTP")
		if(objXMLHttp==null) objXMLHttp=new ActiveXObject("Microsoft.XMLHTTP")
		return objXMLHttp;
	}
	this.xmlHttp=this.GetXmlHttpObject();	//can only call function has been defined, that is an above 
	if(this.xmlHttp==null)	{
		alert ("Browser does not support AJAX,Please use browser :\"Firefox\" !\n or risk your system security by allowing ActiveX in your bloody IEs!");
		return 			//can not return value since it's a object;
	}
	//when data ready, callback
	this.StateChanged=function(_this,callback) { 
		if(_this.xmlHttp.readyState==4){
			//done!
		 	if(_this.xmlHttp.status=="200") { 
	 		 //if data send OK!
				_this.error=false;
				_this.data = _this.xmlHttp.responseText;
				setTimeout(callback,2); // will return even on error;
			//	delete(_this.obj)
			//	delete(_this)
			}else{
				_this.error=true;
				_this.data = null;	
				setTimeout(callback,1); // will return even on error;
				//delete(_this.obj);
				//delete(_this)
			}
		}
	} 
	//request by get query & callback address
	this.aget=function (query,callback) {
		var _this = this;//this because next is call out function,which  will not able to read class stuff
		this.xmlHttp.onreadystatechange=function(){ _this.StateChanged(_this,callback)}//will call function stateChanged()
		//follow lines are for ie6 cache problem;
		query += (query.indexOf('?')>0?'&':'?') +'a'+Math.random()+'='+Math.random(); //for ie6 cache
		//end ie6.. 

		this.xmlHttp.open("GET",encodeURI(query),true);
		this.xmlHttp.setRequestHeader('Content-Type', 'text/xml');		
		this.xmlHttp.send(null);
	} 
	this.apost=function(query,data,callback){
		var _this = this;				//see above aget
		data += (data.indexOf('?')>0?'&':'?') +'a'+Math.random()+'='+Math.random(); //for ie6 cache
	//	this.working = true;
		this.xmlHttp.onreadystatechange=function(){ _this.StateChanged(_this,callback)}//will call function stateChanged() 
		this.xmlHttp.open("POST",query,true);
  		this.xmlHttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
  		this.xmlHttp.send(encodeURI(data));	//	xmlSendBuffer="fdest="+fn+"&fpath="+jxSaveDir+"&con="+js_buffer.document.body.innerHTML;
	}
	//request by get
	this.get=function(query){
		//follow lines are for ie6 cache problem;

		query += (query.indexOf('?')>0?'&':'?') +'a'+Math.random()+'='+Math.random(); //for ie6 cache
		//end ie6.. 
		this.xmlHttp.open("GET",encodeURI(query),false);
		this.xmlHttp.send(null);
		return this.xmlHttp.responseText;
		//* http_request.responseText ????
		//* http_request.responseXML 
		//*	var xmldoc = http_request.responseXML;
		//*	var root_node = xmldoc.getElementsByTagName('root').item(0);
		//*	alert(root_node.firstChild.data);		
	} 
	this.post=function(query,data)	{
		//follow lines are for ie6 cache problem;
		data += (data.indexOf('?')>0?'&':'?') +'a'+Math.random()+'='+Math.random(); //for ie6 cache
		//end ie6.. 
		this.xmlHttp.open("POST",query,false);
  		this.xmlHttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
		this.xmlHttp.send(encodeURI(data));	//	xmlSendBuffer="fdest="+fn+"&fpath="+jxSaveDir+"&con="+js_buffer.document.body.innerHTML;
		return this.xmlHttp.responseText;
	}
	/* this function add on 07-08/07/2007 for share trading project */
	this.postForm = function (fobj,server,callback){
		var buf='';
		if(!server) server=fobj.action;
		for(var i = 0;i < fobj.elements.length;i++)	{
			var el =fobj.elements[i];
			if((el.type!="checkbox" && el.type!="radio")||(el.checked))
				buf = buf +el.name+ '=' +el.value.replace(/\&[^(amp;)]/g, '&amp;') +'&';
		}
		buf += (buf.indexOf('?')>0?'&':'?') +'a'+Math.random()+'='+Math.random(); //for ie6 cache
//for ie6 cache
		this.apost(server,buf,callback);
	}
}
//this line is for old project compatibility
var AJAX = xpAjax;


/* function for ajax : no re-usable object
 * @syn = true/false	:asyn or syn
 * @type = 0/1/2     	:get/post/post form
 * @query= server script
* @data	=data buff if get/post / form object if post form
* @callBack = call back handle if asyn used ( func1, will run func1(ajaxreturn) ; no "" ! )
* @XML = retrn type xml or text
* @raw = do not encode url string
* @usage:
*	function ttt(){
*		var query='tst1.php'
*		var ret = XPX(1,2,query,document.getElementById('test_form'),next);
*		//syn, post a form, to 'tst1.php', form id = 'test_form', call back = next(), return text/not xml, encode url
*
*		alert("s_ret="+ret)
*	}
*	function next(x){
*		alert('a_ret='+x)
*	}
*
*	.
*	.
*	<form id="test_form">
*	<input name="ip" value="2221" />
*	</form>
*	.
*	.
*	.
*/
function XPX(syn,type,query,data,callBack,XML,raw,mimeType)
{
	data = !data?null:data;
	var httpObj=null;
	if (window.XMLHttpRequest)	httpObj=new XMLHttpRequest();
	else if (window.ActiveXObject) //since my IE disabled ActiveX, this never worked!
			httpObj=new ActiveXObject("Microsoft.XMLHTTP");

	if(!httpObj){
		alert ("Browser does not support AJAX,Please use browser :\"Firefox\" !\n or risk your system security by allowing ActiveX in your bloody IEs!");
		return false;			//can not return value since it's a object;
	}	

	if(!syn) 	syn=false
	else 		syn=true

	if(mimeType != null )
		httpObj.overrideMimeType('text/xml');
	httpObj.onreadystatechange=function() {
		if(httpObj.readyState==4){
		 	if(httpObj.status=="200") { 
		 		if(!syn){
		 			var ret
					if(XML) 	ret= httpObj.responseXML;
					else	 	ret= httpObj.responseText;
					if(callBack)
			 			setTimeout(w$.passFunction(callBack,ret ),1)
					delete(httpObj)
					return
		 		}
			}else{
				if(!syn && callBack) setTimeout(w$.passFunction(callBack,false),1)
				delete(httpObj)
				return;
			}
		}
	} 

	switch(type)	//get, post, post form
	{
		case 0:
			method = 'GET';
			data= (query.indexOf('?')>0?'&':(data?(data+'&' ):'?')) +'a'+Math.random()+'='+Math.random(); //for ie6 cache		

			query += raw?data:encodeURI(data);

			data=null
			break;			
		case 1:
			method='POST';
			data += (data.indexOf('?')>0?'&':'?') +'a'+Math.random()+'='+Math.random(); //for ie6 cache
			data = raw?data:encodeURI(data)
			break;
		case 2:
			method ='POST'
			var buf='';
			if(!query) query=data.action;
			
			var input  = data.getElementsByTagName('INPUT');
			for(var i = 0;i < input.length;i++)	{
				var el =input[i];
					if((el.type!="checkbox" && el.type!="radio")||(el.checked)){
						buf +=  el.name+ '=' + (raw?el.value:encodeURI(el.value)) +'&';
					}
			}

			var input  = data.getElementsByTagName('TEXTAREA');
			for(var i = 0;i < input.length;i++)	{
				var el =input[i];
				buf +=  el.name+ '=' + (raw?el.value:encodeURI(el.value)) +'&';
			}
			
			var input  = data.getElementsByTagName('SELECT');
			for(var i = 0;i < input.length;i++)	{
				var el =input[i];
				buf +=  el.name+ '=' + (raw?el.value:encodeURI(el.value)) +'&';
			}
			
			buf += (buf.indexOf('?')>0?'&':'?') +'a'+Math.random()+'='+Math.random(); //for ie6 cache
			data = buf;
			break;
	} 

	httpObj.open(method,query,!syn);
	httpObj.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
	httpObj.send(data);	//	xmlSendBuffer="fdest="+fn+"&fpath="+jxSaveDir+"&con="+js_buffer.document.body.innerHTML;		
	if(syn){
  		var ret
		if(XML) 	ret= httpObj.responseXML;
		else	 	ret= httpObj.responseText;
		delete(httpObj)

		return ret
	}else{	
		return true;
	}
	
}

