/******************
dabten.js ver. 1.0.g
Copyright (c) Wataru Kanzaki, Wings-Winds, http://www.wi-wi.jp/, 2007-2008
http://dabten.wi-wi.jp/
******************/

/******************
Usage

Dabten.Load(
		{
		,template_id1:'tpldetail1.txt'
		,template_id2:'tpldetail2.tpl'
		,template_id3:'tpldetail3.html'
		}
		,
		{
		  onsuccess:callback
		}
	);

------------------------
Dabten.InsertDOM(element, template_id1, jsonData);

------------------------
{tpl::repeat /students}
<tr class="{tpl::evenodd}">
<td>{tpl:account}</td>
<td>{tpl:name}</td>
</tr>
{tpl::endrepeat}

{tpl::if id=2">
{tpl::elif id=3">
{tpl::else">
{tpl::endif">

{tpl:name}
{tpl:var}


/**********/
var Dabten;
if(!Dabten){
	Dabten={
		 tpls:{}
		,grps:[]
		,jsonp:{}
	};
}
/**********/
Dabten.Net={
	 msxmls : ["Msxml2.XMLHTTP.6.0", "Msxml2.XMLHTTP.5.0", "Msxml2.XMLHTTP.4.0", "Msxml2.XMLHTTP.3.0", "Msxml2.XMLHTTP.2.0", "Msxml2.XMLHTTP", "Microsoft.XMLHTTP"]
	,nsURI : "http://www.w3.org/1999/xhtml"
	,encodeUrl: "application/x-www-form-urlencoded"
	,encodeMultiForm: "multipart/form-data"
	,encodeMultiMixed: "multipart/mixed"
	,encodeXml: "application/xml"
	,dispositionName:'keywords'
	,dispositionMime:'text/plain'
	,disposition:'form-data'
	,CR:String.fromCharCode(13)
	,LF:String.fromCharCode(10)
	,CRLF:String.fromCharCode(13,10)
	,isAX:false
};//
/*****/
Dabten.Net.UA=function(){
	var agt   = navigator.userAgent.toLowerCase();
	var ua={};
	ua.ie      = (!!document.all && !window.opera);
	ua.op      = (!!document.all && !!window.opera);
	ua.gecko   = (agt.indexOf('gecko') != -1 && agt.indexOf('like gecko')==-1);
	ua.khtml   = (agt.indexOf('khtml')!=-1);
	ua.sf      = (agt.indexOf('applewebkit') != -1);
	ua.ic      = ((agt.indexOf('icab') != -1) || (!window.opera && !!navigator.systemLanguage && !!navigator.language)); // no onscroll
	delete agt;
	return ua;
}();

/*****/
Dabten.Net.CreateClient=function(){
	if(!!window.XMLHttpRequest){
		try{return new XMLHttpRequest();}catch(e){return null;}
	}else if(window.ActiveXObject){
		Dabten.Net.isAX=true;
		var req=null;
		while(Dabten.Net.msxmls[0]){
			try{
				req=new ActiveXObject(Dabten.Net.msxmls[0]);
			}catch(e){
				req=null;
			}
			if(!req){
				Dabten.Net.msxmls.shift();
			}else{
				return req;
			}
		}
	}
	return null;
};//
/*****/
Dabten.Net.Process=function(aj){
	if(aj.onabort)
		return false;
	if(!aj || !aj.client || (aj.client.readyState != 4))
		return false;
	
	var st=aj.client.status;
	if((st==200 || st==203 || (300<=st && st<400) || st==0) && aj.cbSuccess)
		aj.cbSuccess(aj);
	else if(st==206 && aj.cbSuccess){
		var boundary='';
		var boundReg=new RegExp(/boundary="?([^";,]+)"?/i); //"
		var cType=Dabten.Net.GetResponseHeaders(aj.client, 'Content-Type');
		var files=[];
		var tids=[];
		if(!!cType && cType.match(boundReg)!=null){
			boundary=cType.match(boundReg)[1];
			aj.ranges=Dabten.Net.Multipart.DevideDataMixed(aj.client.responseText, boundary, Dabten.Net.CRLF);
		}
		aj.cbSuccess(aj);
	}
	else if(st==404 && aj.cbFileNotFound)
		aj.cbFileNotFound(aj);
	else if(aj.cbError)
		aj.cbError(aj);
	
	return true;
};//
/*****/
Dabten.Net.Able=function(){
	var aj=new Dabten.Net.CreateClient();
	var result=!!aj;
	delete aj;
	return result;
}
/*****
Content-Type: text/plain; charset="UTF-8";
Content-Disposition: form-data; name="test2"; filename="test2.txt"
Content-X-Myheader: name="test2"; filename="test2.txt"
Content-Length: 23;

GetResponseHeaders(xmlHttpRequestObject, "Content-Type");
GetResponseHeaders(xmlHttpRequestObject, ["Content-Type","Content-Length"]);
GetResponseHeaders(xmlHttpRequestObject, ["Content-Type",[Content-Disposition, 'name'] ,['Content-Dispotition', 'filename']  );

iCab and ActiveX do not support getResponseHeader()
ActiveX will stop script when "if(!!client.getResponseHeader)" runs
*****/
Dabten.Net.GetResponseHeaders=function(client,headers){
	if(!client || !headers)
		return '';
	var reg;
	var result=[];
	if(headers=='all')
		return client.getAllResponseHeaders();
	
	reg=RegCompile(reg, '([^\n\r]+)', 'g');
	var allHeaders={};
	if(Dabten.Net.isAX || !client.getResponseHeader('Content-Type')){
		var tmp=client.getAllResponseHeaders().match(reg);
		Dabten.Core.Map(function(s, h){
					ar=s.split(':');
					if(ar.length>=2){
						ar[0]=Dabten.Core.Trim(ar[0]);
						ar[1]=Dabten.Core.Trim(ar[1]);
						h[ar[0].toLowerCase()]=ar[1];
					}
				}, tmp, allHeaders);
		delete tmp;
	}//if(tmp)
	if(typeof headers=='string'){
		headers=headers.toLowerCase();
		var hd=client.getResponseHeader(headers) || allHeaders[headers];
		result.push(hd);
	}else{
		for(var i=0,hd='';i<headers.length;i++){
			if(typeof headers[i]=='string'){
				headers[i]=headers[i].toLowerCase();
				hd=client.getResponseHeader(headers[i]) || allHeaders[headers[i]];
			}else if(headers[i].constructor==Array){
				headers[i][0]=headers[i][0].toLowerCase();
				var rhead=client.getResponseHeader(headers[i][0]) || allHeaders[headers[i][0]];
				reg=RegComplie(reg, headers[i][1]+'="?([^";,]+)"?', 'i');
				if(rhead && rhead.match(reg))
					hd=RegExp.$1;
				else
					hd='';
				
			}else
				hd='';
			result.push(hd);
		}
	}//typeof headers
	
	delete reg;
	delete allHeaders;
	delete RegCompile;
	
	if(result.length==0)
		return '';
	else if(result.length==1)
		return result[0];
	else
		return result;
	
	//Safari does not support RegExp.compile
	function RegCompile(r, s, opt){
		if(!r)
			return (new RegExp(s, opt));
		else if(!Dabten.Net.UA.sf)
			r.compile(s, opt);
		else
			r=new RegExp(s, opt);
		return r;
	}//
};//
/*****/
Dabten.Net.DefaultClient=function(uri, opt, o){
	if(!o)o=new Object();
	for(var i in opt)
		o[i]=opt[i];
	o.method=(!opt['method'] || !opt['method'].toUpperCase)?"GET":opt['method'].toUpperCase();
	o.enctype=(opt['enctype']==null||opt['enctype']=='')?Dabten.Net.encodeUrl:opt['enctype'];
	o.async=(opt['async']===undefined)?true:!!opt['async'];
	o.user=opt['user']||'';
	o.password=opt['password']||'';
	o.cbSuccess=null;
	o.cbFileNotFound=null;
	o.cbError=null;
	o.uri=uri||'';
	o.encoded=(opt['encoded']==null||opt['encoded']=='')?false:!!opt['encoded'];
	if(o.client)
		this.AbortRequest(o);
	
	o.client=null;
	o.output=o.output||null;
	o.onabort=false;
	return o;
}
/*****/
Dabten.Net.AbortRequest=function(o){
	if(Dabten.Net.UA.ie)return;
	o.onabort=true;
	var r=o.client.readyState;
	if(r!=0 && r!=4){
		try{
		o.client.abort();
		//o.client.responseText=''; //readOnly
		//o.client.responseXML=null; //readOnly
		}catch(e){}
	}
	o.onabort=false;
	delete r;
	return o;
};//

/***
delete 'callback' ->create 'onfilenotfound', 'onsuccess', 'onerror'
delete UpperCase' properties -> create LowerCase' properties

**/
Dabten.Net.PrepareCallback=function(opts){
	if(typeof opts!='object')
		return opts;
	var findcb=false;
	OPTS:for(var prop in opts){
		var p=prop.toLowerCase();
		PROP:switch(p){
		case 'onfilenotfound':
		case 'onerror':
		case 'onsuccess':
			if(findcb)
				break PROP;
			opts[p]=opts[prop];
			if(p!=prop)delete opts[prop];
			break PROP;
		case 'callback':
			if(findcb)
				break PROP;
			opts[p]=opts[prop];
			opts['onfilenotfound']=opts[prop];
			opts['onrror']=opts[prop];
			opts['onsuccess']=opts[prop];
			//if(p!=prop)delete opts[prop];
			findcb=true;
		default:
			if(!isNaN(p))
				opts['on'+p]=opts[prop];
			break PROP;
		}
	}//OPTS
	delete findcb;
	delete p;
	return opts;
};//
/*****/
Dabten.Net.Load=function(uri, callback, opts, o){
	if(!opts)
		opts={};
	else if(typeof opts=='string')
		opts={postData:opts};
	
	Dabten.Net.PrepareCallback(opts);
	o=Dabten.Net.DefaultClient(uri, opts, o);
	o.cbSuccess=opts['onsuccess']||callback;
	o.cbFileNotFound=opts['onfilenotfound'];
	o.cbError=opts['onerror'];
	
	if(o.enctype!=this.encodeUrl)
		o.method='POST';
	var pds=Dabten.Net.CreatePostData(o.enctype, o.encoded, opts['postData']); // pds[0]=boundary; pds[1]=data;
	if(o.method=='GET' && pds[1].length>0)
		o.uri+=((o.uri.indexOf('?')!=-1)?'&':'?')+pds[1];
	
	//add boundary
	if(o.enctype==this.encodeMultiForm || o.enctype==this.encodeMultiMixed)
		o.enctype+=pds[0];
	if(o.uri=='')
		return o;
	if(!o.client)
		o.client=new Dabten.Net.CreateClient();
	else if(o.client.state!=0 && o.client.state!=4)
		Dabten.Net.AbortRequest(o);
	
	if(!o.client){
		if(o.cbError)
			o.cbError(o);
		return o;
	}
	if(opts['force']){
		var d=(new Date()).getTime();
		o.uri+=((o.uri.indexOf('?')!=-1)?'&':'?')+d;
		d=new Date('01 Jan 1970 GMT');
		if(!opts.headers)
			opts.headers={};
		opts.headers['If-Modified-Since']=d.toGMTString();
	}
	if(o.async)
		o.client.onreadystatechange = function(){Dabten.Net.Process(o);};
		
	if(opts['overrideMimeType'])
		o.client.overrideMimeType(opts.overrideMimeType);
	
	o.client.open(o.method, o.uri, o.async, o.user, o.password);
	
	if(window.opera || (typeof o.client.setRequestHeader) =='function'){
		if(opts.headers)
		for(var i in opts.headers)
			o.client.setRequestHeader(i, opts.headers[i]);
		o.client.setRequestHeader('Content-Type', o.enctype);
	}else{ // for ActiveXObject
		try{
			if(opts.headers)
			for(var i in opts.headers)
				o.client.setRequestHeader(i, opts.headers[i]);
			
			o.client.setRequestHeader('Content-Type', o.enctype);
		}catch(e){
			alert('setrequestheader error'+e.message);
		}
	}
	o.client.send(pds[1]);
	if(!o.async){
		Dabten.Net.Process(o);
	}
	delete pds;
	return o;
}
/*****/
Dabten.Net.CreatePostData=function(enctype, encoded, data){
	if(!data)
		return ['',''];
	//if(enctype==Dabten.Net.encodeUrl){
	if(enctype==this.encodeUrl){
		var reStr=Dabten.Net.CreateSingleFormData(encoded, data);
		return ['', reStr];
	}else if(enctype==this.encodeMultiForm || enctype==this.encodeMultiMixed){
		if(typeof data=='string'){
			var o=[];
			var ary=data.split('&');
			for(var i=0;i<ary.length;i++){
				if(!ary[i]|| ary[i]=='')continue;
				var line=ary[i].split('=');
				if(line.length==1){
					//o[i]={name: Dabten.Net.dispositionName, data: line[0]};
					o[i]={name: this.dispositionName, data: line[0]};
				}else{
					o[i]={name: line[0], data: line[1]};
				}
			}
			result=Dabten.Net.Multipart.CreateFormData(o);
		}else{
			if(data.elements || (data.constructor==Array && data[0].elements))
				data=Dabten.Net.CreateDataFromForm(data, true);
				
			if(data.constructor==Array){
				result=Dabten.Net.Multipart.CreateFormData(data);
			}else{
				var o=[];
				for(var i in data){
					o.push({name: i, data: data[i]});
				}
				result=Dabten.Net.Multipart.CreateFormData(o);
			}
		}
		return result;
	}
	// unsupported
	return ['', data];
};//

/*****/
Dabten.Net.CreateDataFromForm=function(fm, wantArray){
	wantArray=!!wantArray;
	var result=[];
	var fms=(fm.constructor==Array)?fm:[fm];
	for(var fmsid=0,data,fm;fm=fms[fmsid];fmsid++){
		//var name,value;
		if(!fm.elements)continue;
		FORM:
		for(var i=0,tp,f;el=fm.elements[i];i++){
			if(!el.name||el.disabled)
				continue;
			tp=el.type;
			if((tp=='radio'||tp=='checkbox') && el.checked ){
				data={
					 name:el.name
					,value:el.value||''
				};
			}else if(tp=='select-one'){
				if(el.selectedIndex==-1)
					continue FORM;
				var o=el.options[el.selectedIndex];
				data={
					 name:el.name
					,value:o.value||o.text||''
				};
			}else if(tp=='select-multiple'){
				SELECT:
				for(var k=0,o;o=el.options[k];k++){
					if(!o.selected)
						continue SELECT;
					result.push({
							 name:el.name
							,value:o.value||o.text||''
						});
				}
				continue FORM;
			}else if(tp=='button'){//if(tp)
				data={
					 name:el.name
					,value:el.value||el.innerHTML||''
				};
			}else if(tp!='submit' && tp!='reset' && tp!='image'){//if(tp)
				data={
					 name:el.name
					,value:el.value||el.text||''
				};
			}//if(tp)
			
			result.push(data);
			data=null;
		}//FORM:for
	}//for frms
			
	if(wantArray)
		return result;
	if(result.length==0)
		return '';
	var re=encodeURIComponent(result[0].name)+'='+encodeURIComponent(result[0].value);
	for(var i=1,r;r=result[i];i++)
		re+='&'+encodeURIComponent(r.name)+'='+encodeURIComponent(r.value);
	result=fms=null;
	return re;
};//
/*****/
Dabten.Net.CreateSingleFormData=function(encoded, data){
	var reStr='';
	if(!data)
		return reStr;
	if(data.elements || (data.constructor==Array && data[0].elements)){
		reStr=Dabten.Net.CreateDataFromForm(data, false);
	}else if(typeof data=='string'){
		reStr=data;
		if(!encoded){
			reStr=encodeURIComponent(reStr);
			reStr=reStr.replace(/%3D/ig, '=').replace(/%3F/ig, '&');
		}
	}else{
		if(encoded){
			for(var i in data)
				reStr+=i+'='+data[i]+'&';
		}else{
			for(var i in data)
				reStr+=encodeURIComponent(i)+'='+encodeURIComponent(data[i])+'&';
		}
		reStr=reStr.substring(0, reStr.length-1);
	}
	return reStr;
}

/**********/
Dabten.Net.Multipart={};
/*****
postData = [
 {name: 'name', filename: 'filename', disposition: 'form-data', contentType: 'text/plain', data: 'data' , headers: {} }
,{name: 'name', filename: 'filename', disposition: 'form-data', contentType: 'text/plain', data: 'data' , headers: {} }
,{name: 'name', filename: 'filename', disposition: 'form-data', contentType: 'text/plain', data: 'data' , headers: {} }
];

default
  name: required
  filename: ''
  disposition: 'form-data'
  contentType: 'text/plain'
  data: ''
  headers: null
*****/
Dabten.Net.Multipart.CreateFormData=function(data){
	var result='';
	var CRLF=Dabten.Net.CRLF;
	var boundary='------'+Dabten.Net.Multipart.RandomLetters(26);
	var flg=false;
	result+='--'+boundary+CRLF;
	for(var i=0,dt;dt=data[i];i++){
		dt['contentType']=dt['contentType']||Dabten.Net.dispositionMime;
		dt['disposition']=dt['disposition']||Dabten.Net.disposition;
		dt['name']=dt['name']?encodeURIComponent(dt['name']):Dabten.Net.dispositionName;
		dt['filename']=dt['filename']?encodeURIComponent(dt['filename']):false;
		dt['data']=dt['data']?encodeURIComponent(dt['data']):dt['value']?encodeURIComponent(dt['value']):'';

		if(flg) result+=CRLF;
		result+='Content-Type: '+dt['contentType']+'; '+CRLF;
		result+='Content-Disposition: '+dt['disposition']+'; name="'+dt['name']+'";';
		if(dt['filename'])result+=' filename="'+dt['filename']+'";';
		result+=CRLF;
		if(dt['headers']){
		for(var h in dt['headers']){
			result+=h+': '+dt['headers'][h]+';'+CRLF;
		}}
		result+=CRLF;
		result+=dt['data']+CRLF;
		result+='--'+boundary;
		flg=true;
	}
	result+='--';
	
	boundary='; boundary="'+boundary+'"';
	return [boundary, result];
};//

/*****/
Dabten.Net.Multipart.RandomLetters=function(length){
	var string='abcdefghijklmnopqrstuvwxyz';
	var result='';
	var mx=string.length;
	while(length--){
		result+=string.charAt(Math.floor(Math.random()*mx));
	}
	return result;
};//

/*****
Dabten.Net.Multipart.DevideDataMixed=function(query, boundary)
is devide from textfile in multipart/mixed
 for unsupport-multipart-browsers

result=[
  {
      name: ''
      data: ''
      filename: ''
      headers: 
        {
          disposition: 'text'
          contentType: 'text/html'
        }
  }
 ,{
      name: ''
      data: ''
      filename: ''
      headers: 
        {
          disposition: 'text'
          contentType: 'text/html'
        }
   }
];
*****/
Dabten.Net.Multipart.DevideDataMixed=function(query, boundary, CRLF){
	var result=new Array();
	var headers={};
	var name='',filename='',data='';
	var CRLFCRLF=CRLF+CRLF;
	var crlen=CRLFCRLF.length;
	if(!boundary){
		result.push({name:'',data:query});
		return result;
	}
	boundary='--'+boundary;
	
	while(1){
		p=query.indexOf(boundary);
		if(p==-1){break;}
		cont=query.substring(0, p);
		query=query.substring(p+1);

		p=cont.indexOf(CRLFCRLF)+crlen;
		chead=cont.substring(0, p-1);
		cont=cont.substring(p);
		cont=cont.replace(RegExp(CRLF+"$"), '');
		name=filename=cType='';
		
		if(chead.match(/\s+name="([^"]+?)"[;\s\r\n]?/)){ //"
			name=RegExp.$1;
			name=decodeURIComponent(name);
		}
		if(chead.match(/\s+filename="([^"]+?)"[;\s\r\n]?/)){//"
			filename=RegExp.$1;
			filename=decodeURIComponent(filename);
		}
		if(chead.match(/content-type: ([^;\s\r\n]+?)[;\s\r\n]/i)){
			cType=RegExp.$1;
		}
		cheads=chead.split(CRLF);
		for(var i=0,c;c=cheads[i];i++){
			p=c.indexOf(': ');
			if(p!=-1){
				hid  =c.substring(0, p);
				hcont=c.substring(p+1);
				headers[hid]=hcont;
			}
		}//for cheads
		result.push({
			 name:name
			,filename:filename
			,data:cont
			,headers:headers
				});
	}//while
	return result;
};//

/*****/
Dabten.Load=function (flist, opts){
	if(!flist)
		return;
	var grpid=Dabten.grps.length;
	Dabten.grps[grpid]={};
	var grp=Dabten.grps[grpid];
	if(opts){
		if(typeof opts=='string')
			grp.postData=opts;
		else{
			Dabten.Net.PrepareCallback(opts);
			for(var o in opts){
				if(o=='onsuccess')
					continue;
				grp[o]=opts[o];
			}
		}
		grp['usercall']=opts['onsuccess'];
	}
	if(typeof flist=='string'){
		var tid=Dabten.Core.FirstTemplateID();
		tid=tid||'0';
		var tmp=flist;
		flist=new Object();
		flist[tid]=tmp;
	}

	grp['onsuccess']=Dabten.Core.CreateTemplate;

	for(var tid in flist){
		Dabten.Core.FirstTemplateID(tid);
		if(Dabten.tpls[tid] && Dabten.tpls[tid].client)
			Dabten.Net.AbortRequest(Dabten.tpls[tid]);

		Dabten.tpls[tid]=Dabten.Core.Load(tid, grpid, flist[tid], grp);
	}
};//Load
/*****/
Dabten.LoadMixed=function (uri, flist, opts){
	if(!uri || !flist)
		return;
	var grpid=Dabten.grps.length;
	var tid=Dabten.Net.Multipart.RandomLetters(64);
	
	Dabten.grps[grpid]={};
	var grp=Dabten.grps[grpid];
	
	if(opts){
		if(typeof opts=='string')
			grp.postData=opts;
		else{
			Dabten.Net.PrepareCallback(opts);
			for(var o in opts){
				if(o=='onsuccess')
					continue;
				grp[o]=opts[o];
			}
		}
		grp['usercall']=opts['onsuccess'];
	}//if(opts)
	grp['onsuccess']=Dabten.Core.CreateTemplate;

	Dabten.tpls[tid]=Dabten.Core.LoadMixed(uri, flist, grpid); //shoud be deleted after loading
	
	grp=null;
	delete tid;
	return o;
};//LoadMixed
/*****/
Dabten.GetHTML=function(tid, o){
	if(arguments.length==1){
		o=arguments[0];
		tid=Dabten.Core.FirstTemplateID();
	}
	if(!Dabten.Core.HasTemplate(tid, 'node'))
		return Dabten.Core.errmsg;
	var nodes=Dabten.Core.GetTemplate(tid, 'node');
	o=o||{};
	var result=Dabten.Compiler.Html.Parse(nodes,o);
	delete nodes;
	return result;
};//

/*****/
Dabten.GetDOM=function(tid, o, ns){
	if(arguments.length==1){
		o=arguments[0];
		tid=Dabten.Core.FirstTemplate();
	}else if(arguments.length==2 && typeof o=='string'){
		ns=arguments[1];
		o=arguments[0];
		tid=Dabten.Core.FirstTemplate();
	}else{
		ns=ns||false;
	}
	if(!Dabten.Core.HasTemplate(tid, 'node'))
		return false;
	Dabten.Compiler.Dom.SetXmlns(ns);
	var elms=Dabten.Compiler.Dom.Parse(tid,o);
	return elms;
};//GetDOM
/*****/
Dabten.GetXML=function(tid, o, xsl){
	if(!Dabten.Core.HasTemplate(tid, 'node'))
		return false;
	var src=this.GetHTML(tid,o);
	var doc=Dabten.Compiler.XML.Parse(src);
	delete src;
	return doc;
};//GetXML

/*****/
Dabten.InsertHTML=function(el, tid, o){
	el=Dabten.Core.GetElement(el);
	if(!el || !Dabten.Core.HasTemplate(tid, 'node') )
		return Dabten.Core.errmsg;
	
	var result=Dabten.GetHTML(tid, o);
	if(result.length==0)
		return false;
	
	return Dabten.Core.Write(el,result);
};//InsertHTML

/*****/
Dabten.InsertDOM=function(el, tid, o, add, ns){
	add=!!add;
	el=Dabten.Core.GetElement(el);
	if(!el || !Dabten.Core.HasTemplate(tid, 'node') )
		return false;

	ns=ns||false;
	Dabten.Compiler.Dom.SetXmlns(ns);
	var elms=Dabten.Compiler.Dom.Parse(tid,o);
	
	if(!add)
		while(el.firstChild)
			el.removeChild(el.firstChild);
	
	for(var i=0;i<elms.length;i++)
		el.appendChild(elms[i]);
	
	return true;
};//InsertHTML

/*****/
Dabten.GetFromURI=function(type, tid, uri, opt){
	return Dabten.InsertFromURI(null, type, tid, uri, opts);
};//GetFromURI

/*****/
Dabten.InsertFromURI=function(elm, type, tid, uri, opt){
	elm=Dabten.Core.GetElement(elm);
	//if(!elm)return false;
	//if(!type)type='text';
	type=type.toLowerCase();
	if(type!='text' && (type!='html' && type!='dom' || !Dabten.Core.HasTemplate(tid, 'node'))){
		return false;
	}
	if(!opt)opt={};
	opt=Dabten.Net.PrepareCallback(opt);
	var tpl=Dabten.Core.GetTemplate(tid)||{};
	//if(!tpl)tpl={};
	tpl.output=[type,elm,opt['onsuccess'], opt['onfilenotfound'], opt['onerror']];
	
	opt['callback']=Dabten.Observer.GetFromURI;
	
	return Dabten.Net.Load(uri, null, opt, tpl);
};//InsertFromURI

/*****/
Dabten.InsertJSONP=function(elm, tid, uri, cbkey, post, opts){
	return Dabten.Core.LoadJSONP(elm, tid, uri, cbkey, post, opts);
};//InsertJSONP
/*****/
Dabten.DeleteJSONP=function(o){
	return Dabten.Observer.JsonpCleaner(o);
};//DeleteJSONP

/*****/
Dabten.InsertCSS=function(href, opts){
	if(!opts)
		opts={};
	opts['alternate']=!!opts['alternate'] || !!opts['rel'] && (opts['rel']=='alternate' || opts['rel']=='alternate stylesheet');
	var attr={
		 href     : href
		,type     : 'text/css'
		,rel      : (!opts['alternate'])?'stylesheet':'alternate stylesheet'
		,title    : (!opts['title']||opts['title']=='')?null:opts['title']
		,media    : (!opts['media']||opts['media']=='')?null:opts['media']
		,charset  : (!opts['charset']||opts['charset']=='')?null:opts['charset']
		,postData : (!opts['postData'])?null:opts['postData']
	};
	return Dabten.Compiler.Dom.CreateLink(attr);
};//InsertCSS

/*****/
Dabten.SetMsg=function(tid, str){
	Dabten.Core.SetMsg(tid,str);
};//SetMsg
/*****/
Dabten.Set=function(flist, opt){
	if(!flist)return false;
	var grpid=Dabten.grps.length;
	Dabten.grps[grpid]={};
	if(typeof flist=='string'){
		var tid;
		if(!opt){
			tid=Dabten.Core.FirstTemplateID();
			tid=tid||'0';
			var tmp=flist;
			flist=new Object();
			flist[tid]=tmp;
		}else if(opt){
			tid=flist;
			flist=new Object();
			flist[tid]=opt;
		}
		flist[tid]['grp']=grpid;
	}
	var tptext=Dabten.Core.types['text'];
	var tpnode=Dabten.Core.types['node'];
	for(var tid in flist){
		if(!flist[tid])continue;
		Dabten.Core.FirstTemplateID(tid);
		if(Dabten.tpls[tid] && Dabten.tpls[tid].client){
			Dabten.Net.AbortRequest(Dabten.tpls[tid]);
		}
		Dabten.tpls[tid]=Dabten.Core.DefaultClient(tid, grpid);
		Dabten.tpls[tid][tptext]=flist[tid];
		Dabten.tpls[tid][tpnode]=Dabten.Core.CreateNodes(flist[tid]);
	}
	return true;
};//Set
/*****/
Dabten.Document=function(tid, elm, childOnly){
	if(!tid)
		return false;
	if(!elm){
		elm=tid;
		tid=Dabten.Core.FirstTemplateID();
		tid=tid||'0';
	}
	elm=Dabten.Core.GetElement(elm);
	var txt=elm.value;
	if(!txt)
		txt=Dabten.Compiler.XML.ToText(elm, childOnly);
	return Dabten.Set(tid, txt);
};//Document
/*****/
Dabten.Core={
	 regTpl:RegExp('\{tpl:(:?)([^}]+)\}', '')
	,types:{html:'t',text:'t',xml:'x',node:'n',nodes:'n',group:'grp'}
	,regCRLF:RegExp('^['+Dabten.Net.CR +Dabten.Net.LF+']|['+Dabten.Net.CR +Dabten.Net.LF+']$', 'g')
	,errmsg:''
	,only:false
};//Core
/*****/
Dabten.Core.DefaultClient=function(tid, grp){
	var o=new Dabten.Net.Load('', null);//create default client
	o.tid=tid;
	o.grp=grp;
	o.onabort=false;
	return o;
};//Core.DefaultClient
/*****/
Dabten.Core.Load=function(tid, grpid, uri, opts){
	var clone={};
	for(var i in opts)
		clone[i]=opts[i];
	var o=new Dabten.Net.Load(uri, Dabten.Core.CreateTemplate, clone);
	o.tid=tid;
	o.grp=grpid;
	o.onabort=false;
	return o;
};//Core.Load
/*****/
Dabten.Core.LoadMixed=function(uri, flist, grpid){
	var grp=Dabten.grps[grpid];
	var disposition=grp['disposition']||'form-data';
	var postData;
	
// If the uri is .txt, .tpl etc, the method might be 'GET' for Accesept Method.
	grp['method']=grp['method']||'POST';
	var etype=(grp['method'].toUpperCase()=='GET')?Dabten.Net.encodeUrl:grp['enctype']?grp['enctype']:Dabten.Net.encodeMultiForm;
	grp['enctype']=etype;
	if(etype==Dabten.Net.encodeMultiForm || etype==Dabten.Net.encodeMultiMixed){
		postData=new Array();
		if(grp['postData'])
			for(var i in grp['postData'])
				postData.push({name: i, data: grp['postData'][i]});
		
		for(var tid in flist)
			postData.push({name: tid, disposition: disposition, data:tid+'='+flist[tid], filename: flist[tid] });
		
	}else{//is-multipart
		postData={};
		if(grp['postData'])
			for(var i in grp['postData'])
				postData[i]=grp['postData'][i];
		
		for(var tid in flist)
			postData[tid]=flist[tid];
		
	}
	
	for(var tid in flist){
		if(Dabten.tpls[tid] && Dabten.tpls[tid].client)
			Dabten.Net.AbortRequest(Dabten.tpls[tid]);
		
		Dabten.tpls[tid]=Dabten.Core.DefaultClient(tid, grpid);
	}
	grp[postData]=postData;
	
	var o=Dabten.Net.Load(uri, null, grp);
	
	o.tid=tid;
	o.grp=grpid;
	o.onabort=false;
	
	delete disposition;
	delete postData;
	delete i;
	delete tid;
	delete etype;
	
	return o;
};//Core.LoadMixed
/***/

/***
* elm : String || HTML-Element-Object
	element ID or element Object which will be applied the template

* tid : String
	template id
	
* uri : String
	JSONP-Server's URI

* cbkey : String
	default : ''
	callback key which is desinated by the JSONP-Server
	
	
* postData : Object || HTML-Form-Element || String
	default : null
	if this were String, Dabten will encode it for URL-encoded-string.

* opts : null || function || Object 
	default : null

function
	callback function after recieved JSONP.
	

opts.callback : function
	default : null
	callback function after recieved JSONP.
	
	ex)
	opts.callback(elm, tid, JSONP-Data);

opts.reserved : boolean
	default : false
	if this were true, <script> will stay on the document
	
opts.applyTo : boolean
	default : true
	if this were true, Dabten calls "Dabten.InsertDOM()" with elm and the JSONP-Data

**/
Dabten.Core.LoadJSONP=function(elm, tid, uri, cbkey, postData, opts){
	if(!opts){
		opts={callback:null,reserved:false,applyTo:true};
	}else if(typeof opts=='function'){
		opts={callback:opts,reserved:false,applyTo:true};
	//}else if(typeof opts=='boolean'){
	//	opts={callback:null,reserved:opts,applyTo:true};
	}else{
		opts={callback:opts.callback,reserved:opts.reserved,restain:(opts.applyTo===undefined)?true:!!opts.applyTo};
	}
	
	
	var jid=Dabten.jsonp.length;
	Dabten.jsonp.length=jid+1;
	var observer='';
	if(cbkey && cbkey!='')
		observer=cbkey+'=Dabten.jsonp%5B'+jid+'%5D';
	var key=Dabten.Net.CreateSingleFormData(false, postData);
	key+=(key)?'&'+observer:observer;
	var query=uri;query+=((uri.indexOf('?')!=-1)?'&':'?')+key;
	var script=Dabten.Compiler.Dom.CreateScript(query, {rel:uri, noAdd:true});
	opts['script']=script;
	Dabten.jsonp[jid]=Dabten.Observer.JsonParent(jid, tid, elm, uri, opts);
	Dabten.Compiler.Dom.AddScript(script);
	return script;
};//Core.LoadJSONP

/*****/
Dabten.Core.Node=function(type, expr, child){//path, expr, key, value, child){
	child=child||null;
	type=type||'text';
	expr=expr||'';
	var node={
		 type:type
		,expr:expr
		,child:child
	};
	return node;
};//Core.Node
/*****/
Dabten.Core.CreateNodes=function(txt){
	if(!txt)return '';
	var stacks=this.Parse(txt);
	return stacks[0];
};//Core.CreateNodes
/*****/
Dabten.Core.Trim=function(str){
	if(!str)return '';
	//return str.replace(/^[\s\r\n]+|[\s\r\n]+$/g,'');
	return this.TrimL(this.TrimR(str));
};//Core.Trim
/*****/
Dabten.Core.TrimR=function(str){
	if(!str)return '';
	return str.replace(/[\s]+$/g,'');
};//Core.TrimR
/*****/
Dabten.Core.TrimL=function(str){
	if(!str)return '';
	return str.replace(/^[\s]+/g,'');
};//Core.TrimL
/*****/
Dabten.Core.Map=function(){
	var args=new Array(1);
	var func=arguments[0];
	var ary=arguments[1];
	for(var i=2;i<arguments.length;i++)
		args.push(arguments[i]);

	var l=ary.length;
	var ret=new Array();
	for(var i=0;i<l;i++){
		args[0]=ary[i];
		ret[i]=func.apply(this, args);
	}
	return ret;
};//Core.Map
/*****/
Dabten.Core.InArray=function(s, ary){
	for(var i=0;i<ary.length;i++)
		if(s==ary[i])
			return i;
	return -1;
};//Core.InArray
/*****/
Dabten.Core.GetElement=function(tid){
	if(typeof tid=='string'){
		return document.getElementById(tid);
	}else{
		return tid;
	}
};//
/*****
if(elm.innerHTML) will be always undefined
*****/
Dabten.Core.Write=function(elm, html){
	if(elm.value && elm.nodeName!='button')
		elm.value=html;
	else
		elm.innerHTML=html;
	return true;
};//Core.Write
/*****/
Dabten.Core.HasTemplate=function(tid, type){
	if(!type)
		return !!Dabten.tpls[tid];
	
	var tp=this.types[type];
	if(!tp)return false;
	if(!!Dabten.tpls[tid])
		return !!Dabten.tpls[tid][tp];
	return false;
};//Core.HasTemplate
/*****/
Dabten.Core.FirstTemplateID=function(){
	if(arguments.length==0)
		return Dabten.Core.only;
	else if(Dabten.Core.only==null){
		Dabten.Core.only=arguments[0];
		return Dabten.Core.only;
	}else
		return Dabten.Core.only==arguments[0];
	
};//
/*****/
Dabten.Core.GetTemplate=function(tid, type){
	if(!Dabten.tpls[tid])
		return null;
	if(type!==undefined){
		var tp=this.types[type];
		if(!tp || !Dabten.tpls[tid][tp])
			return null;
		
		return Dabten.tpls[tid][tp];
	}else
		return Dabten.tpls[tid];
	
};//
/*****/
Dabten.Core.CreateTemplate=function(aj){
	var tpls=[];
	var grp=null;
	var tptext=Dabten.Core.types['text'];
	var tpxml=Dabten.Core.types['xml'];
	var tpnode=Dabten.Core.types['node'];
	var cType=Dabten.Net.GetResponseHeaders(aj.client, 'Content-Type');
	if(aj.client.status==200 || aj.client.status==206 || aj.client.status==304 || aj.client.status==0){
		if( cType.indexOf('multipart/')==0
		 || (!!aj.client.responseText && aj.client.responseText.search(/^content-type: multipart\/(form-data|mixed)/i)==0)
		 ){
			tpls=Dabten.Core.DevideMixed(aj);
		}else{//if(cType.indexOf('multipart/')
			var cl=aj.client;
			if(aj.tid=='')
				aj.tid=Dabten.Net.GetResponseHeaders(cl,[['Content-Disposition', 'name']]);
			
			tpls=[aj.tid];
			if(!cl.responseText && cl.responseXML){
				Dabten.tpls[aj.tid][tptext]=Dabten.Compiler.XML.ToText(cl.responseXML);
			}else{
				Dabten.tpls[aj.tid][tptext]=cl.responseText||'';
			}
			Dabten.tpls[aj.tid][tpxml]=cl.responseXML;
			Dabten.tpls[aj.tid][tpnode]=null;
			cl=null;
		}//if(cType.indexOf('multipart/')
	}else if(aj.tid!=''){//aj.client.status
		Dabten.tpls[aj.tid][tptext]='';
		Dabten.tpls[aj.tid][tpxml]=null;
		Dabten.tpls[aj.tid][tpnode]=null;
	}//aj.client.status

	for(var idscnt=0,tid;idscnt<tpls.length;idscnt++){
		if(!(tid=tpls[idscnt]))
			continue;
		grp=Dabten.tpls[tid].grp;
		Dabten.tpls[tid][tpnode]=Dabten.Core.CreateNodes(Dabten.tpls[tid][tptext]);
	}
	if(grp!==null && Dabten.grps[grp].usercall){
		var flg=true;
		for(var k in Dabten.tpls){
			if(Dabten.tpls[k].tid==tid || grp!=Dabten.tpls[k].grp)
				continue;
			
			var r=(Dabten.tpls[k].client)?Dabten.tpls[k].client.readyState:0;
			if(r!=0 && r!=4){
				flg=false;
				break;
			}
		}
		if(flg)
			Dabten.grps[grp].usercall();
		
		delete r;
		delete k;
		delete flg;
	}//if(grp, usercall)

	delete isscnt;
	delete tpls;
	delete grp;
	delete tptext;
	delete tpxml;
	delete tpnode;
	delete cType;
	delete aj.client;
	return true;
};//Core.CreateTemplate

/*****/
Dabten.Core.DevideMixed=function(aj){
	var boundary='';
	
	var boundReg=new RegExp(/boundary="?([^";,]+)"?/i);
	var cType=Dabten.Net.GetResponseHeaders(aj.client, 'Content-Type');
	var files=[];
	var tids=[];
	if(!!cType && cType.match(boundReg)!=null){
		//boundary=RegExp.$1;
		boundary=cType.match(boundReg)[1];
		files=Dabten.Net.Multipart.DevideDataMixed(aj.client.responseText, boundary, Dabten.Net.CRLF);
	}else{
		var CRLF='';
		var m=aj.client.responseText.match(/^Content-Type: multipart\/(form-data|mixed);\s.*boundary="?([^\s\r\n"]+)"?;?([\r\n]+)/i);
		boundary=m[2];
		CRLF=m[3];
		files=Dabten.Net.Multipart.DevideDataMixed(
				 aj.client.responseText.substring(aj.client.responseText.indexOf(CRLF)+CRLF.length)
				, boundary, CRLF);
	}
	for(var i=0,grp,t=Dabten.Core.types['text'],x=Dabten.Core.types['xml'],n=Dabten.Core.types['node'];i<files.length;i++){
		var tid=files[i]['name']||aj.tid;
		if(tid==null||!Dabten.tpls[tid])
			continue;
		tids.push(tid);
		grp=Dabten.tpls[tid]['grp'];
		var ptp=Dabten.tpls[tid];
		ptp[t]=files[i]['data'];
		ptp[x]=null;
		ptp[n]=null;//ptp[tpnode]=Dabten.Core.CreateNodes(ptp[tptext]);
		ptp['uri']=files[i]['filename'];
		ptp['grp']=grp;
	}
	
	delete boundary;
	delete files;
	delete cType;
	delete boundReg;
	
	return tids;
};//Core.DevideMixed

/*****/
Dabten.Core.Parse=function(txt, inner){
	inner=inner||false;
	var useExpContext=(RegExp.leftContext===undefined);
	var stacks=new Array();
	while(txt){
		var tpl=this.regTpl.exec(txt);
		var left='';
		var node=null;
		if(!tpl){
			left=txt;
			txt='';
		}else if(useExpContext){
			left=RegExp.leftContext;
			txt=RegExp.rightContext;
		}else{
			left=txt.substring(0, tpl.index);
			txt=txt.substring(tpl.index+tpl[0].length);
		}
		if(left){
			node=this.Node('text',left);
			stacks.push(node);
		}
		if(!tpl)
			continue;
		sep=tpl[1];
		
		if(sep!=':'){
			node=this.Node('vary',tpl[2]);
			stacks.push(node);
		}else{ //if(sep!=':')
			var p=tpl[2].search(/^([a-z]+)[=\s](.+)/i);
			if(p!=-1){
				var formula=RegExp.$1;
				var expr=RegExp.$2;
				expr=expr.replace(/\n|\r/g, '');
			}else{
				var formula=tpl[2];
				var expr='';
			}
			
			if(formula=='evenodd'){
				expr=this.Trim(expr);
				expr=expr||2;
				stacks.push(this.Node(formula,expr,[]));
			}else if(formula=='repeat'){
				if(expr.charAt(0)=='/'){expr=expr.substring(1);}
				var s=this.Parse(txt);
				stacks.push(this.Node(formula, expr,s[0]));
				txt=s[1];
			}else if(formula=='repeatcount'){
				stacks.push(this.Node(formula, expr,[]));
			}else if(formula=='endrepeat'){
				return [stacks, txt];
			}else if(formula=='if'){
				var s=this.Parse(txt, true);
				stacks.push(this.Node(formula, expr,s[0]));
				txt=s[1];
			}else if(formula=='elif'){
				if(inner){
					return [stacks, tpl[0]+txt];
					//return [stacks, txt];
				}
				var s=this.Parse(txt, true);
				stacks.push(this.Node(formula, expr,s[0]));
				txt=s[1];
			}else if(formula=='else'){
				if(inner){
					return [stacks, tpl[0]+txt];
					//return [stacks, txt];
				}
				var s=this.Parse(txt, true);
				stacks.push(this.Node(formula, expr,s[0]));
				txt=s[1];
			}else if(formula=='endif'){
				if(inner){
					inner=false;
					return [stacks, tpl[0]+txt];
					//return [stacks, txt];
				}
				stacks.push(this.Node(formula,expr,[]));
			}//if(formula)
		}//if(sep!=':')
	}//while(tpl)
	return [stacks, ''];
};//Core.Parse
/*****/
Dabten.Core.SetMsg=function(eid, str){
	if(eid=='500' || eid=='err'||eid=='error'||eid=='errmsg'){
		Dabten.Core.errmsg=str;
	}else if(eid=='404'||eid=='notmsg'){
		Dabten.Core.errmsg=str;
	}
};//Core.SetMsg
/*****/
Dabten.Compiler={
//	operators:['^','%','*','/','+','-','(',')','=','`']
};//
/*****
Dabten.Compiler.Smap=function(str, func, wantArray){
	var ar=str.split('');
	var ret=ar.map(func);
	if(wantArray){
		return ret;
	}
	return ret.join('');
};//

/*****/
Dabten.Compiler.Math={
	 operators:['*','/','%','+','-','<<','>>','>>>','&','^','|','(',')','=','`']
	,comparisons:['==','!=','>','<','>=','<=']
	,bitoperators:['&&','||']
};//
/*****/
Dabten.Compiler.Math.ApplyExpr=function(expr, o, rc){
	for(var i=0,c;c=this.comparisons[i];i++){
		if(expr.indexOf(c)==-1)
			continue;
		var sides=expr.split(c);
		var l=this.Exec(this.Postfix(this.Parse(sides[0])), o, rc);
		var r=this.Exec(this.Postfix(this.Parse(sides[1])), o, rc);
		return !!(eval(l+c+r));
	}
	var l=this.Exec(this.Postfix(this.Parse(expr)), o, rc);
	return !!l;
};//ApplyExpr
/*****/
//expr : String(), formula
//result : Array(), each numbers, variables, operators
/*****/
Dabten.Compiler.Math.Parse=function(expr){
	var len=expr.length;
	var result=[];
	var reg=/^([a-zA-Z0-9\.\_\$]+)/;
	var InArray=Dabten.Core.InArray;
	while(len){
		var c,ic,tmp,p;
		var c=expr.charAt(0);
		if(c=='"' || c=='\''){
			p=expr.indexOf(c, 1);
			if(p!=-1)
				p=len;
			tmp=expr.substring(1,p);
			expr=expr.substring(p);
			if(tmp.charAt(p-2)==c)
				tmp=tmp.substring(0,p-2);
			result.push(tmp);
			len-=p;
		}else{//if(c=='"' || c=='\'')
			ic=InArray(c,this.operators);
			if(ic!=-1){
				result.push(c);
				expr=expr.substring(1);
				len--;
			}else{//if(ic!=-1)
				var p=expr.match(reg);
				if(p){
					sz=(''+p[1]).length;
					tmp=expr.substring(0,sz);
					expr=expr.substring(sz);
					result.push(tmp);
					len-=sz;
				}else{
					result.push(c);
					expr=expr.substring(1);
					len--;
				}
			}//if(ic!=-1)
		}//if(c=='"' || c=='\'')
	}//while
	
	len=reg=InArray=null;

	return result;
};//Compiler.Math.Parse

/*****/
// onclick="func1('a', 5);func2(5);func3('ab;(\' )cd');func4(';',';\'',';');func5(5);func5(\"5);"
// onclick='func1("a", 5);func2(5);func3("ab;(\" )c,d", "aaa");func4(";",";\"",";");func5(5);func5(\'5);'
// make result=[ "func1('a', 5)", "func2(5)", "func3('ab;(\' )c,d', 'aaa')", "func4(";",";\"",";")", "func5(5)" ];
// trim spaces, semi-colons, quotation marks
// * onclick="func('&quot;')"
/*****/
Dabten.Compiler.Math.SplitFuncs=function(expr){
	expr=expr.replace(/^[\s\r\n"']+|[\s\r\n'";]+$/g, '');
	var sep=';';
	var dquot='"';
	var squot='\'';
	expr+=sep;
	var len=expr.length;
	var result=[];
	var tmp='',buf='',c='',ic=-1,p=-1,ps=-1,pq=-1;
	while(len){//expr.length
		ps=expr.indexOf(sep);
		pq=expr.indexOf(squot);
		if(pq==-1)
			pq=expr.indexOf(dquot);
		
		if((pq==-1) || (ps<pq) ){ //if found ";", not found '"' , '\''
			tmp+=expr.substring(0, ps);
			expr=expr.substring(ps+1);
			result.push(tmp);
			len-=(ps+1);
			tmp='';
		}else if(expr.charAt(ps-1)=='\\'){ //illegular. using quotation-mark out of String
			tmp+=expr.substring(0, ps-1);
			expr=expr.substring(ps);
			result.push(tmp);
			len-=ps;
			tmp='';
		}else{
			c=expr.charAt(pq);
			tmp+=expr.substring(0, pq+1);
			expr=expr.substring(pq+1);
			len-=pq+1;
		} //if found ";"
	}//while(len);
	sep=dquot=squot=len=tmp=buf=c=ic=p=ps=pq=null;
	return result;
};//Compiler.Math.SplitFuncs
/*****/
//expr : Array(), each numbers, variables, operators
//result : Array(), postfix notation
/*****/
Dabten.Compiler.Math.Postfix=function(expr){
	var re=false;
	var result=[];
	var isLast=this.operators[this.operators.length-1];
	expr.push(isLast);
	var len=expr.length;
	var stack=[],k;
	stack.push(isLast);
	var InArray=Dabten.Core.InArray;
	for(var i=0,ic,ik,c;i<expr.length;i++){
		c=expr[i];
		ic=InArray(c,this.operators);
		if(ic==-1){
			result.push(c);
		}else{
			k=stack[stack.length-1];
			ik=InArray(k,this.operators);
			if(ik<ic){
				if(k=='(' && c==')'){
					k=stack.pop();
					continue;
				}
				k=stack.pop();
				result.push(k);
				i--;
				continue;
			}else if(ik>ic){
				stack.push(c);
			}else{
				if(k==isLast){
					break;
				}
				if(k=='(' || k==')'){
					k=stack.pop();
					continue;
				}
				k=stack.pop();
				result.push(k);
				i--;
				continue;
			}
		}
	}//for(i<expr.length)
	re=isLast=len=stack=k=InArray=null;
	return result;
};//Compiler.Math.Postfix
/*****/
//stack : Array(), Postfix Notation
//result: result of calculate
/*****/
Dabten.Compiler.Math.Exec=function(stack, o, rc){
	var result=[];
	var InArray=Dabten.Core.InArray;
	for(var i=0,a,b,sum,s;i<stack.length;i++){
		s=stack[i];
		if(InArray(s,this.operators)!=-1){
			b=result.pop();
			a=result.pop();
			if((s=='/' || s=='%') && b==0){
				sum=0;
			}else{
				try{
					sum=eval(a+s+b);
				}catch(e){
					sum=0;
				}
			}
			result.push(sum);
		}else if(isNaN(s)){
			if(s=='repeatcount'){
				s=rc+1;
			}else if(s.indexOf('/')!=-1){
				var path=s.split('/');
				var p=o;
				for(var i=0;i<path.length&&p;i++){
					if(path[i])
						p=(!!p[path[i]])?p[path[i]]:null;
					
				}
				s=(p!==null && p!==undefined)?p:(o[s]!==null && o[s]!==undefined)?o[s]:'';
			}else{
				//s=(o[s])?o[s]:0;
				s=(o[s])?o[s]:s;
			}
			result.push(s);
		}else{
			result.push(s);
		}
	}
	var re=result.pop();
	if(typeof re=='string' && isNaN(re) || re=='')
		re='"'+re+'"';
	
	InArray=null;
	return re;
};//Compiler.Math.Exec
/*****/
Dabten.Compiler.Dom={
	separators:[' ','\t','\n','>','<']
	,xmlns:[false,'']
	,attrEntities:['rowspan','colspan','class','for','maxlength','readonly','bgcolor','nowrap','valign','tabindex','defaultvalue','defaultselected','defaultchecked','usemap','codetype','httpequiv','accesskey','longdesc','ismap','lowsrc','fontsize']
	,attrAliases:[['rowSpan'],['colSpan'],['className'],['htmlFor'],['maxLength'],['readOnly'],['bgColor'],['noWrap'],['vAlign'],['tabIndex'],['defaultValue'],['defaultSelected'],['defaultChecked'],['useMap'],['codeType'],['httpEquev'],['accessKey'],['longDesc'],['isMap'],['lowSrc'],['fontSize']]
	,styleEntities:['float']
	,styleAliases:[['styleFloat','cssFloat']]
	,entities:{
		nbsp:160,iexcl:161,cent:162,pound:163,curren:164,yen:165,brvbar:166,sect:167,uml:168,copy:169,ordf:170,laquo:171,not:172,shy:173,reg:174,macr:175,deg:176,plusmn:177,sup2:178,sup3:179,acute:180,micro:181,para:182,middot:183,cedil:184,sup1:185,ordm:186,raquo:187,frac14:188,frac12:189,frac34:190,iquest:191,Agrave:192,Aacute:193,Acirc:194,Atilde:195,Auml:196,Aring:197,AElig:198,Ccedil:199,
		Egrave:200,Eacute:201,Ecirc:202,Euml:203,Igrave:204,Iacute:205,Icirc:206,Iuml:207,ETH:208,Ntilde:209,Ograve:210,Oacute:211,Ocirc:212,Otilde:213,Ouml:214,times:215,Oslash:216,Ugrave:217,Uacute:218,Ucirc:219,Uuml:220,Yacute:221,THORN:222,szlig:223,agrave:224,aacute:225,acirc:226,atilde:227,auml:228,aring:229,aelig:230,ccedil:231,egrave:232,eacute:233,ecirc:234,euml:235,igrave:236,iacute:237,icirc:238,iuml:239,eth:240,ntilde:241,ograve:242,oacute:243,ocirc:244,otilde:245,ouml:246,divide:247,oslash:248,ugrave:249,uacute:250,ucirc:251,uuml:252,yacute:253,thorn:254,yuml:255,fnof:402,
		Alpha:913,Beta:914,Gamma:915,Delta:916,Epsilon:917,Zeta:918,Eta:919,Theta:920,Iota:921,Kappa:922,Lambda:923,Mu:924,Nu:925,Xi:926,Omicron:927,Pi:928,Rho:929,Sigma:931,Tau:932,Upsilon:933,Phi:934,Chi:935,Psi:936,Omega:937,alpha:945,beta:946,gamma:947,delta:948,epsilon:949,zeta:950,eta:951,theta:952,iota:953,kappa:954,lambda:955,mu:956,nu:957,xi:958,omicron:959,pi:960,rho:961,sigmaf:962,sigma:963,tau:964,upsilon:965,phi:966,chi:967,psi:968,omega:969,thetasym:977,upsih:978,piv:982,
		bull:8226,hellip:8230,prime:8242,Prime:8243,oline:8254,frasl:8260,weierp:8472,image:8465,real:8476,trade:8482,alefsym:8501,larr:8592,uarr:8593,rarr:8594,darr:8595,harr:8596,crarr:8629,lArr:8656,uArr:8657,rArr:8658,dArr:8659,hArr:8660,forall:8704,part:8706,exist:8707,empty:8709,nabla:8711,isin:8712,notin:8713,ni:8715,prod:8719,sum:8721,minus:8722,lowast:8727,radic:8730,prop:8733,infin:8734,ang:8736,and:8743,or:8744,cap:8745,cup:8746,int:8747,there4:8756,sim:8764,cong:8773,asymp:8776,ne:8800,equiv:8801,le:8804,ge:8805,sub:8834,sup:8835,nsub:8836,sube:8838,supe:8839,oplus:8853,otimes:8855,perp:8869,sdot:8901,lceil:8968,rceil:8969,lfloor:8970,rfloor:8971,
		lang:9001,rang:9002,loz:9674,spades:9824,clubs:9827,hearts:9829,diams:9830,quot:34,amp:38,lt:60,gt:62,OElig:338,oelig:339,Scaron:352,scaron:353,Yuml:376,circ:710,tilde:732,
		ensp:8194,emsp:8195,thinsp:8201,zwnj:8204,zwj:8205,lrm:8206,rlm:8207,ndash:8211,mdash:8212,lsquo:8216,rsquo:8217,sbquo:8218,ldquo:8220,rdquo:8221,bdquo:8222,dagger:8224,Dagger:8225,permil:8240,lsaquo:8249,rsaquo:8250,euro:8364
	}
};//
/*****/
Dabten.Compiler.Dom.HasAttrAlias=function(style){
	style=style.toLowerCase();
	for(var i=0;i<this.attrEntities.length;i++){
		if(this.attrEntities[i]==style){
			return this.attrAliases[i];
		}
	}
	return null;
};//
/*****/
Dabten.Compiler.Dom.HasStyleAlias=function(style){
	style=style.toLowerCase();
	for(var i=0;i<this.styleEntities.length;i++){
		if(this.styleEntities[i]==style){
			return this.styleAliases[i];
		}
	}
	return null;
};//
/*****/
Dabten.Compiler.Dom.SetXmlns=function(ns){
	var doc=document.documentElement;
	this.xmlns[0]=(!!ns && !Dabten.Net.UA.ie);
	if(!doc || !document.createElementNS || !this.xmlns[0] || !doc.getAttributeNS){
		this.xmlns[0]=false;
		this.xmlns[1]='';
		return this;
	}
	var cType=doc.contentType||'';
	if( cType.indexOf('xml')!=-1 //fx
	 || document.xmlVersion!=null //sf
	 || doc.getAttributeNS(Dabten.Net.nsURI, 'xmlns')
	 ){
		
		if(typeof ns=='string'){
			this.xmlns[1]=ns;
 		}else{
			ns=doc.getAttributeNS(Dabten.Net.nsURI, 'xmlns');
			this.xmlns[1]=ns||Dabten.Net.nsURI;
		}
	}else{
		this.xmlns[0]=false;
	}

	if(!this.xmlns[0]){
		this.xmlns[1]='';
	}
	return this;
};//Compiler.Dom.SetXmlns
/*****/
Dabten.Compiler.Dom.CreateElement=function(tagname){
	if(Dabten.Compiler.Dom.xmlns[0]){
		return document.createElementNS(Dabten.Compiler.Dom.xmlns[1], tagname);
	}else{
		return document.createElement(tagname);
	}
};//
/*****/
Dabten.Compiler.Dom.CreateTextNode=function(txt){
	var str='';
	while(txt){
		var p=txt.match(/([^&]*)(&(#?\d+|[a-zA-Z0-9]+);)(.*)/);
		if(!p){
			str+=txt;
			txt='';
		}else{
			str+=p[1];
			var n=(p[3].indexOf('#')!=-1)?p[3].substring(1):this.entities[p[3]];
			str+=n?String.fromCharCode(n):'';
			txt=p[4];
		}
	}
	return document.createTextNode(str);
};//Compiler.Dom.CreateTextNode
/*****/
Dabten.Compiler.Dom.AddElement=function(parent, childs, before){
	if(!parent || !childs)return false;
	before=before||null;
	if(childs.constructor==Array){
	for(var i=0;i<childs.length;i++){
		parent.insertBefore(childs[i],before);
		before=childs[i];
	}
	}else{
		parent.insertBefore(childs,before);
	}
	return true;
};//Compiler.Dom.AddElement
/*****/
Dabten.Compiler.Dom.ReplaceElement=function(parent, childs){
	if(!parent)
		return false;
	while(parent.firstChild)
		parent.removeChild(parent.firestChild);
	Dabten.Compiler.Dom.AddElement(parent, childs, null);
	return true;
};//Compiler.Dom.ReplaceElement
/*****
  opts = {title: 'myStyleSheet'} all are String
  
  Defaults are
rel      : stylesheet
type     : text/css
ref      : null, 'Start','Index', 'prev','next' ,,,
rev      : null
title    : null
media    : null
freflang : null
charset  : null
/*****/
Dabten.Compiler.Dom.CreateLink=function(){
	if(!arguments.length)
		return false;
	var href='';
	var attrs={};
	if(arguments.length==1){
		if(typeof arguments[0]=='string'){
			href=arguments[0];
		}else{
			for(var i in arguments[0])
				if(i=='href')
					href=arguments[0][i];
				else
					attrs[i]=arguments[0][i];
				
		}
	}else{
		href=arguments[0];
		for(var i in arguments[1])
			if(i!='href')
				attrs[i]=arguments[1][i];
	}
	var li;
	if(attrs['postData']){
		if(typeof(attrs['postData'])=='string' || typeof(attrs['postData'])=='number'){
			href+=((href.indexOf('?')!=-1)?'&':'?')+attrs['postData'];
		}else{
			var pds=Dabten.Net.CreatePostData(Dabten.Net.encodeUrl, false, attrs['postData']);
			if(pds[1].length>0)
				href+=((href.indexOf('?')!=-1)?'&':'?')+pds[1];
		}
		delete attrs['postData'];
	}
	if(document.implementation){
		if((attrs['type']=='text/css'||attrs['rel']=='stylesheet') && document.createStyleSheet){
			li=document.createStyleSheet(href);
			for(var i in attrs)
				if(attrs[i] && i!='type' && i!='rel')
					this.AddAttribute(li, i, attrs[i]);
			return true;
		}else{
			li=this.CreateElement('link');
			if(!li)
				return false;
			this.AddAttribute(li, 'href', href);
			for(var i in attrs)
				if(attrs[i])
					this.AddAttribute(li, i, attrs[i]);
		}
		var hd=document.getElementsByTagName('head');
		if(hd)
			hd=hd.item?hd.item(0)||hd[0]:hd[0];
alert(hd);
		if(hd)
			this.AddElement(hd, li);
		else
			this.AddElement(document, li);
		
	}else{
		var t=MakeTag('link',attrs,{empty:true,close:true});
		try{document.write(t);}catch(e){}
	}
alert('OK');
	return li;

	function MakeTag(a,b,c){
	var tag='<'+a;
	for(var i in b) tag+=' '+i+'="'+b[i]+'"';
	tag+=(c.empty && c.close && !!document.createElementNS)?' />':'>';
	if(c.close && !c.empty) tag+='</'+a+'>';
	return tag;
	}
};//Compiler.Dom.CreateLink
/*****/
Dabten.Compiler.Dom.CreateScript=function(src, opts){
	if(!src||src=='')
		return false;
	sc=Dabten.Compiler.Dom.CreateElement('script');
	if(!sc)
		return false;
	if(!opts)
		opts={};
	var attr={
		 type: (!opts['type']||opts['type']=='')?'text/javascript':opts['type']
		,src: src
		,title: opts['title']||null
		,rel: opts['rel']||null
	};
	for(var i in attr)
		if(attr[i])Dabten.Compiler.Dom.AddAttribute(sc, i, attr[i]);
	if(!opts.noAdd)
		Dabten.Compiler.Dom.AddScript(sc);
	
	return sc;
};//Compiler.Dom.CreateScript
/*****/
Dabten.Compiler.Dom.AddScript=function(src){
	if(!src)
		return false;
	var hd=document.getElementsByTagName('head');
	if(hd) hd=hd.item?hd.item(0)||hd[0]:hd[0];
	else hd=document.body||document.documentElement;
	if(hd) this.AddElement(hd, src);
	else this.AddElement(document, src);

	return src;
};//Compiler.Dom.AddScript
/*****/
Dabten.Compiler.Dom.AddAttribute=function(tag, attrname, value){
	if(!attrname)
		return tag;
	if(attrname.search(/^on/i)!=-1){
		this.AddEvent(tag, attrname, value);
	}else{
		var attr=attrname.toLowerCase();
		if(Dabten.Net.UA.ie){
			var at=this.HasAttrAlias(attr);
			if(at!=null){
			for(var i=0;i<at.length;i++){
				tag[at[i]]=value;
			}}
		}
		if(attr=='style'){//ie re-set // && Dabten.Net.UA.ie){
			this.AddStyle(tag, value);
		}else{
			this.SetAttribute(tag, attrname, value);
		}
	}
	return tag;
};//Compiler.Dom.AddAttribute
/*****/
Dabten.Compiler.Dom.AddStyle=function(tag, style){
	if(!style)return tag;
	var c=style.charAt(0);
	if((c=='"' || c=='\'') && (c==style.charAt(style.length-1)))
		style=style.substring(1,style.length-2);
	
	if(Dabten.Net.UA.gecko){ //for Gecko's speed
		this.SetAttribute(tag,'style',style);
	}else{//UA.gecko
	var reg=new RegExp("(.*)-([a-z])(.*)");
	var styles=style.split(';');
	for(var i=0,prop,ss,st;st=styles[i];i++){
		prop=st.split(':');
		prop[0]=Dabten.Core.Trim(prop[0]);
		prop[1]=Dabten.Core.Trim(prop[1]);
		if(!prop[0] || !prop[1])
			continue;
		if((ss=this.HasStyleAlias(prop[0]))!=null){
			for(var j=0;j<ss.length;j++)
				styles.push(ss[j]+':'+prop[1]);
			continue;
		}
		while(reg.test(prop[0]))
			prop[0]=RegExp.$1+RegExp.$2.toUpperCase()+RegExp.$3;

		try{tag.style[prop[0]]=prop[1];}catch(e){}
	}//for styles[i]
	}//UA.gecko
	return tag;
};//Compiler.Dom.AddStyle

/*****
case sensitive on IE
*****/
Dabten.Compiler.Dom.SetAttribute=function(tag, attrname, value){
	if(this.xmlns[0]){
		if(value==undefined)
			value=attrname;
		tag.setAttributeNS(this.xmlns[1], attrname, value, 1);
	}else
		tag.setAttribute(attrname, value, 1);
	return tag;
};//
/*****/
Dabten.Compiler.Dom.AddEvent=function(tag, eventname, src){
	eventname=eventname.replace(/^on/,'');
	var funcs=Dabten.Compiler.Math.SplitFuncs(src);
	
	for(var i=0,func;func=funcs[i];i++)
		funcs[i]=new Function(func);

	var pf=Flist(funcs);
	
	if(tag.addEventListener)
		tag.addEventListener(eventname, pf, false);
	else if(tag.attachEvent)
		tag.attachEvent('on'+eventname, pf);
	
	delete funcs;
//	pf=null;
	return tag;

	function Flist(args){
		var fs=[];
		for(var i=0;i<args.length;i++)
			fs.push(args[i]);
		
		var play=function(e){
			for(var i=0;i<fs.length;i++)
				fs[i](e);
		}
		return play;
	}
};//
/*****/
// called just after '<' letter, to search and isolate '<tag - >'
// return [tagtype, HtmlElementObject, "rest-of-str"]
// tagtype: 'comment', 'start', 'end', 'text'
/*****/
Dabten.Compiler.Dom.IsolateTag=function(expr){
	var attrs=[],attr='';
	var tagtype='', tagname='', tag=null;
	var p,c,tmp;
	var emptyTags=Dabten.Compiler.Html.emptyTags;
	var InArray=Dabten.Core.InArray;
	
	if(expr.charAt(0)!='<')
		tagtype='text';

	if(!tagtype){
		var p1=expr.indexOf('>',1);
		var p2=expr.indexOf('<',1);
		if(p1<0)p1=expr.length;
		if(p2<0)p2=expr.length;
		if(p2<p1){
			tmp=expr.substring(1,p2);
			expr=expr.substring(p2);
		}else if(p1<p2){
			tmp=expr.substring(1,p1);
			expr=expr.substring(p1+1);
		}else{
			tmp=expr;
			expr='';
		}
		
		tmp=tmp.replace(/[\n\s]+/,' ');
		attrs=tmp.split(' ');
		if(attrs.length>0)
			tagname=attrs.shift();
		if(tmp.charAt(0)=='/'){
			tagtype='end';
		}else{
			tag=this.CreateElement(tagname);
			//if(Dabten.Compiler.Html.emptyTags.indexOf(tagname)>0)
			if(InArray(tagname, emptyTags)>0)
				tagtype='empty';
			else
				tagtype='start';
		}
	}
	
	if(tagtype=='empty' || tagtype=='start'){
	for(var i=0,tmp;i<attrs.length;i++){
		tmp=attrs[i];
		if(!tmp)
			continue;
		c=tmp.indexOf('=');
		if(c!=-1){
			attr=tmp.substring(0,c);
			tmp=tmp.substring(c+1);
			c=tmp.charAt(0);
		}else{
			attr=tmp;
			tmp='';
			c='';
		}
		if(c=='"' || c=='\''){
			if(tmp.charAt(tmp.length-1)!=c){
				for(var j=1;j+i<attrs.length;j++){
					tmp+=' '+attrs[i+j];
					attrs[i+j]=null;
					if(tmp.charAt(tmp.length-1)==c)
						break;
				}
			}
			tmp=tmp.substring(1, tmp.length-1);
		}
		this.AddAttribute(tag, attr, tmp);
	}//for
	}//if tagtype
	
	return [tagtype, tag, expr];
};//
/*****/
Dabten.Compiler.Dom.Parse=function(tid,o){
	var nodes=new Array();
	var html=Dabten.GetHTML(tid, o);

//	measure to prototype.js
	for(var i in nodes.prototype)
		delete nodes.prototype[i];
	for(var i in nodes)
		delete nodes[i];
	
	if(html.length==0)
		return nodes;
	
	var node=nodes;
	while(html.length!=0){
		var txt;
		var p=html.indexOf('<');
		if(p!=-1){
			txt=html.substring(0,p);
			html=html.substring(p);
		}else{
			txt=html;
			html='';
		}
		if(txt){
			if(node==nodes || (node.nodeName!='textarea' && node.nodeName!='pre')){//namespace xml:space='preserve'
				txt=txt.replace(/[\n]+/g,' ').replace(/\s\s+$/g,' ');
			}
			if(node==nodes){
				if(txt==' ')
					txt='';
			}
			if(!!txt){
				var tnode=this.CreateTextNode(txt);
				if(node==nodes){
					node.push(tnode);
				}else{
					node.appendChild(tnode);
				}
			}
		}

		re=this.IsolateTag(html);
		html=re[2];
		if(re[0]=='start'){
			if(node==nodes){
				node.push(re[1]);
				node=re[1];
			}else{
				node.appendChild(re[1]);
				node=re[1];
			}
		}else if(re[0]=='empty'){
			if(node==nodes){
				node.push(re[1]);
			}else{
				node.appendChild(re[1]);
			}

		}else if(re[0]=='end'){
			if(node.parentNode && node.parentNode.nodeName=='#document-fragment'){
				node=nodes;
			}else{
				node=node.parentNode||nodes;
			}
		}else if(re[0]=='comment'){
			; //do nothing
		}
	}//while(expr)
	delete html;
	node=null;
	
	return nodes;
};//Compiler.Dom.Parse

/*****/
Dabten.Compiler.Html={
			 emptyTags:['area','base','basefont','br','col','frame','hr','img','input','isindex','link','meta','param','embed']
			,blockElements:['html','body','div','p','table','tbody','thead','tfoot','tr','ul','ol','dl','menu','dir','fieldset','address','pre','blockquote','center','h1','h2','h3','h4','h5','h6']
			,effectiveLF:['textarea','pr']
			//,separators:[' ','\t','\n','>','<']
			//,xmlns:[false,'']
};//
/*****/
Dabten.Compiler.Html.Parse=function(nodes,o, repeatcount){
	if(!nodes)
		return '';
	var DHtml=Dabten.Compiler.Html;
	var DMath=Dabten.Compiler.Math;
	if(!repeatcount)
		repeatcount=0;
	var result='';
	for(var nodecnt=0,nlen=nodes.length,node;nodecnt<nlen;nodecnt++){
		node=nodes[nodecnt];
		if(node.type=='text'){
			result+=DHtml.ApplyText(node.expr,o, repeatcount);
		}else if(node.type=='vary'){
			result+=DHtml.ApplyVary(node.expr,o, repeatcount);
		}else if(node.type=='repeatcount'){
			result+=DHtml.ApplyRepeatcount(node.expr,o, repeatcount);
		}else if(node.type=='repeat'){
			var path=(node.expr)?node.expr.split('/'):[];
			var p=o;
			for(var i=0;i<path.length&&p;i++){
				//if(path[i]===null||path[i]===undefined||path[i]=='')
				if(path[i]==null||path[i]=='')
					continue;
				p=p[path[i]];
			}
			if(!p)
				p=o;
			var plen=p.length||1;
			for(var i=0;i<plen;i++){
				//if(p[i]===null||p[i]===undefined){
				if(p[i]==null){
					result+=this.Parse(node.child,p, i);
				}else{
					if(p.constructor==String)
						p[i]={index:i+1, value:p[i]};
					result+=this.Parse(node.child,p[i], i);
				}
			}
		}else if(node.type=='endrepeat'){
			return result;
		}else if(node.type=='evenodd'){
			result+=DHtml.ApplyEvenodd(node.expr, o, repeatcount);
		}else if(node.type=='if'){
			if(DMath.ApplyExpr(node.expr, o, repeatcount)){
				result+=this.Parse(node.child,o,repeatcount);
			}else{
			for(;nodecnt<nlen;nodecnt++){
				var node=nodes[nodecnt];
				if(node.type=='elif' && (DMath.ApplyExpr(node.expr, o, repeatcount))){
					result+=this.Parse(node.child,o, repeatcount);
					break;
				}else if(node.type=='else'){
					result+=this.Parse(node.child,o, repeatcount);
					break;
				}else if(node.type=='endif'){
					break;
				}
			}//for
			}//if
		}else{
		}
	}// for(i<len)
	return result;
};//Compiler.Html.Parse
	
/*****/
Dabten.Compiler.Html.ApplyVary=function(expr, o, rc){
	//if(expr.length==0)
	if(!expr)
		return '';
	
	var path=expr.split('/');
	var p=o;
	if(p==undefined)
		return '';
	for(var i=0;i<path.length&&p;i++){
		p=p[path[i]];
		if(p==undefined)
			break;
	}
	if(p==undefined||p==null)
		return '';
	return p.toString();
};//Compiler.Html.ApplyVary
/*****/
Dabten.Compiler.Html.ApplyText=function(expr,o, rc){
	return expr;
};//
/*****/
Dabten.Compiler.Html.ApplyRepeatcount=function(expr,o, rc){
	//var n=isNaN(expr)?0:Number(expr||0);
	var n=isNaN(expr)?1:Number(expr||1);
	rc=rc+n;
	return ''+rc;
};//
/*****/
Dabten.Compiler.Html.ApplyEvenodd=function(expr, o, rc){
	if(!expr || isNaN(expr) || expr<3)
		return (rc%2)?'even':'odd';
	var evn=((rc+1)%expr);
	return (evn==0)?'even':'odd'+evn;
};//

/*****/
Dabten.Compiler.Script={
};//
/*****/
Dabten.Compiler.Script.EvalScript=function(txt){
	txt=txt.replace(/^\s*var\s/,'');
	return eval(txt);
};//

/*****/
Dabten.Compiler.XML={
			 defaultXsl:'<?xml version="1.0"?>\n'
				+'<stylesheet version="1.0" xmlns="http://www.w3.org/1999/XSL/Transform">\n'
				+'<output method="html"/>\n'
				+'</stylesheet>'
			,type:'text/xml'
};//
/*****/
Dabten.Compiler.XML.ToText=function(xml, childOnly){
	var txt='';
	if(childOnly)
		return xml.innerHTML;
	
	for(var i in xml.attributes){
		txt+=' '+i+'="'+xml.attributes[i]+'"';
	}
	return '<'+xml.nodeName+txt+'>'+xml.innerHTML+'</'+xml.nodeName+'>';
};//Compiler.XML.ToText

/*****/
Dabten.Compiler.XML.Parse=function(src){
	var doc=null;
	if (window.ActiveXObject){
		try{
		var pdoc=new ActiveXObject("Microsoft.XMLDOM");
		pdoc.async="false";
		pdoc.loadXML(src);
		doc=pdoc.documentElement;
		}catch(e){doc=null;}
	}else if(window.DOMParser){
		try{
		var parser=new DOMParser();
		var pdoc=parser.ParseFromString(str,"text/xml");
		doc=pdoc.documentElement;
		}catch(e){doc=null;}
	}else if (document.implementation && document.implementation.createDocument){
		try{
		var parser=document.implementation.createDocument("","",null);
		var pdoc=parser.ParseFromString(src);
		doc=pdoc.documentElement;
		}catch(e){doc=null;}
	}
	return doc;
};//Compiler.XML.Parse

/*****/
Dabten.Compiler.XML.ToJson=function(xml){
	var doc=(xml.documentElement)?xml.documentElement:xml;
	while(doc && (doc.nodeType!=1 || doc.nodeName.indexOf('#')!=-1))
		doc=(doc.nextSibling)?doc.nextSibling:doc.firstChild;
	
	if(!doc)
		return null;
	
	var result=Parse(doc);
	return result;
	
	function Parse(node, obj, key, val){
		if(!node)return null;
		
		if(node.nodeType==3 || node.nodeType==4){
			val=Confirm(node.nodeValue);
			if(val)
				return val;
			else
				return false;
			
		}
		obj=null;
		for(var i=0,cnode;cnode=node.childNodes[i];i++){
			var o=Parse(cnode);
			if(!o) continue;
			//Add(obj, key, o);
			if(cnode.nodeName=='#text'){
				if(!obj)
					obj=o;
				else if(typeof obj=='string')
					obj+=o;
				else
					Add(obj, cnode.nodeName, o);
				
			}else{
				if(!obj){
					obj={};
					Add(obj, cnode.nodeName, o);
				}else if(typeof obj!='string'){
					Add(obj, cnode.nodeName, o);
				}
			}
		}
		return obj;
	}//Parse
	function Add(obj, key, value){
		if(!key || !value)
			return false;
		if(!obj[key])
			obj[key]=value;
		else if(obj[key].constructor==Array)
			obj[key][obj[key].length]=value;
		else if(typeof obj[key]!='string')
			obj[key]=[obj[key], value];
		else
			obj[key]+=value;
		
		return obj;
	}//Add
	function Confirm(value){
		value=value||'';
		if(typeof value=='string'){
			value=value.replace(/^[\r\n\s]+/, '').replace(/[\r\n\s]$/, '');
		}
		return value;
	}//Confirm
};//Compiler.XML.ToJson

/*****/
Dabten.Observer={
//	jsonChild:[]
};//
Dabten.Observer.GetFromURI=function(aj){
	if(!aj)return false;
	var tid=aj.tid;
	var tpl=Dabten.Core.GetTemplate(tid);
	var type=aj.output[0];
	var elm=aj.output[1];
	var callback=aj.output[2];
	var txt=aj.client.responseText;
	var xml=aj.client.responseXML;
	if(aj.client.status=='404'){
		if(aj.output[3]) aj.output[3](elm, tid, aj.client.status);
		return false;
	}else if(aj.client.status!=200 && aj.client.status!=304 && aj.client.status!=0){
		if(aj.output[4]) aj.output[4](elm, tid, aj.client.status);
		return false;
	}
	var data=null;
	if(type!='text'){
		if(xml && xml.firstChild){
			data=Dabten.Compiler.XML.ToJson(xml);
		}else{
			try{
				data=Dabten.Compiler.Script.EvalScript(txt);
			}catch(e){
				data={};
			}
		}
	}
	var result=null;
	if(elm){
		if(type=='html'){
			result=Dabten.InsertHTML(elm, tid,data);
		}else if(type=='dom'){
			result=Dabten.InsertDOM(elm, tid, data);
		}else if(type=='xml'){
			; // not support
		}else if(type=='text'){
			Dabten.Core.Write(elm,txt);
			result=txt;
		}
		if(callback){
			callback(elm, tid, data, result);
		}
	}else{
		if(type=='html'){
			result=Dabten.GetHTML(tid,data);
		}else if(type=='dom'){
			result=Dabten.GetDOM(tid, data);
		}else if(type=='xml'){
			; // not support
		}else if(type=='text'){
			result=txt;
		}
		if(callback){
			callback(tid, data, result);
		}
	}
	return this;
};//Observer.GetFromURI

/*****/
Dabten.Observer.JsonpCleaner=function(e){
	if(e){
	if(e.parentNode && e.parentNode.removeChild){
		for(var i=0;i<Dabten.jsonp.length;i++){
			if(!Dabten.jsonp[i].reserved && Dabten.jsonp[i].script==e){
				Dabten.jsonp.slice(i,i+1);
				break;
			}
		}
		e.parentNode.removeChild(e);
	}//if(e.parentNode)
	return;
	}//if(e)
	var tags=document.getElementsByTagName('script');
	for(var i=Dabten.jsonp.length-1,child;i<Dabten.jsonp.length;i--){
		child=Dabten.jsonp[i];
		if(child.finished && !child.reserved){
			for(var j=0;j<tags.length;j++){
				if(child.script==tags[j]){
					delete Dabten.jsonp[i];
					tags[j].parentNode.removeChild(tags[j]);
				}
			}
		}
	}

};//Observer.JsonpCleaner

/*****/
Dabten.Observer.JsonParent=function(jsonpid, tplid, eid, rel, opts){
	opts=Dabten.Net.PrepareCallback(opts);
	var elm=null;
	var callback=opts.onsuccess;
	var reserved=!!opts.reserved && opts.reserved!='';
	var script=opts.script;
	var finished=false;
	var restrain=opts.restrain;
	var observer=function(dt){
		elm=Dabten.Core.GetElement(eid);
		if(elm && !restrain){
			if(dt.constructor==Array){
				var data=[];
				for(var i=0;i<dt.length;i++)
					data.push({index:i+1, value:dt[i]});
				Dabten.InsertDOM(elm, tplid, data);
			}else{
				var data={};
				for(var i in dt){
					if(dt[i].constructor==Array){
						data[i]=[];
						for(var j=0;j<dt[i].length;j++)
							data[i].push({index:j+1, value:dt[i][j]});
					}else{
						data[i]=dt[i];
					}
				}
				Dabten.InsertDOM(elm, tplid, data);
			}
		}
		if(callback)
			callback(elm, tplid, dt);
		
		finished=true;
		if(!reserved)
			Dabten.Observer.JsonpCleaner(script);
		
		Dabten.Observer.JsonpCleaner();
		return dt;
	};
	return observer;
};//Observer.JsonParent

