function listNode(id, pid, text) {
	this.id            = id;         //id值
	this.pid           = pid;        //父id
	this.text          = text;       //显示的标题 
}

function List(objName,selectClass,optioneClass) {
	this.objName          = objName;              //本对象名
	this.selectClass      = selectClass;          //select的CSS之class
	this.optioneClass     = optioneClass;         //option的CSS之class
	this.spaceStr         = [];             //间隔字符
	this.pidData          = [];
	this.idData            = [];//所有记录
	this.str              = "";
	this.name             = null;
	this.id               = null;
	this.selectedVal      = [];
	this.rootId           = null; 
	this.selectedId       = null; 
	this.is_first         = true;
	this.listAll          = false;
	this.level = 0;
	this.firstText        = '';
	this.otherDefaultText = '==全部==';
	this.func             = null;
};

//克隆
List.prototype.clone = function(objName,selectClass,optioneClass,spaceStr) {
    var obj = new List(objName);
	obj.selectClass      = selectClass;          
	obj.optioneClass     = optioneClass; 
	obj.pidData          = this.pidData;
	obj.idData           = this.idData;
	obj.rootId           = this.rootId; 
	obj.selectedId       = this.selectedId; 
	obj.is_first         = true;
	obj.level            = this.level;
	obj.listAll          = this.listAll;
	return obj;
}

List.prototype.add = function(id, pid, text) {
	if (!this.pidData[pid])this.pidData[pid]=new Array();
	this.pidData[pid][this.pidData[pid].length] = id;
	this.idData[id] = new listNode(id, pid, text);
	if (!this.idData[pid])this.rootId = id;
};

List.prototype.getLevel = function(pid,level) {
	if (this.pidData[pid]){
		var total=this.pidData[pid].length;
		for (var i=0;i<total;i++){
			if (level > this.level)this.level = level;
			this.getLevel(this.pidData[pid][i], level+1);
		}
	}
};

List.prototype.display = function() {
	if (this.name == null)this.name = this.objName+"[]";
	if (this.id == null)this.id = this.objName;
	this.getLevel(this.rootId,1);
	document.write('<span id="'+this.objName+'_span__1"></span>');
	this.str=this.getStr(this.rootId,0);
	js.Dom.findObj(this.objName+'_span__1').innerHTML = this.str;
	this.setSelected();
	this.is_first = true;
}

List.prototype.setSelected = function(selectedId) {
	this.selectedVal = new Array();
	if (selectedId)this.selectedId = selectedId;
	if (!this.selectedId)return false;
	this.getSelected(this.selectedId);
	var selectedVal = this.selectedVal;
	this.selectedVal = new Array();
	for (var i=selectedVal.length-1;i>=0;i--){
		this.selectedVal[this.selectedVal.length] = selectedVal[i]
	}
	for (var i=0;i<this.selectedVal.length;i++){
		js.Dom.findObj(this.id+"_"+i).value=this.selectedVal[i];
		this.changeChildList(this.selectedVal[i],i)
	}
}

List.prototype.getStr = function (pid,level){
	var str='';
	if (pid == 0 || !pid || (!this.is_first && this.rootId == pid)){
	    if (this.listAll)return this.getOtherStr(level);
		else return '';
	}
	this.is_first = false;
	if (!this.pidData[pid]){
	    //if (this.listAll)return this.getOtherStr(level);
		//else return '';
		return '';
	}
	if (this.spaceStr[level])str = this.spaceStr[level];
	else if (this.spaceStr[this.spaceStr.length-1])str = this.spaceStr[this.spaceStr.length-1];
	str += '<select name="'+this.name+'" id="'+this.id+'_'+level+'"';
	if (this.selectClass)str+=" class=\""+this.selectClass+"\"";
	str+=' onchange="'+this.objName+'.changeChildList(this.options[this.selectedIndex].value,'+level+')">';
	str += '<option value="0"';
	if (this.optioneClass)str+=' class="'+optioneClass+'"';
	str += '>'+(pid == this.rootId ? (this.firstText != '' ? this.firstText : '=='+this.idData[pid].text+'==') : this.otherDefaultText)+'</option>';
	var total=this.pidData[pid].length;
	for (var i=0;i<total;i++){
		var cid=this.pidData[pid][i];
		var cn = this.idData[cid];//本节点对象 
		str += '<option value="'+cid+'"';
		if (this.optioneClass)str+=' class="'+optioneClass+'"';
		str += '>'+cn.text+'</option>';
	}
	str += "</select> ";
	str +='<span id="'+this.objName+'_span_'+level+'">';
	if (this.pidData[this.selectedVal[level]]){
	    if (this.selectedVal[level])str +=this.getStr(this.selectedVal[level],level+1);
		else if (!this.firstOptionText)str +=this.getStr(this.idData[this.pidData[pid][0]].id,level+1);
	}
	else if (this.listAll)str +=this.getOtherStr(level+1);
	str +='</span>';
	
	return str;
}

List.prototype.getOtherStr = function (level){
	if (level < this.level){
		var str='';
		if (this.spaceStr[level])str = this.spaceStr[level];
		else if (this.spaceStr[this.spaceStr.length-1])str = this.spaceStr[this.spaceStr.length-1];
		str += '<select name="'+this.name+'" id="'+this.id+'_'+level+'"';
		if (this.selectClass)str+=" class=\""+this.selectClass+"\"";
		str += '><option value="0"';
		if (this.optioneClass)str+=' class="'+optioneClass+'"';
		str += '>'+this.otherDefaultText+'</option>';
		str += "</select> ";
		str +='<span id="'+this.objName+'_span_'+level+'">';
		str += this.getOtherStr(level+1);
		str +='</span>';
		return str;
	}
	else return '';
}

List.prototype.changeChildList = function (pid,level){
	var str=this.getStr(pid,level+1);
	js.Dom.findObj(this.objName+"_span_"+level).innerHTML = str;
	if (this.func){
		var func = this.func;
		func(pid);
	}
}

List.prototype.getSelected = function (id){
	if (this.idData[id] && id != this.rootId){
		this.selectedVal[this.selectedVal.length] = id;
		this.getSelected(this.idData[id]['pid']);
	}
}
