/*************************************************
* 本单元写于 ：2010年10月21日
* 作者 : 李腾秋
* E-Mail : litqqs@163.com
* 版权所有 
*************************************************/
/*************************************************
pjson 2.0.0版 客户端代码
客户端对象 pjson 的接口
Object pjson{
	//	var onMessage = function(string id,array param){};
	//	var onSucceed=function(string content,, XMLHTTPRequest x){};
	//	var onFinished=function(string content,, XMLHTTPRequest x){};
	//	var onRequestError =function(string content, XMLHTTPRequest x){};

	bool debug=false;
	function debugMsg(string msg):pjson;//显示调试窗口, 输出信息
	function find(string id):domElement;//得到dom元素
	function call(string url, string|object data=null, string method='auto'):string;//以同步方式请求网址,返回请求内容
	//ajax相关
	function ajax():XMLHttpRequest;//得到异步请求对象
	function get(function callback, string url):pjson;//以GET方式请求网址, 并执行回调函数, 回调函数为null时, 会调用内置的回调
	function post(function callback, string url, string|object data=null):pjson;// 以POST方式请求网址, 并执行回调函数, 回调函数为null时, 会调用内置的回调
	function submit(function callback, string|domForm form, string url=null):pjson;//提交表单, 并执行回调函数, 回调函数为null时, 会调用内置的回调
	function rpc(string url, string|object data=null, string method='auto'):pjson;//请求网址, 并执行内置的回调

	//dom操作
	function bind():domElement;//得到当前绑定的元素
	function bind(string id):pjson;//绑定操作元素
	function show(mix obj,...):pjson;//显示dom元素
			//show() 显示当前绑定的元素
			//show(string id1,...)显示指定的元素
			//show(domElement obj,...) 显示指定的元素
			//show(array [id1|domElement]) 显示指定的元素
	function hide(mix obj,...):pjson;//隐藏dom元素
			//hide() 隐藏当前绑定的元素
			//hide(string id1,...) 隐藏指定的元素
			//hide(domElement obj,...) 隐藏指定的元素
			//hide(array [id1|domElement])隐藏指定的元素

	//---------function handleEvent(string eventName,function func, mix data=null):pjson;//绑定事件
	function listenEvent(string eventName,function func):pjson;//当前绑定的元素添加事件监听函数
	function unlistenEvent(string eventName,function func):pjson;//当前绑定的元素移除事件监听函数
	
	function insertHtml(string html, string position='end'):pjson;//插入网页代码 position=[before|begin|end|after]
}
服务器端可以通过判断 $_SERVER['HTTP_ASKER'] 的值是否等于 "pjson" 来决定返回的信息
< ?php
if('pjson'==$_SERVER['HTTP_ASKER']){//请求返回 pjson 信息字串
	//这里输出 json 信息字串
	exit;
}else{
	//输出 html 信息字串 
}
? >
*************************************************/
var ua = navigator.userAgent.toLowerCase();
var isIE =!!window.ActiveXObject; //ie  // ua.indexOf('trident')>=0 || ua.indexOf('msie 6')>=0 ; 
var isIE6 = isIE && !window.XMLHttpRequest;//ie6
var isIE7 = isIE && ua.indexOf('msie 7')>=0 ;//ie7
var isIE8 = isIE && ua.indexOf('msie 8')>=0 ;//ie8
var isIE9 = isIE && !!document.createDocumentFragment;
var isWebkit = ua.indexOf('webkit')>=0; //chrome,safari
var isOpera = ua.indexOf('presto')>=0; //opera
var isGecko = ua.indexOf('gecko')>=0; //firefox

var $=function(id){return document.getElementById(id);};
var $$=function(name){return document.getElementsByName(name);};
var pjson;
if('undefined'==typeof pjson){
	var pjson= function (id){
		pjson._bindElement=pjson.find(id);
		return pjson; 
	}

	pjson.version='2.0.0';
	pjson.debug=0;
	pjson.debugMsg=function(msg){
		if(!pjson.debug) return;
		var d = this.find('pjson_debug_panel');
		if(!d){
			d=document.createElement('DIV');
			d.id='pjson_debug_panel';
			d.innerHTML='PJson调试信息:<input type="button" onclick="this.parentNode.lastChild.value=\'\'; return false;" value=" 清除调试信息 "  /><input type="button" onclick="this.parentNode.style.display=\'none\'; return false;" value=" 关闭调试面板 "  /><br /><textarea style="width:100%;color:#969696;background-color:#232323;" rows="20"></textarea>';
			document.body.appendChild(d);
		}
		pjson.show(d);
		d.lastChild.value += '\n'+msg;
	};
	//取ie元素
	pjson.find=function(id){
		return 'string'==typeof id ? document.getElementById(id) : id;
	};
	//取name的所有元素
	pjson.all=function(name){
		return 'string'==typeof name ? document.getElementsByName(name) : name;
	};
	pjson._bindElement=null;
	pjson.bind=function(){
		if(arguments.length<1){
			return pjson._bindElement;
		}
		var id=arguments[0];
		pjson._bindElement = pjson.find(id);
		return pjson;
	};
	//取得变量的类型.如: string,array,function,number,boolean,object,null,date,math,regexp,CustomType
	pjson.varType=function(o) {
		var _t= typeof o; 
		return _t == "object" ? o==null && "null" || Object.prototype.toString.call(o).slice(8,-1).toLowerCase():_t;
	};
	//返回以url形式的Js的对象表示
	pjson.buildQuery=function(obj,pre,sub){
		if(! obj) return '';
		var a=[];
		for(var p in obj){
			var n= encodeURIComponent(p);
			if(pre && sub) n=pre+n+sub;
			var v = obj[p];
			switch(typeof v){
				case 'null':a.push(n+'=');break;
				case 'boolean':a.push(n+'='+ (v?'1':'0'));break;
				case 'object':if(null==v){ a.push(n+'=');break;}
					var s= pjson.buildQuery(v, n+'[',']');
					if(''!=s) a.push(s);break;
				default:a.push(n+'='+encodeURIComponent(v));break;
			}
		}
		return a.join('&');	
	};
	pjson.__decode=function(x)
	{
		var s=x.responseText;
		if(x.getResponseHeader('Content-Type').indexOf('charset')>0 || s.search(/^\s*<?xml\s[^>]*?encoding\s*=/i)>=0) return s;
		//对gb解码只支持 IE
		if(! isIE){
			pjson.debugMsg('只有IE系列浏览器才能解码gbk文档. 请在HTTP头部指定编码.');
			return s;
		}
		var r=/<meta\s+[^>]+?charset=([a-z0-9\-]+)[^>]*>/ig;
		var a=r.exec(s);
		//文档已指定字符集
		if(a){
			var charset=a[1].toLowerCase();
			//目前只针对GB解码, 其它字符集不处理
			if('gb2312'==charset || 'x-gbk'==charset || 'gbk'==charset|| 'gb18030'==charset){
				return gb2utf8(x.responseBody);
			}
			return s;
		}
		var charset = (document.charset) ? document.charset.toLowerCase() : document.characterSet.toLowerCase();
		//未指定编码, 且当前文件编码是gb2312时, 目标按gb字符集处理
		if('gb2312'==charset || 'x-gbk'==charset || 'gbk'==charset|| 'gb18030'==charset){
			return gb2utf8(x.responseBody);
		}
		return s;
	};
	pjson.ajax=function(){
		var x = null;
		if (window.XMLHttpRequest) {
			x = new XMLHttpRequest();
		}else{
			try{
				x = new ActiveXObject("Microsoft.XmlHttp");
			}catch(e){
				this.debugMsg('建立异步请求对象[XmlHttp]失败.');
				throw(e);
			}
		}
		if(arguments.length<1) return x;
		//---------------params---------------------
		var p=arguments[0];	//{url,data,method, callback}
		//var defaultParam={url:location.href, callback:null, method:'GET', data:''}
		var url = p.url; //必须的参数
		var callback = p.callback;	//可选参数
		var data = p.data;			  //可选参数
		var method = p.method ? p.method : (data?'POST':'GET');	//可选参数
		var charset =  p.charset || document.charset || document.characterSet ; //可选参数
		var onSuccess = p.onSuccess;			  //执行callback前执行
		var onFinished = p.onFinished;			  //执行callback后执行
		//---------------
		if('object' ===typeof data) data=pjson.buildQuery(data);
		//--
		this.debugMsg('请求网址:'+url+'\n数据:'+data+'\n方法:'+method+'\n字符集:'+charset);
		var header={};
		var cbtype=typeof callback;
		if('string'==cbtype && ''!=callback || 'object'==cbtype && null!=callback){
			var r = callback;
			this.debugMsg('请求内容载入元素['+r+']中');
			callback=function(s,x){pjson.html(s,r); pjson.activateXLinks(pjson.find(r));};
		}else if('function'!=cbtype){
			callback=function(s, x){
				if('['==s.charAt(0) && ']'==s.charAt(s.length-1)){//json消息  //'json_msg'==x.getResponseHeader('result_type')
					pjson.debugMsg('返值当作JsonMessage处理');
					pjson.jsonHandler(s);
				}else{ //网页代码
					pjson.debugMsg('返值当作网页代码消息处理');
					pjson.exeJsInHtml(s,true);
				}
			}
			header['Want']='json_message'; 
		}
		header['Asker']='pjson';
		if('POST'==method) header["Content-Type"]="application/x-www-form-urlencoded";

		x.onreadystatechange = function()
		{
			if (x.readyState != 4) return;
			pjson.debugMsg('请求状态: '+x.status+'   描述: '+ x.statusText);
			if(200!=x.status) return;//请求失败
			var s=pjson.__decode(x);
			pjson.debugMsg('服务器返值:\n-----------------------\n'+s+'\n-----------------------\n');
			try{
				if('function'===typeof onSuccess) onSuccess(s,x);
				callback(s, x);
				if('function'===typeof onFinished) onFinished(s,x);
			}catch(e){
				pjson.debugMsg(e);
			}
		};
		x.open(method, url, true);
		if(!isIE && x.overrideMimeType) x.overrideMimeType('text/plain; charset='+charset);
		for(var p in header) x.setRequestHeader(p,header[p]); 
		x.send(data);

		return pjson;
	};
	pjson.get=function(url,callback){
		return pjson.ajax({'callback':callback,'url':url,'method':'GET'});
	};
	/*
	原型: pjson post=function(url[, data[, callback]])
	   @param string url, 网址
	   @param string|object data, 提交的数据,可以是以网址编码形式的数据
	   @param function(s,x)|string|object callback, 回调函数,目标数据 
	*/
	pjson.post=function(url, data, callback){
		if('function'===typeof data){callback=data; data='';}
		return pjson.ajax({'callback':callback,'url':url,'method':'POST','data':data});
	};
	/*
	原型: pjson load(url[, element[, at]])
	   @param string url, 网址
	   @param string|HTMLElement element, 目标元素, 为空时使用绑定元素
	   @param string|HTMLElement at, 目标元素, 为空时使用绑定元素
	*/
	pjson.load=function(url, element, at){
		var callback=function(s,x){
			if(undefined===at || null===at || ''===at){
				pjson.html(s, element);
			}else{
				pjson.insertHtml(at,s,element);
			}
			pjson.activateXLinks(pjson._e(element));
		};
		return pjson.ajax({'callback':callback,'url':url,'method':'GET'});
	};
	//此方法把表单元素转化为url格式编码
	pjson._formElement2uri=function(element)
	{
		var n=encodeURIComponent(element.getAttribute('name'));
		var v=encodeURIComponent(element.value);
		switch(element.tagName.toLowerCase()){
		case 'textarea': return n+'='+v ;
		case 'select':
			if (element.multiple){
				var eo=element.options, result=[], i=0;
				for(i=0;i<eo.length;i++){
					if(! eo[i].selected) continue;
					result.push(n+'='+encodeURIComponent(eo[i].value));
				}
				return result.join('&');
			}else{
				return n+'='+v;
			}
			break;
		case 'input':
			switch(element.type.toLowerCase()){
			case 'radio'    :
			case 'checkbox' :if(element.checked) return n+'='+v;break;
			
			case 'file'     :pjson.debugMsg('PJson不能获取文件域的值');//这里不中断执行, 以提交文件域的文件名
			case 'submit'   :
			case 'text'     :
			case 'password' :
			case 'hidden'   :return n+'='+v;break;
			}
			break;
		}
		return '';
	};
	//此方法把表单转化为url格式编码
	pjson.getFormValue=function(f)
	{
		try{
			var result=[], es = f.elements, len=f.elements.length;
			for(var i=0;i<len;i++){
				if(es[i].getAttribute && es[i].getAttribute('name')){//晕,IE9将Flash对象也当成是表单元素
					var v=pjson._formElement2uri(es[i]);
					if(v)result.push(v);
				}
			}
		}catch(e){
			pjson.debugMsg(e);
		}
		return result.join('&');
	};
	/*
	原型: 
	1.pjson submit(string formId[,string elementId[, string url]])
	2.pjson submit(FormElement form[,string e[, string url]])
	3.pjson submit(string formId[,HTMLElement e[, string url]])
	4.pjson submit(FormElement form[,HTMLElement e[, string url]])
	5.pjson submit(string formId[,function  callback(s, x)[, string url]])
	6.pjson submit(FormElement form[,function  callback(s, x)[, string url]])
	*/
	pjson.submit=function(form,callback, url){
		form = pjson.find(form);
		pjson.debugMsg('提交表单'+form.id);
		if(!url) url = form.getAttribute('action');
		if(!url) url=location.href;
		var p = url.indexOf('#');
		if(p>0) url=url.substr(0,p);
		return pjson.ajax({'callback':callback,'url':url,'method':'POST','data':pjson.getFormValue(form)});
	};
	pjson._handle=function(msg,param){
		if('function' ==typeof this.onMessage && this.onMessage(msg,param)) return;	//自定消息处理器处理消息

		switch(msg){
		case 'update'     :
			var e=pjson.find(param[0]);
			switch(param[1]){
				case 'innerHTML':pjson.html(param[2],e);break;//e.innerHTML=param[2];
				case 'innerText':pjson.text(param[2],e);break;//e.innerText=param[2];
				case 'class': if(isIE){ e.className=param[2];break;}
				case 'style': if(isIE){ e.style.cssText=param[2];break;}
				default:e.setAttribute(param[1], param[2]);break;
			}
			break;
		case 'insertHtml' : pjson.insertHtml(param[1], param[2],param[0]);break;
		case 'insertText' : pjson.insertText(param[1], param[2],param[0]);break;
		case 'go'         : location=param[0]; break;
		case 'exec'       : if(isIE) window.execScript(param[0], 'JavaScript'); 
							else window.eval(param[0]); 
							break;
		case 'delete'     : pjson.find(param[0]).removeNode(param[1]); break;
		case 'loadJs'     : 
			for(var i=0;i<param.length;i++){
				this.loadJs(param[i]); 
			}
			break;
		case 'alert'      : window.alert(param[0]); break;
		case 'back'       : history.back(param[0]);/*if(param[0]>1)history.back(param[0]);else location=document.referrer;*/ break;
		case 'refresh'    : window.location.reload();break;
		case 'execCommand': document.execCommand(param[0], param[1], param[2]); break;
		case 'confirm'    : 
							var p = (confirm(param[0]))?param[1]:param[2]; 
							if('string'==typeof p && ''!= p){
								if(isIE) window.execScript(p, 'JavaScript'); 
								else window.eval(p);
								break;
							}
							if(null!=p) this._handle(p[0],p[1]);	
							break;
		//未知消息处理
		default           : 
			
				this.debugMsg('自定义消息:'+msg+'\n参数信息:'+param.toString());
			break;
		}

	};
	pjson.jsonHandler=function(msg){
		if('string'==typeof msg) {
			try{
				msg=eval(msg);
			}catch(e){
				pjson.debugMsg('错误, 非JSON字串:\n---------------------\n'+msg+'\n---------------------\n');
				throw(e);
			}
		}
		var len= msg.length;
		for(var i=0;i<len;i++){
			try{
				pjson._handle(msg[i].id, msg[i].param);
			}
			catch(e){
				pjson.debugMsg('错误'+e);
				throw(e);
			}
		}
	};

	pjson.show=function(){
		var len=arguments.length;
		if(len<1){
			pjson.bind().style.display='';
			return pjson;
		}
		for(var i=0; i<len;i++){
			var arg = arguments[i];
			switch(pjson.varType( arg)){
				case 'string': pjson.find(arg).style.display=''; break;
				case 'object': arg.style.display=''; break;
				case 'array': for(var j=0;j<arg.length;j++) pjson.show(arg[j]); break;
			}
		}
		return pjson;
	};
	pjson.hide=function(){
		var len=arguments.length;
		if(len<1){
			pjson.bind().style.display='none';
			return pjson;
		}
		for(var i=0; i<len;i++){
			var arg = arguments[i];
			switch(pjson.varType( arg)){
				case 'string': pjson.find(arg).style.display='none'; break;
				case 'object': arg.style.display='none'; break;
				case 'array': for(var j=0;j<arg.length;j++) pjson.hide(arg[j]); break;
			}
		}
		return pjson;
	};
	//返转显示/隐藏对象
	pjson.toggle=function(){
		var len=arguments.length;
		var s;
		if(len<1){
			s=pjson.bind().style;
			s.display = (s.display!='none') ? 'none':'';
			return pjson;
		}
		for(var i=0; i<len;i++){
			var arg = arguments[i];
			switch(pjson.varType( arg)){
				case 'string': s=pjson.find(arg).style;s.display = (s.display!='none') ? 'none':''; break;
				case 'object': s=arg.style; s.display = (s.display!='none') ? 'none':''; break;
				case 'array': for(var j=0;j<arg.length;j++) pjson.toggle(arg[j]); break;
			}
		}
		return pjson;
	};
	pjson._e=function(e){
		switch(typeof e){
			case 'undefined':
			case'null': return pjson.bind();
			case 'string':return (''===e)? pjson.bind() : pjson.find(e);
			default:return e;
		}
	};
	pjson.pos=pjson.rect=function(e){
		e=pjson._e(e);
		var x = 0, y = 0, w=e.offsetWidth,h=e.offsetHeight;
		if (e.getBoundingClientRect) {
			var box = e.getBoundingClientRect();
			var d=(document.compatMode != "CSS1Compat") ? document.body : document.documentElement;
			x = box.left + (window.scrollX || d.scrollLeft) - d.clientLeft;
			y = box.top + (window.scrollY || d.scrollTop) - d.clientTop;
		} else {
			x = e.offsetLeft;
			y = e.offsetTop;
			var parent = e.offsetParent;
			while (parent) {
				x += parent.offsetLeft;
				y += parent.offsetTop;
				parent = parent.offsetParent;
			}
		}
		return {'x' : x, 'y' : y, left:x, top:y, right:x+w, bottom:y+h, width:w , height:h};
	};
	pjson.text=function(txt,e){
		e = pjson._e(e);
		if('undefined'==typeof txt || null==txt) return e.innerText?e.innerText:e.textContent;
		if('undefined'!=typeof e.innerText)e.innerText=txt;
		else e.textContent=txt;
		return pjson;
	};
	pjson.html=function(htm,e){
		e = pjson._e(e);
		if('undefined'==typeof htm || null==htm) return e.innerHTML;
		
		htm = pjson.exeJsInHtml(htm,true);
		e.innerHTML=htm;
		//pjson.activateXLinks(e);
		return pjson;
	};
	pjson.removeListener=function(e,eventName,func){
		if(isIE) {
			e.detachEvent('on'+eventName, e['e'+eventName+func]);
		}else{
			e.removeEventListener(eventName, func, false );
		}
	};
	pjson.addListener=function(e,eventName,func){
		if(isIE) {
			e['fn'+func]=func;
			e['e'+eventName+func]=function(et){e['fn'+func](et)};
			e.attachEvent('on'+eventName, e['e'+eventName+func]);
		}else{
			e.addEventListener( eventName, func, false );
		}
	};
	pjson.insertElement=function(position,element, e){
		e = pjson._e(e);
		if(!e) return pjson;
		if(e.insertAdjacentElement){
			switch(position){
				case 'before':	e.insertAdjacentElement('beforeBegin',element);break;
				case 'begin':	e.insertAdjacentElement('afterBegin',element);break;
				case 'end':		e.insertAdjacentElement('beforeEnd',element);break;
				case 'after':	e.insertAdjacentElement('afterEnd',element);break;
				default:		e.insertAdjacentElement(position,element);break;
			}
			//pjson.activateXLinks(e);
			return pjson;
		}
		switch(where){
			case'before':
			case'beforeBegin':
				e.parentNode.insertBefore(element, e);
				break;
			case'begin':
			case'afterBegin':
				if(e.firstChild) e.insertBefore(element,e.firstChild);
				else e.appendChild(element) ;
				break;
			//case'beforeEnd': break; //default
			case'after':
			case'afterEnd':
				if(e.nextSibling)e.parentNode.insertBefore(element, e.nextSibling);
				else e.parentNode.appendChild(element) ;
				break;
			default: e.appendChild(element);
				break;
		}
		//pjson.activateXLinks(e);
		return pjson;
	};
	pjson.insertText=function(position,text,e){
		 return pjson.insertHtml(position,text.replace(/</g , '&lt;').replace(/>/g , '&gt;'), e);
	};
	pjson.insertHtml=pjson.insertHTML=function(position,htm_txt,e){
		e = pjson._e(e);
		if(!e) return  pjson;

		if(e.insertAdjacentHTML){
			switch(position){
				case 'before':
				case 'beforeBegin':
					e.insertAdjacentHTML('beforeBegin',htm_txt);break;
				case 'begin':
				case 'afterBegin':
					e.insertAdjacentHTML('afterBegin',htm_txt);break;
				case 'end':
				case 'beforeEnd':
					e.insertAdjacentHTML('beforeEnd',htm_txt);break;
				case 'after':
				case 'afterEnd':
					e.insertAdjacentHTML('afterEnd',htm_txt);break;
				default: e.insertAdjacentHTML('beforeEnd',htm_txt);break;
			}
		}else{
			switch(position){
				case 'before':
				case 'beforeBegin':
					var r=e.ownerDocument.createRange();
					r.setStartBefore(e);
					var f=r.createContextualFragment(htm_txt);
					e.parentNode.insertBefore(f, e);
					break;
				case 'begin':
				case 'afterBegin':
					e.innerHTML = htm_txt +e.innerHTML ;
					break;
				case 'end':
				case 'beforeEnd':
					e.innerHTML += htm_txt ;
					break;
				case 'after':
				case 'afterEnd':
					var r=e.ownerDocument.createRange();
					r.setStartBefore(e);
					var f=r.createContextualFragment(htm_txt);
					if(e.nextSibling) e.parentNode.insertBefore(f, e.nextSibling);
					else e.parentNode.appendCild(f);
					break;
				default: e.innerHTML += htm_txt ;break;
			}
		}
		//pjson.activateXLinks(e);
		return pjson;
	};
	pjson.exeJsInHtml=function(s, ob){ //执行内嵌在HTML的JS代码
		s = s.replace(/<SCRIPT[^>]*>\s*<\/SCRIPT>/ig,'');//删除引用外部的js
		var reg=/<SCRIPT[^>]*>([\s\S]+?)<\/SCRIPT>/ig;
		var scripts=s.match(reg);
		var script='';
		if(ob)pjson.obStart();
		try{
			if(scripts){
				for(var i=0;i<scripts.length;i++){
					try{
						reg=/<SCRIPT[^>]*>\s*(<!--)?([\s\S]+?)<\/SCRIPT>/ig;
						script=reg.exec(scripts[i]);
						if(script[2]){
							if(isIE)window.execScript(script[2], 'JavaScript');
							else window.eval(script[2])
						}
						if(ob)s =  s.replace(reg, pjson.obGetClean());
					}catch(e){
						pjson.debugMsg(e+'执行相关代码:\n'+script[2]); 
					}
				}
			}
		}
		catch(e){}
		pjson.obEnd();
		return s;
	};
	pjson.loadJs=function(url){
		pjson.debugMsg('载入JS文件:'+url); 
		var e = document.createElement('SCRIPT');
		e.src=url;
		document.body.appendChild(e);
	};
	pjson.loadCSS=function(url){
		pjson.debugMsg('载入CSS文件:'+url); 
		var e = document.createElement('LINK');
		e.href=url;
		e.rel='stylesheet';
		e.type='text/css';
		document.documentElement.firstChild.appendChild(e);
	};
	//ob function
	pjson._ob_buffer='';
	pjson.write=document.write ;
	pjson.writeln=document.writeln ;
	pjson.obStart=function(){
		document.write=function(s){
			pjson._ob_buffer+=s;
		}
		document.writeln=function(s){
			pjson._ob_buffer+=s+"\r\n";
		}
	};
	pjson.obGetClean=function(){
		var result=pjson._ob_buffer;
		this._ob_buffer='';
		return result;
	};
	pjson.obEnd=function(){
		document.write=pjson.write;
		document.writeln=pjson.writeln;
	};

	//-------------------xlink------------------------
	pjson._xLinkClick=function (e)
	{
		//调用用户原来的onclick处理方法
		var clickResult;
		try{
			if(this._onclick) clickResult = this._onclick(); 
		}
		catch(err){
			pjson.debugMsg(err);
		}
		if((undefined == clickResult) || clickResult){
			var url = this.href;
			if(0==url.toLowerCase().indexOf('javascript:')){
				var js = url.substring(11);
				if(isIE){
					window.execScript(js);
				}else{
					eval(js);
				}
				return false;
			}
			var json_type=this.getAttribute('json');
			if('undefined'!=typeof json_type && null!=json_type){
				var silent=0, normal=1, refresh=2;
				var callback=function(s,x){
					switch(json_type.toLowerCase()){
						case silent: case 'silent':break;
						case refresh:case 'refresh':window.location.reload(); break;
						case normal: case 'normal' :
						default: pjson.jsonHandler(s); break;
					}
				};
				pjson.get(this.href,callback);
				return false;
			}
			var target =  this.getAttribute('target');
			var at =  this.getAttribute('at');
			//目标元素不存在时, 在当前链接后加入
			if(!pjson.find(target)) pjson.insertHtml('afterEnd', '<SPAN id="'+target+'"></span>');
			
			var callback2=function(s,x){
				switch(at){
					case 'before':case 'begin':case 'end':case 'after':
					case 'beforeBegin':case 'afterBegin':case 'beforeEnd':case 'afterEnd':
						pjson.insertHtml(at,pjson.exeJsInHtml(s, true),pjson.find(target));
						break;
					default: pjson(target).html(s);break;
				}
				
				pjson.activateXLinks(target);
			};
			pjson.get(this.href, callback2);
		}
		return false;
	};
	pjson._checkXwin=function(element)
	{
		try{
			var as = element.getElementsByTagName('A');
		}catch(e){
			return;
		}
		if(as) for(var i=as.length-1;i>=0;i--){
			var a = as[i]; 
			if(pjson._xLinkClick == a.onclick) continue;
			if(undefined != a.getAttribute('json')){
				if(a.onclick){
					a._onclick= a.onclick; 
				}
				a.onclick=pjson._xLinkClick;
				continue;
			}
			if(undefined==a.getAttribute('at') || a.getAttribute('target')) continue;
			a.target= element.id;
			a.onclick=pjson._xLinkClick;
			//a.setAttribute('target', element.id);
		}
	};

	pjson.activateXLinks=function(target)
	{
		try{
			target=	 pjson.find(target);
			var as = target.getElementsByTagName('A'), targetId=target.id;
			for(var i=as.length-1;i>=0;i--){
				var a = as[i];
				if(a.onclick==pjson._xLinkClick || undefined==a.getAttribute('at'))continue;
				if(! a.getAttribute('target')) 
					a.setAttribute('target', targetId);
				if(a.onclick){
					a._onclick = a.onclick;
				}
				a.onclick=pjson._xLinkClick;
			}
		}catch(e){
		}
	};

	pjson._checkXLink=function (e)
	{
		//	if('complete'==document.body.readyState){
		//		checkAllXLinks();
		//		if(isIE)document.detachEvent('onmousedown', checkXLink);
		//		else document.removeEventListener('mousedown', checkXLink,false);
		//		return;
		//	}
		if(isIE)var a =event.srcElement;
		else var a=e.target;
		while(a && a.tagName!='A') a=a.parentNode;
		if(!a || pjson._xLinkClick==a.onclick ) return;
	

		if(undefined != a.getAttribute('json')){
			if(a.onclick){
				a._onclick= a.onclick; 
			}
			a.onclick=pjson._xLinkClick;
		}else if(undefined!=a.getAttribute('at')){
			if(!a.getAttribute('target')){
				for(var p=a.parentNode; p!=document.body && p!=null; p = p.parentNode){
					if(undefined != p.getAttribute('xwin') && p.id){
						a.setAttribute('target', p.id);
						break;
					}
				}
			} 
			if(!a.getAttribute('target')) return;//找不到默认的显示元素

			if(a.onclick){
				a._onclick= a.onclick; 
			}
			a.onclick=pjson._xLinkClick;
		}

	};
	//-------------------------x link end---------------------------------

	pjson.inArray=function(search, a){
		for(var i=0;i<a.length;i++){
			if(a[i]==search) return true;
		}
		return false;
	};
	//-------------------------------------------------------------------
	//将对象obj放在对象relateElement周围
	pjson.popAround=function(obj,relateElement,position){
		obj=pjson.find(obj);
		relateElement=pjson.find(relateElement);
		if(!obj || !relateElement) return;
		obj.style.display='block';
		var ow=obj.offsetWidth;
		var oh=obj.offsetHeight;
		var rw=relateElement.offsetWidth;
		var rh=relateElement.offsetHeight;
		var p=pjson.pos(relateElement);
		var dl = document.body.scrollLeft || document.documentElement.scrollLeft;
		var dt = document.body.scrollTop || document.documentElement.scrollTop;

		var w =  document.documentElement.clientWidth || document.body.clientWidth;
		var h =  document.documentElement.clientHeight || document.body.clientHeight;
		var x=p.x, y=p.y;
		if('string' !== typeof position) position='BT';
		switch(position.toUpperCase()){
			case 'L': x -= 1+ow; if(y+oh>dt+h) y=y-oh+rh;	break;
			case 'T': y -= 1+oh; if(x+ow>dl+w) x=x-ow+rw;	break;
			case 'R': x += 1+rw; if(y+oh>dt+h) y=y-oh+rh;	break;
			case 'B': y += 1+rh; if(x+ow>dl+w) x=x-ow+rw;	break;

			case 'LR':if(x-ow>dl) x-=1+ow; else x += 1+rw; if(y+oh>dt+h) y=y-oh+rh;	break;
			case 'RL':if(x+rw+ow<dl+w) x+=1+rw; else x -= 1+ow; if(y+oh>dt+h) y=y-oh+rh;	break;

			case 'TB':if(y-oh>dt) y-=1+oh; else y += 1+rh; if(x+ow>dl+w) x=x-ow+rw;	break;
			case 'BT':	
			default: if(y+rh+oh<dt+h) y+=1+rh; else y -= 1+oh; if(x+ow>dl+w) x=x-ow+rw; break;
		}
		obj.style.left=x+'px';
		obj.style.top=y+'px';
	};
	//将对象obj放在点point周围
	/*
		pjson.popAt(obj,{x:0,y:0})
		pjson.popAt(obj,x,y})
	*/
	pjson.popAt=function(obj,px,py){
		obj=pjson.find(obj);
		obj.style.display='block';
		var ow=obj.offsetWidth;
		var oh=obj.offsetHeight;
		var x=px, y=py;
		if('number'!==typeof px){
			x=px.x;
			y=px.y;
		}

		var scrollLeft = document.body.scrollLeft || document.documentElement.scrollLeft;
		var scrollTop = document.body.scrollTop || document.documentElement.scrollTop;

		var w = document.documentElement.clientWidth || document.body.clientWidth;//(document.documentElement.clientWidth) ? 
		if(x+ow>scrollLeft+w) x-= ow;

		var h = document.documentElement.clientHeight || document.body.clientHeight;
		if(y+oh > scrollTop+h) y -= oh;

		obj.style.left=x+'px';
		obj.style.top=y+'px';
	};
	//拾色器
	pjson.pickColor=function(param){
		var result=param.result;//结果显示对象
		var callback=param.callback;//回调函数 function(color, param){}
		var p=param.point;//面板位置x与y, 不传此参数时, 在放在 result 周围. 如 result 也为空时, 放在鼠标位置
		//--
		var obj = pjson.find('LTQColorPickerPanel');
		if(null==obj){
			var w='211';
			obj= document.createElement('DIV');
			obj.id='LTQColorPickerPanel';
			obj.style.width='211px';//1+21*10;
			obj.style.minHeight= '150px';
			if(isIE6) obj.style.height= '165px';
			obj.style.padding='1px 0px';
			obj.style.position='absolute';
			obj.style.display='none';
			obj.style.overflow='visible';
			obj.style.zIndex='1';

			var colorTableFiller=function(b){
				var ColorHex=['00','33','66','99','CC','FF'];
				var SpColorHex=['FF0000','00FF00','0000FF','FFFF00','00FFFF','FF00FF'];
				var colorTable='<table width="'+w+'" cellpadding=0 ';
				colorTable += isIE ? 'cellspacing=1 border=0 bgcolor="#000000;" ':'cellspacing=0 border=1  ';
				if(isIE){
					colorTable += b?' >':'style="display:none" >';
				}else{
					colorTable += b?' style="border-collapse:collapse;" >':'style="border-collapse:collapse;display:none;" >';
				}
				for (i=0;i<2;i++){
					for (j=0;j<6;j++){
						colorTable += '<tr height=10>';
						colorTable += '<td bgcolor="#000000" ></td>';

						if (i>0) colorTable += '<td bgcolor="#'+SpColorHex[j]+'"></td>';
						else colorTable += '<td bgcolor="#'+ColorHex[j]+ColorHex[j]+ColorHex[j]+'"></td>';

						colorTable += '<td bgcolor="#000000"></td>';
						for (k=0;k<3;k++){
							for (l=0;l<6;l++){
								if(b){//立方色
									colorTable += '<td bgcolor="#'+ColorHex[k+i*3]+ColorHex[l]+ColorHex[j]+'"></td>';
								}else{ //连续色
									var c1 = 4+i-k*2;
									var c2 = i*j + (1-i)*(5-j);// i?j:5-j
									var c3 = k!=1? 5-l:l;      //k!=1? 5-l:l;
									colorTable += '<td bgcolor="#'+ColorHex[c1]+ColorHex[c2]+ColorHex[c3]+'"></td>';
								}
							}
						}
						colorTable += '</tr>';
					}
				}
				colorTable +='</table>';
				return colorTable;
			}
			var html='<div style="background:#CECECE; padding:5px 3px 5px 2px;border-width:1px;border-style:solid solid none solid; border-color:#000000;">'+
				'<input type="button" value="&lt;-&gt;" style="float:right" onclick="var t=this.parentNode.nextSibling; if(t.style.display==\'none\'){t.style.display=\'\';t.nextSibling.style.display=\'none\'}else{t.style.display=\'none\';t.nextSibling.style.display=\'\'}" />'+
				'<input id="colorViewer" style="background:#FF6699;width:60px; border:solid 1px #797979;margin:0px 5px" disabled="true" />'+
				'<input id="hexColor" size="7" onblur="this.previousSibling.style.backgroundColor=this.value" readonly />'+
				'</div>'+ colorTableFiller(0) + colorTableFiller(1);
			obj.innerHTML=html;

			document.body.appendChild(obj);
			obj.onmouseover=function(){this.active=true;};
			obj.onmouseout=function(){this.active=false;};
			pjson.addListener(document,'mousedown',function(){var o=pjson.find('LTQColorPickerPanel');if(!o.active)o.style.display='none';});
			
			var _cellMouseOver=function(){
				var p=this.parentNode.parentNode.parentNode.parentNode.firstChild;
				p.firstChild.nextSibling.style.backgroundColor=this.bgColor;
				//p.lastChild.innerHTML=this.bgColor;
				p.lastChild.value=this.bgColor;

				this.style.backgroundColor='#FFFFFF';
				var self=this;
				var iid = window.setInterval(function(){self.style.backgroundColor=(self.style.backgroundColor!='')?'':'#FFFFFF'},500);
				this.onmouseout=function(){window.clearInterval(iid);this.style.backgroundColor='';}
			};
			var cells = obj.getElementsByTagName('TD');
			for(var i=cells.length-1;i>=0;i--){
				pjson.addListener(cells[i],'mouseover',_cellMouseOver);
				pjson.addListener(cells[i],'mouseup',pjson.hideColorPicker);
			}
		}
		//obj.targetObj=pjson.find(result);
		var cellMouseDown=function(){ 
			var o=pjson.find(result);//this.parentNode.parentNode.parentNode.parentNode.targetObj;
			if(o) o.value=this.bgColor;
			if('function'===typeof callback) callback(this.bgColor, param);
		};
		var cells = obj.getElementsByTagName('TD');
		for(var i=cells.length-1;i>=0;i--){
			cells[i].onmousedown=cellMouseDown;
		}

		if(param.point){ //放在指定的点
			pjson.popAt(obj, param.point);
		}else if(result){ //放在结果对象周围
			pjson.popAround(obj, result);
		}else{ //放在鼠标位置
			pjson.popAt(obj, {'x':event.clientX+document.body.scrollLeft + document.documentElement.scrollLeft, 'y':event.clientY + document.body.scrollTop + document.documentElement.scrollTop });
		}
	};
	pjson.hideColorPicker=function(){
		pjson.hide('LTQColorPickerPanel');
	};
	//日期选择
	pjson.pickDate=function(param){
		var result=param.result;//结果显示对象
		var callback=param.callback;//回调函数 function(ymd, param){}
		var onChangeYM=param.onChangeYM;//更改显示月份时回调函数 function(year, month){}
		var p=param.point;//面板位置x与y, 不传此参数时, 在放在 result 周围. 如 result 也为空时, 放在鼠标位置
		var lng=param.language;//语言
		var css=param.css;//自定义的样式网址
		var format=param.format;//
		/*
			Y 4位数字完整表示的年份 
			m 2位数字表示的月份, 01 到 12 
			d 2位月份中的第几天, 01 到 31 
			H 2位小时, 24 小时格式, 00 到 23 
			i 2位分钟数,00 到 59
			s 2位秒数,00 到 59 
		*/
		//--
		if('undefined'===typeof format || !format) format='Y-m-d';//Ymd H:i:s
		var obj = pjson.find('LTQDatePickerPanel');
		if(null==obj){
			obj= document.createElement('DIV');
			obj.id='LTQDatePickerPanel';
			obj.style.minWidth='176px';
			obj.style.minHeight= '100px';
			if(isIE6){
				obj.style.width= '176px';
				obj.style.height= '100px';
			}
			obj.style.padding='1px 0px';
			obj.style.position='absolute';
			obj.style.left='0px';
			obj.style.top='0px';
			obj.style.display='block';
			obj.style.overflow='visible';
			obj.style.zIndex='1';
			obj.innerHTML='<iframe frameborder=0 scrolling=no width="100%" ></iframe>';
			document.body.appendChild(obj);
			obj.onmouseover=function(){this.active=true;};
			obj.onmouseout=function(){this.active=false;};
			pjson.addListener(document,'mousedown',function(){var o=pjson.find('LTQDatePickerPanel');if(!o.active)o.style.display='none';});

			var doc = obj.firstChild.contentDocument || obj.firstChild.contentWindow.document;
			obj.doc=doc;
			if(!lng){
				var sl=	navigator.systemLanguage || navigator.language;
				if(sl.indexOf('zh-tw')) lng='cn';
				else if(sl.indexOf('en')) lng='en';
				else lng='cn';
			}
			var lg={};
			switch(lng){
				case 'en':
					lg.weeks=['sun','mon','tur','web','thu','fri','sat'];
					lg.months=['Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec'];
					lg.today='Today';
					lg.ok='OK';
				break;
				case 'cn':
				default:
					lg.weeks=['日','一','二','三','四','五','六'];
					lg.months=['一月','二月','三月','四月','五月','六月','七月','八月','九月','十月','十一','十二'];
					lg.today='今天';
					lg.ok='确定';
			}

			var s='<html><head><title></title><style>'+
				'*,body { font-size: 14px;padding:0;margin:0; cursor:default; }\n'+
				'caption {background:#FFF;border:1px solid #3CC;border-bottom:none;}\n'+
				'.e { text-align: center; border: 1px solid #FFF; }\n'+
				'.e:focus { border: 1px solid #666; }\n'+
				'.ct { background: #3CC; }\n'+
				'th { height: 22px; background: #CBDEFE; line-height: 22px; cursor: default; font-weight: normal; }\n'+
				'td { background: #FFF; text-align: center; }\n'+
				'#y,#m {padding:3px auto 0 auto; }\n'+
				'#m {width:30px; }\n'+
				'#h,#i,#s {width:24px; }\n'+
				'.c { background: #DEEAFE; }\n'+
				'.c td { height: 18px; width: 24px; line-height: 16px; cursor: pointer; }\n'+
				'#monthSelect{display:none;position:absolute;top:22px;left:1px;background:#FFF; z-index:1;}'+
				'#monthSelect td:hover{background:#D2E9FF; }\n'+
				'td.today { background: #FCF; color: #36C; font-weight: normal; }\n'+
				'td.sun, td.sat { color: #F00; }\n'+
				'</style>'+
				'<link href="" id="userCSS" rel="stylesheet" type="text/css" />'+
				'</head>\n\n<body>'+
				'<table border="0" cellspacing="1" class="ct" id="ct" >'+
				'<caption><table width="100%" border="0" align="center" cellpadding="3" cellspacing="1">'+
				'<tr>'+
				'<td width="20" onclick="this.ownerDocument.incYear(-1);" style="cursor: pointer;">&laquo;</td>'+
				'<td width="20" onclick="this.ownerDocument.incMonth(-1);" style="cursor: pointer;">&lsaquo;</td>'+
				'<td nowrap><input name="y" type="text" class="e" id="y" value="" size="4" maxlength="4">-<input name="m" type="text" class="e" id="m" value="" size="2" maxlength="2"></td>'+
				'<td width="20" onclick="this.ownerDocument.incMonth(1);" style="cursor: pointer;">&rsaquo;</td>'+
				'<td width="20" onclick="this.ownerDocument.incYear(1);" style="cursor: pointer;">&raquo;</td>'+
				'</tr></table></caption>'+
				'<thead><tr>';
			for(var i=0;i<7;i++){
				s +='<th>'+lg.weeks[i]+'</th>';
			}
			s +='</tr></thead><tbody class="c" id="cbody">';
			for(var i=6;i>0;i--){
				s +='<tr><td style="color:red;"></td><td></td><td></td><td></td><td></td><td></td><td style="color:red;"></td></tr>';
			}
			s +='</tbody><tfoot><tr><td colspan="7">'+
				'<span id=t style="float:left;"><input type="text" id="h" value="00" size=2 maxlength=2 style="text-align:center;" />'+
				':<input type="text" id="i" value="00" size=2 maxlength=2 style="text-align:center;" />'+
				':<input type="text" id="s" value="00" size=2 maxlength=2 style="text-align:center;" />'+
				'&nbsp;</span>'+
				'<button id="btnToday" >'+lg.today+'</button>'+
				//'<button id="btnOk" >'+lg.ok+'</button>'+
				'</td></tr></tfoot></table>';
			//month select
			s+='<table cellpadding="5" id="monthSelect" >';
			for(var i=0;i<4;i++){
				s+='<tr>'
				for(var j=0;j<3;j++){
					s +='<td height=32 onclick="var d=this.ownerDocument;d.find(\'m\').value='+(1+i*3+j)+';d.ymChange();d.find(\'monthSelect\').style.display=\'none\';">'+lg.months[i*3+j]+'</td>';
				}
				s+='</tr>'
			}
			s+='</table>';

			s+='</body></html>';
			doc.open();
			doc.write(s);
			doc.close();
			//---
			doc.find=doc.getElementById;
			doc.returnYMD=function(y,m,d){
				var p=function(n){n=parseInt(n);return (n<10)?'0'+n:n; };
				var h=this.find('h').value;
				var i=this.find('i').value;
				var s=this.find('s').value;
				m=p(m); d=p(d); h=p(h); i=p(i);	s=p(s);
				var ymdhis=this.format.replace('Y',y).replace('m',m).replace('d',d).replace('H',h).replace('i',i).replace('s',s);
				if(this.resultElement){
					this.resultElement.value=ymdhis;
				}
				if('function'==typeof this.callback){
					this.callback(ymdhis,y,m,d,h,i,s);
				}
				this.container.style.display='none';
			};
			doc.incYear=function(delta){var y=delta+parseInt(this.find('y').value);this.showYM(y,parseInt(this.find('m').value));}
			doc.incMonth=function(delta){
				var y=parseInt(this.find('y').value);
				var m=delta+parseInt(this.find('m').value);
				if(m>12) {y ++;m=1;}
				else if(m<1){y--; m=12;}
				this.showYM(y,m);
			};
			doc.ymChange=function(){this.updateYM(parseInt(this.find('y').value),parseInt(this.find('m').value));}
			doc._parseTime=function(d,format){
				var a,f,result={};
				var r=/[YmdHis]/;
				var rYear=/[0-9]{4}/;
				var rX=/[0-9]{2}/;

				while(f = r.exec(format)){
					format = format.substr(f.index+f[0].length, format.length);
					var name=f[0];
					if('Y'==name){
						a=rYear.exec(d);
					}else{
						a=rX.exec(d);
					}
					if(!a) continue;
					result[name]=a[0];
					d=d.substr(a.index+a[0].length, d.length);
				}
				return result;
			};
			doc.showTime=function(datetime_str){
				this.find('monthSelect').style.display='none';
				var format=this.format;
				this.find('t').style.display=(format.indexOf('H')>=0 || format.indexOf('i')>=0 || format.indexOf('s')>=0) ?'':'none';
				//if(''== datetime_str){
					var d = new Date();
					this.showYM(d.getFullYear(),1+d.getMonth());
					this.find('h').value=d.getHours();
					this.find('i').value=d.getMinutes();
					this.find('s').value=d.getSeconds();
				//}
				if(''!=datetime_str){
					var t  =this._parseTime(datetime_str,format);
					if(!t) return;
					if(t.Y) this.find('y').value=t.Y;
					if(t.m) this.find('m').value=t.m;
					if(t.H) this.find('h').value=t.H;
					if(t.i) this.find('i').value=t.i;
					if(t.s) this.find('s').value=t.s;
					this.updateYM(t.Y,t.m);
				}
			};
			doc.showYM=function(y,m){
				if(this.find('y').value != y)this.find('y').value = y;
				if(this.find('m').value != m)this.find('m').value = m;
				this.updateYM(y,m);
			};
			doc.updateYM=function(y,m){
				if(!y || !m) return;
				m=parseInt(m,10);
				var d = new Date();
				var di=0,todayY=d.getFullYear(),todayM=1+d.getMonth(),todayD=d.getDate();
				d.setYear(y);
				d.setMonth(m-1);
				d.setDate(1); 
				var weekday=d.getDay(); 
				var md=[31,31,28,31,30,31,30,31,31,30,31,30,31];
				var ds=md[m],pds=md[m-1];  //本月天数,上月天数
				switch(m){
					case 2: if(0==y%400 || (0==y%4 && y%100)) ds++; break;
					case 3: if(0==y%400 || (0==y%4 && y%100)) pds++; break;
				}
				var py=y,pm=m-1,ny=y,nm=m+1;
				if(0==pm){py--;pm=12;}
				if(13==nm){ny++;nm=1;}
				var rows = this.find('cbody').rows;
				for(var i=0;i<6;i++){
					var cells=rows[i].cells;
					for(var j=0;j<7;j++){
						di++;
						var c=cells[j];
						if(di<=weekday){
							c.innerHTML=1+pds-weekday+j;
							c.style.color='#999';
							c.year=py;
							c.month=pm;
							c.date=1+pds-weekday+j
						}else if(di>ds+weekday){
							c.innerHTML=di-ds-weekday;
							c.style.color='#999';
							c.year=ny;
							c.month=nm;
							c.date=di-ds-weekday;
						}else{
							c.innerHTML=di-weekday;
							c.style.color= (j==0||6==j)?'red':'';
							c.year=y;
							c.month=m;
							c.date=di-weekday;
						}
						c.style.background= (c.date==todayD && c.month==todayM && c.year==todayY)?'#FFFF66':'#FFFFFF' ;
						c.onclick=function(){var d=this.ownerDocument;d.returnYMD(this.year,this.month,this.date);};
						//c.onmouseover=function(){this.style.background='#FCF';};
						//c.onmouseout=function(){this.style.background='#FFF';};
					}
				}
				if(this.onChangeYM)	this.onChangeYM(y,m);
			};
			doc.onChangeYM=null;
			doc.onkeydown=function(e){var c=isIE ? this.parentWindow.event.keyCode : e.which;
				switch(c){
					case 37:this.incMonth(-1);break;
					case 38:this.incYear(-1);break;
					case 39:this.incMonth(1);break;
					case 40:this.incYear(1);break;
				}
			};
			doc.showSM=function(){this.find('monthSelect').style.display='block';};
			doc.hideSM=function(){this.find('monthSelect').style.display='none';this.onmouseup=null;};
			//--
			var w =  doc.body.firstChild.offsetWidth;
			var h = isIE ? doc.body.firstChild.offsetHeight : doc.body.offsetHeight;
			var e = obj.firstChild;
			e.style.height=h+'px';
			e.style.width=w+'px';
			//--
			e=doc.find('monthSelect');
			e.style.width=(w-2)+'px';
			//--
			e=doc.find('y');
			e.style.imeMode='disabled';
			var funcFocus=function(){this.style.borderColor='#c0c0c0';}
			var funcBlur=function(){this.style.borderColor='#FFF';}
			if(isIE){
				pjson.addListener(e,'focus',funcFocus);
				pjson.addListener(e,'blur',funcBlur);
			}
			e.onkeypress=function(e){var c=isIE ? this.ownerDocument.parentWindow.event.keyCode  : e.which; return c>=48 && c<=57;}
			e.onkeyup=function(){this.ownerDocument.ymChange();};
			//--
			e=doc.find('m');
			e.style.imeMode='disabled';
			if(isIE){
				pjson.addListener(e,'focus',funcFocus);
				pjson.addListener(e,'blur',funcBlur);
			}
			e.onkeypress=function(e){var c=isIE ? this.ownerDocument.parentWindow.event.keyCode  : e.which; c-=48;if(c<0||c>9) return false;if(c==0) this.value='1';else if(c>2 || this.value!='1') this.value='';}
			e.onkeyup=function(){this.ownerDocument.ymChange();};
			e.onfocus=function(){this.ownerDocument.showSM();this.ownerDocument.onmouseup=null;};
			e.onblur=function(){this.ownerDocument.onmouseup=this.ownerDocument.hideSM;};
			//--
			e=doc.find('h');
			e.style.imeMode='disabled';
			e.onkeypress=function(e){var c=isIE ? this.ownerDocument.parentWindow.event.keyCode  : e.which; c-=48;if(c<0||c>9) return false;if(c>3 || this.value>2) this.value='';else if(''!=this.value) this.value=parseInt(this.value);};
			e.onblur=function(){if(this.value.length<2) this.value='0'+this.value;}
			//--
			e=doc.find('i');
			e.style.imeMode='disabled';
			e.onkeypress=function(e){var c=isIE ? this.ownerDocument.parentWindow.event.keyCode  : e.which; c-=48;if(c<0||c>9) return false;if(this.value>5) this.value='';else if(''!=this.value) this.value=parseInt(this.value);};
			e.onblur=function(){if(this.value.length<2) this.value='0'+this.value;}
			//--
			e=doc.find('s');
			e.style.imeMode='disabled';
			e.onkeypress=function(e){var c=isIE ? this.ownerDocument.parentWindow.event.keyCode  : e.which; c-=48;if(c<0||c>9) return false;if(this.value>5) this.value='';else if(''!=this.value)  this.value=parseInt(this.value);};
			e.onblur=function(){if(this.value.length<2) this.value='0'+this.value;}
			//--
			e=doc.find('btnToday');
			e.onclick=function(){var d = new Date(); this.ownerDocument.returnYMD(d.getFullYear(),1+d.getMonth(),d.getDate());}
			//--
			if(isIE){
				var cells=doc.find('monthSelect').cells;
				for(var i=cells.length-1;i>=0;i--){
					cells[i].onmouseover=function(){this.style.background='#d2e9ff';}
					cells[i].onmouseout=function(){this.style.background='#fff';}
				}
			}
			if(isOpera || isGecko){
				var cells=doc.find('monthSelect').rows[0].cells;
				var wpx= Math.floor(w/3) +'px';
				for(var i=cells.length-1;i>=0;i--){
					cells[i].style.width=wpx;
				}
			}
			//doc.onmouseup=function(){this.find('monthSelect').style.display='none'}

		}
		obj.doc.find('userCSS').href=css;
		obj.doc.resultElement=result;
		obj.doc.callback=callback;
		obj.doc.onChangeYM=onChangeYM;
		obj.doc.container=obj;
		obj.doc.format=format;
		//var win = obj.doc.parentWindow || obj.doc.defaultView ;
		//win.focus();

		if(result){
			result = pjson.find(result);
			obj.doc.showTime(result.value);
		}else{
			obj.doc.showTime('');
		}

		if(param.point){ //放在指定的点
			pjson.popAt(obj, param.point);
		}else if(result){ //放在结果对象周围
			pjson.popAround(obj, result);
		}else{ //放在鼠标位置
			pjson.popAt(obj, event.clientX+document.body.scrollLeft + document.documentElement.scrollLeft, event.clientY + document.body.scrollTop + document.documentElement.scrollTop);
		}
	}
	//词输入
	pjson.asWordInput= function(obj)
	{
		obj.style.imeMode='disabled';
		obj.onkeypress=function(e){e=e || event; var c=e.keyCode||e.which; return (c>=65 && c<=90 || c>=97&&c<=122) || ''!=this.value &&(c>=48 && c<=57 || c==95);};
		obj.onpaste=function(){return ! clipboardData.getData('text').match(/[^a-z0-9_]/i);};
		obj.ondragenter=function(){return  /[^a-z0-9_]/i.test(event.dataTransfer.getData('text'));};
	}
	//整数输入
	pjson.asIntInput= function(obj)
	{
		obj.style.imeMode='disabled';
		obj.onkeypress=function(e){e=e || event; var c=e.keyCode||e.which; if(45==c){this.value = ('-'==this.value.charAt(0))? this.value.substr(1) : '-'+this.value; return false; }return c>=48&&c<=57;}
		obj.onpaste=function(){return !clipboardData.getData('text').match(/\D/);}
		obj.ondragenter=function(e){ return ! /\D/.test(event.dataTransfer.getData('text'));}
		if(!obj.oldBlur) obj.oldBlur=obj.onblur;
		obj.onblur=function(){if(''==this.value) this.value='0'; this.value=parseInt(this.value,10);var max = this.getAttribute('max'); var min= this.getAttribute('min');if(max!=undefined && parseInt(this.value,10)>parseInt(max,10))this.value=parseInt(max,10);if(min!=undefined && parseInt(this.value,10)<parseInt(min,10))this.value=parseInt(min,10); if(this.oldBlur)this.oldBlur();}
	}
	//数字输入
	pjson.asNumberInput=function(obj)
	{
		obj.style.imeMode='disabled';
		obj.onkeypress=function(e){e=e || event; var c=e.keyCode||e.which; if(45==c){this.value = ('-'==this.value.charAt(0))? this.value.substr(1) : '-'+this.value; return false; } return c>=48&&c<=57||(c==46 && this.value.indexOf('.')<0)} 
		obj.onpaste=function(){var r= this.value.indexOf('.')<0 ? /^[0-9]+(\.[0-9]*)?$/ : /^[0-9]+$/; return  r.test(clipboardData.getData('text'));} 
		obj.ondragenter=function(){var r= this.value.indexOf('.')<0 ? /^[0-9]+(\.[0-9]*)?$/ : /^[0-9]+$/; return  r.test(event.dataTransfer.getData('text'));}
		if(!obj.oldBlur)obj.oldBlur=obj.onblur;
		obj.onblur=function(){if(''==this.value) this.value='0';this.value=parseFloat(this.value);var max = this.getAttribute('max'); var min= this.getAttribute('min');if(max!=undefined && parseFloat(this.value)>parseFloat(max))this.value=parseFloat(max);if(min!=undefined && parseFloat(this.value)<parseFloat(min))this.value=parseFloat(min); if(this.oldBlur)this.oldBlur();}
	}
	//匹配输入
	pjson.asMatchInput=function(obj)
	{
		obj.style.imeMode='disabled';
		obj.chars=obj.getAttribute('chars');
		obj.onkeypress=function(e){e=e || event; var c=e.keyCode||e.which; return this.chars.indexOf(''.fromCharCode(c))>=0;} 
	}
	//金钱输入
	pjson.asMoneyInput=function(obj)
	{
		obj.style.imeMode='disabled';
		obj.oldvalue=obj.value;
		obj.onkeypress=function(e){e=e || event; var c=e.keyCode||e.which; return c>=48&&c<=57||(46==c && this.value.indexOf('.')<0);}
		obj.onfocus=function(){if(this.oldvalue==null)this.oldvalue=this.value;}
		if(!obj.oldBlur)obj.oldBlur=obj.onblur;
		obj.onblur=function(){if(/^\d+\.$/.test(this.value)) this.value=parseInt(this.value,10); else if(/^\.[0-9]{0,2}$/.test(this.value)) this.value='0'+this.value;var max = this.getAttribute('max'); var min= this.getAttribute('min');if(max!=undefined && parseFloat(this.value)>parseFloat(max))this.value=parseFloat(max);if(min!=undefined && parseFloat(this.value)<parseFloat(min))this.value=parseFloat(min); if(this.oldBlur)this.oldBlur();}
		obj.onpaste=function(){
			var r= this.value.indexOf('.')<0 ? /^[0-9]+(\.[0-9]*)?$/ : /^[0-9]+$/;
			return  r.test(clipboardData.getData('text'));
		}
		obj.ondragenter=function(){
			var r= this.value.indexOf('.')<0 ? /^[0-9]+(\.[0-9]*)?$/ : /^[0-9]+$/; 
			return  r.test(event.dataTransfer.getData('text'));
		}
		obj.onpropertychange=function(){
			if(this.oldvalue!=this.value){
				var r=/^\.[0-9]{0,2}$/;	  // .12
				if(r.test(this.value)){
					//this.value='0'+this.value;
					this.oldvalue= this.value;
				}else{
					var r1=/^\d*$/;
					var r2=/^\d+\.\d{0,2}$/; 
					if(r1.test(this.value) || r2.test(this.value)) this.oldvalue=this.value; 
					else this.value=this.oldvalue;
				}
			}
		}
	}
	//文件名输入, 允许字符:"a-zA-Z0-9_."
	pjson.asFilenameInput=function(obj)
	{
		obj.style.imeMode='disabled';
		obj.onkeypress=function(e){e=e || event; var c=e.keyCode||e.which;  return (c>=65 && c<=90 || c>=97&&c<=122) || ''!=this.value &&(c>=48 && c<=57 || 95==c || 46==c);}
		obj.onpaste=function(){return ! clipboardData.getData('text').match(/[^a-z0-9_\.]/i);}
		obj.ondragenter=function(){return  /[^a-z0-9_\.]/i.test(event.dataTransfer.getData('text'));}
	}
	//文件路径输入, 允许字符:"a-zA-Z0-9_/."
	pjson.asFilepathInput=function (obj)
	{
		obj.style.imeMode='disabled';
		obj.onkeypress=function(e){e=e || event; var c=e.keyCode||e.which;  if(58==c){return ''!=this.value && this.value.indexOf(':')<0;} return (c>=65 && c<=90 || c>=97&&c<=122) || ''!=this.value &&(c>=48 && c<=57 || 95==c || 46==c || 47==c);}
		obj.onpaste=function(){return ! clipboardData.getData('text').match(/[^a-z0-9_\.\/]/i);}
		obj.ondragenter=function(){return  /[^a-z0-9_\.\/]/i.test(event.dataTransfer.getData('text'));}
		obj.onblur=function(){if(''==this.value)return ;var v = this.value;if('/'==v.charAt(v.length-1)){this.value = v.substring(0,v.length-1);}}
	}
	//目录输入,filepathEdit不同的时最后位置自动加上斜线, 允许字符:"a-zA-Z0-9_/."
	pjson.asDirInput=function (obj)
	{
		obj.style.imeMode='disabled';
		obj.onkeypress=function(e){e=e || event; var c=e.keyCode||e.which; if(58==c){return ''!=this.value && this.value.indexOf(':')<0;}  return (c>=65 && c<=90 || c>=97&&c<=122) || ''!=this.value &&(c>=48 && c<=57 || 95==c || 46==c || 47==c);}
		obj.onpaste=function(){return ! clipboardData.getData('text').match(/[^a-z0-9_\.\/]/i);}
		obj.ondragenter=function(){return  /[^a-z0-9_\.\/]/i.test(event.dataTransfer.getData('text'));}
		obj.onblur=function(){if(''!=this.value && '/'!=this.value.charAt(this.value.length-1)){this.value += '/';}}
	}

	//-------------------------------------------------------------------
	window.pj=pjson;
	if(isIE){document.attachEvent('onmousedown', pjson._checkXLink);}
	else {document.addEventListener('mousedown', pjson._checkXLink,false);}
}
//------------------------------end of PJson-------------------------------------

//下面gbk到utf-8的方法收集自网上,只支持IE, 作者不详
var glbEncode = [];
function gb2utf8(data)
{
	s = data;
	execScript("s = MidB(s, 1)+MidB(' ',1)", "VBScript");
	var t=escape(s).replace(/%u(.{2})(.{2})/g,"%$2%$1").replace(/%([A-Z].)%(.{2})/g,"@$1$2");  
	t=t.split("@");  
	var i=0,j=t.length,k;  
	while(++i<j){
		k=t[i].substring(0,4);
		if(!glbEncode[k]){
			gb2utf8_char = eval("0x"+k);
			execScript("gb2utf8_char = Chr(gb2utf8_char)", "VBScript");
			glbEncode[k]=escape(gb2utf8_char).substring(1,6);
		}
		t[i]=glbEncode[k]+t[i].substring(4);
	}
	s = gb2utf8_char = null;
	var result = unescape(t.join("%"));
	result=result.substr(0,result.length-1);
	return result;
}



//以下代码修正 Firefox与IE 不兼容问题(只是修正常用的方法与属性)
// 此代码, 部份源自 MTIR
function FixPrototypeForGecko()
{
	Event.prototype.__defineGetter__("srcElement",_getEventSrcElement);
	HTMLElement.prototype.__defineGetter__("runtimeStyle",_getRuntimeStyle);
	HTMLElement.prototype.__defineSetter__("outerHTML", _setOuterHtml);
	HTMLElement.prototype.__defineGetter__("outerHTML", _getOuterHtml);
	HTMLElement.prototype.__defineSetter__("innerText", _setInnerText);
	HTMLElement.prototype.__defineGetter__("innerText", _getInnerText);
	HTMLElement.prototype.__defineGetter__("children",  _getChildren);
	HTMLElement.prototype.insertAdjacentHTML = _insertHTML;
	HTMLElement.prototype.insertAdjacentElement = _insertElement;
	HTMLElement.prototype.insertAdjacentText = _insertText;
	HTMLElement.prototype.removeNode		 = _removeSelf;
	HTMLElement.prototype.attachEvent		 = _attachEvent;
	if(window.Node){
		Node.prototype.swapNode				 = _swapMe;
	}
	window.constructor.prototype.__defineGetter__("event",_getWindowEvent);
	Event.prototype.__defineGetter__("keyCode",function(){return this.which;});

}
function _attachEvent(eventName, handler)
{
	if('on'==eventName.substring(0,2)) eventName=eventName.substring(2);
	this.addEventListener(eventName.substr(2), handler,false);
}
function _getWindowEvent()
{
	return _searchEvent();
}
function _searchEvent()
{
	func=_searchEvent.caller;
	while(func!=null)
	{
		var arg0=func.arguments[0];
		if(arg0)
		{
			if(arg0.constructor==Event)
				return arg0;
		}
		func=func.caller;
	}
	return null;
}
function _getEventSrcElement()
{
	return this.target;
}
function _getRuntimeStyle()
{
	return this.style;
}
function htmlToTxt(s)
{
	return s.replace(/&/g,'&amp;').replace(/>/g,'&gt;').replace(/</g,'&lt;').replace(/ /g,'&nbsp;').replace(/\n/g,'<br />');
}
function _insertHTML(where,s)
{
	switch(where){
		case'beforeBegin':
			var range=this.ownerDocument.createRange();
			range.setStartBefore(this);
			var fragment=range.createContextualFragment(s);
			this.parentNode.insertBefore(fragment, this);
			break;
		case'afterBegin':this.innerHTML = s+this.innerHTML;break;
		//case'beforeEnd':break; //default
		case'afterEnd':
			var range=this.ownerDocument.createRange();
			range.setStartAfter(this);
			var fragment=range.createContextualFragment(s);
			this.parentNode.insertBefore(fragment, this.nextSibling);
			break;
		default: this.innerHTML += s;
			break;
	}
}
function _insertElement(where, element)
{
	switch(where){
		case'beforeBegin':
			this.parentNode.insertBefore(element, this);
			break;
		case'afterBegin':
			if(this.firstChild) this.insertBefore(element,this.firstChild);
			else this.appendChild(element) ;
			break;
		//case'beforeEnd': break; //default
		case'afterEnd':
			if(this.nextSibling)this.parentNode.insertBefore(element, this.nextSibling);
			else this.parentNode.appendChild(element) ;
			break;
		default: this.appendChild(element);
			break;
	}
}
function _insertText(where,s)
{
	s=htmlToTxt(s);
	switch(where){
		case'beforeBegin':
			var range=this.ownerDocument.createRange();
			range.setStartBefore(this);
			var fragment=range.createContextualFragment(s);
			this.parentNode.insertBefore(fragment, this);
			break;
		case'afterBegin':this.innerHTML = s+this.innerHTML;break;
		//case'beforeEnd':break; //default
		case'afterEnd':
			var range=this.ownerDocument.createRange();
			range.setStartAfter(this);
			var fragment=range.createContextualFragment(s);
			this.parentNode.insertBefore(fragment, this.nextSibling);
			break;
		default: this.innerHTML += s;
			break;
	}
}
function _setOuterHtml(s) {
	var range=this.ownerDocument.createRange();
	range.setStartBefore(this);
	var fragment=range.createContextualFragment(s);
	this.parentNode.replaceChild(fragment, this);
}
function _getOuterHtml() {
	var s='<span';
	var obj=this.attributes;
	for (i=0;i<obj.length;i++) {
		s+=' '+obj[i].nodeName+'="'+obj[i].nodeValue+'"';
	}
	s+='></span>';
	return s;
}
function _setInnerText(s) 
{
	this.innerHTML=htmlToTxt(s);
}
function _getInnerText() 
{
	return this.textContent;
}
function _getChildren()
{
	var returnValue = new Object(); 
	var number = 0; 
	for (var i=0; i<this.childNodes.length; i++) { 
		if (this.childNodes[i].nodeType == 1) { 
			returnValue[number++] = this.childNodes[i]; 
		} 
	} 
	returnValue.length = number; 
	return returnValue; 
}
function _removeSelf(removeChildren)
{
	s=(removeChildren)?'':this.innerHTML;
	this.outerHTML=s;
}
function _swapMe(node)
{
	var bn=node.cloneNode(true);
	this.parentNode.insertBefore(bn,this);
	node.parentNode.replaceChild(this,node);
}
if(!isIE) FixPrototypeForGecko();
//===============================兼容修正代码结束===============================

