/*
程序制作：星宿之命（带选框部分未完成）
使用：08CMS
时间：09/07/11 15:40

二叉树结构
			parent
			|	offset
			|  /
			| /
		 $--T --data
		  /   \
		 /	   \
		/		right
	left
	左兄右子
	T{childs,add,line,make,icon}
	data={html,value,show,checked}
	$={dom:{item,body,line,exp,icon,box},cid:cookieid}
选框
	后面加的也为勾：
			不变
	当原来为空时：
		后面加的也为空 不变
		如果之前有子：
			后面加的有勾 变为叉
		否则：
			后面加的有的不为空 变为叉
			后面加的全为勾 变为勾
	当原来为勾时：
		否则 如果之前有子：
			变为叉
		否则：
			变为空
*/
function TreeList(a){
	//beeline/branch/turning/spread
	var cls=[
				['item','icon','body'],
				['spac','lin0'],
				['lin1','lin2'],
				['add1','add2'],
				['sub1','sub2'],
				['ico0','ico1','ico2'],
				['box0','box1','box2']
	],b=E('tbody'),r=E('tr'),o=new T(),$=o.$.dom,type=a.type,ck=a.cookie;
	function A(p,c){p.appendChild(c)}
	function C(d,c){d.className=c}
	function D(d){d.parentNode.removeChild(d)}
	function E(i,c){var d=document.createElement(i);if(c)C(d,c);return d}
	function CK(k,v){var i,l,p,r,c=document.cookie.split('; ');k=escape(k);for(i=0,l=c.length;i<l;i++){p=c[i].split('=');if(p[0]==k)r=unescape(p[1])}if(v!==undefined)document.cookie=k+'='+escape(v)+';expires='+(new Date(new Date().getTime()+3600000*24*365)).toGMTString();return r}
	function T(){
		var t=this;
		t.$={dom:{line:[],item:E('table',cls[0][0]),body:E('div')},ckl:0};
		with(t.$.dom.item){cellPadding=0;cellSpacing=0}
		t.childs=[];
		t.add=function(d){
			var c=new T(),l=t.$.last,$=t.$.dom;
			c.data=d;
			c.parent=t;
			c.offset=l;
			if($.load){$.load.del();$.load=0}
			c.$.cid=(t.$.cid?(t.$.cid+'_'):'')+t.childs.length;
			if(ck&&c.data.show===undefined)eval('c.data.show='+CK(ck+c.$.cid));
			t.childs.push(t.$.last=c);
			//添加节点判断父节点之前有没有子节点：
			if(t.right){//有则把父节点的最后一个子节点变为不是最后一个节点的形式
				l.left=c;
				l.icon();
				l.line(1);
			}else{//否则把父节点变为有子节点的节点
				t.right=c;
				if(o!=t)t.icon();
			}
			c.make();
			return c;
		};
		t.del=function(){
			var i,l,p=t.parent,c=p?p.childs:0,$=t.$.dom;
			D($.item);D($.body);
			if(c){
				for(i=0,l=c.length;i<l;i++)if(c[i]==t){delete c[i];c.splice(i,1);break}
				if(!c.length){
					p.right=0;
					if(p!=o)p.icon();
				}
			}
		};
		t.loading=function(s){
			var $=t.$.dom;
			if($.load){$.load.del();$.load=0}
			return $.load=t.add({text:s?s:'loading...',noicon:1});
		};
		t.line=function(i){
			var c=t.right,$;
			if(c){
				do{
					$=c.$.dom.line;
					C($[$.length-i],cls[1][1]);
					c.line(i+1)
				}while(c=c.left)
			}
		};
		t.icon=function(){
			var $=t.$.dom,i=t.left?0:1,d=t.data,k=d.show?1:0,c=!d.noicon;
			if(t.right){
				if(c)C($.icon,cls[5][1+k]);
				C($.exp,cls[3+k][i]);
			}else{
				if(c)C($.icon,cls[5][0]);
				C($.exp,cls[2][i]);
			}
			$.body.style.display=k?'':'none';
		}
		t.click=function(f,s){
			var c=t.data.show;
			if(!f){
				if(c){
					if(t.onclose)if(false===t.onclose())return;
				}else{
					if(t.onopen)if(false===t.onopen())return;
				}
				if(t.onclick)if(false===t.onclick())return;
			}else if(s!==undefined){
				c=!s;
			}
			t.data.show=!c;
			if(ck)CK(ck+t.$.cid,!c);
			t.icon();
		};
		t.box=function(k,f){
			var c=t.right;
			t.$.checked=k;
			C(t.$.dom.box,cls[6][f?2:k?1:0]);
			while(c&&!f){
				c.box(k);
				c=c.left
			}
		};
		t.check=function(){
			var p=t.parent,k=t.$.checked=!t.$.checked;

			while(p!=o){
				if(k){//之前没有选中
					if(++p.$.ckl<p.childs.length){
						C(p.$.dom.box,cls[6][2]);//没有全选2
						break;
					}
					p.$.checked=k;
					C(p.$.dom.box,cls[6][1])
				}else{
					p.$.checked=0;
					C(p.$.dom.box,cls[6][0==--p.$.ckl?0:2])//没有选中的0否则2
				}
				p=p.parent
			}
//			if(p!=parent&&p!=o)
			t.box(k);
		};
		t.make=function(){//生成节点
			var s=[],d=t.data,p=t.parent,$=t.$.dom,o=p.$.dom,l;
			do{s.push(p)}while(p=p.parent);s.pop();
			r=E('tr');
			while(p=s.pop()){//生成线图
				l=E('td',cls[1][p.left?1:0]);
				$.line.push(l);
				A(r,l)
			}
			p=t.parent;
			A(r,$.exp=E('td'));;//开关
			$.exp.onclick=function(){t.click()};
			if(!d.noicon)A(r,$.icon=E('td'));;//生成图标
			t.icon();
			if(type){//生成复选框
				A(r,$.box=E('td'));
				if(d.checked)p.$.ckl++;
				t.box(d.checked);
				$.box.onclick=t.check
			}
			$.text=E('td',cls[0][2]);$.text.innerHTML=d.html;//生成文字
			A(r,$.text);
			A(b=E('tbody'),r);
			A($.item,b);//$.icon.innerHTMl='A';$.exp.innerHTMl='C';
			A(o.body,$.item);
			A(o.body,$.body);
		};
	}
	if(a.html){
		$.icon=E('td',cls[0][1]);
		A(r,$.icon);
		$.text=E('td');$.text.innerHTML=a.html;
		A(r,$.text);
		A(b,r);
		A($.item,b);
		A(a.dom,$.item);
	}
	A(a.dom,$.body)
	return o;
}