/**
* @author: 熊水林(Email: xionglb@163.com)
* @lastModified 2004-8-30
* @descript: TreeView JS基础实现
*/
folders = new Array;
seqFolders = new Array; //按层次顺序
count = 0; //node CountNum
var imagePath = "";
var barImg, spacerImg, rootImg;
var teeImg, teePlusImg,teeMinusImg;
var cornerImg, cornerPlusImg, cornerMinusImg;
var folderImg, folderOpenImg, leafImg;
frameTarget = "top.contentFrame.rightFrame"; //打开链接的窗口
imgAlign = ' align="absMiddle"'; //图片文字对其方式
preNodeCode = 0;
//---------------------------------------PUBLIC----------------------------------------------------
/**
* 构造函数,新建一个树节点
*/
function Folder(nodecode,description,layer,parentId,hreference,isLeaf) {
this.code = nodecode;
this.desc=description;
this.hrefer = hreference ;
this.layer = layer;
this.parentId = parentId;
this.isLeaf = isLeaf;
this.isOpen = false;
}
/**
* 增加一个节点
*/
function addFolder(folder){
folders[count++] = folder;
return folder;
}
//图片位置
function setImagePath(){
barImg = imagePath+"images/menu_bar.gif";
teeImg = imagePath+"images/menu_tee.gif";
cornerImg = imagePath+"images/menu_corner.gif";
spacerImg = imagePath+"images/menu_spacer.gif";
rootImg = imagePath+"images/menu_root.gif";
teePlusImg = imagePath+"images/menu_tee_plus.gif";
teeMinusImg = imagePath+"images/menu_tee_minus.gif";
cornerPlusImg = imagePath+"images/menu_corner_plus.gif";
cornerMinusImg = imagePath+"images/menu_corner_minus.gif";
folderImg = imagePath+"images/folder.gif";
folderOpenImg = imagePath+"images/folder_open.gif";
leafImg = imagePath+"images/file.gif";
}
//根节点
function drawRootNode(nodeName){
var content = '<div><img id="fldImgRoot" align="absMiddle" src="'+rootImg+'">';
content += nodeName+"</div>";
document.write(content);
}
function drawTree(){
var n = 0;
var topFolders = getLayerFolders(getMinLayer());
for (var i=0;i<topFolders.length;i++){
seqFolders[n++] = topFolders[i];
var grandSon = getGrandSon(topFolders[i]);
for (var j=0;j<grandSon.length;j++){
seqFolders[n++] = grandSon[j];
}
}
for (var k=0; k<count; k++){
drawFolder(seqFolders[k]);
}
for (i=0;i<topFolders.length;i++){
document.getElementById("fld"+topFolders[i].code).style.display = "block";
}
}
/**
* 初始化打开一个节点
*/
function expandFolder(nodeCode){
var folder = getFolderByCode(nodeCode);
if (folder == null) return;
var grandFather = getGrandFather(folder);
for (var i=0;i<grandFather.length;i++){
showFolder(grandFather[i]);
}
showFolder(folder);
}
//-----------------------------------PROTECTED-----------------------------------------------------
/* 在子类实现
function drawFolder(folder){
}
*/
/**
* 默认实现
*/
function clickNode(nodeCode){
var folder = getFolderByCode(nodeCode);
if (folder.isOpen){ //已经是打开状态
hiddenFolder(folder);
}else{
showFolder(folder);
}
if (folder.hrefer!=null && folder.hrefer!='null' && folder.hrefer!=''){
eval(frameTarget).location = folder.hrefer;
}
setColor(nodeCode);
preNodeCode = nodeCode;
}
function selectNode(nodeCode){ //click the checkbox
var folder = getFolderByCode(nodeCode);
showFolder(folder);
var obj = document.getElementById("fld_chkbox"+folder.code);
var array = getGrandSon(folder);
for (i=0;i<array.length;i++){
document.getElementById("fld_chkbox"+array[i].code).checked = obj.checked;
}
var array1 = getGrandFather(folder);
if (obj.checked){
for (i=0;i<array1.length;i++){
document.getElementById("fld_chkbox"+array1[i].code).checked = true;
}
}
}
function setColor(nodeCode){
document.getElementById("text"+nodeCode).style.color = "red";
if (document.all["text"+preNodeCode] && nodeCode!=preNodeCode){
document.getElementById("text"+preNodeCode).style.color = "#221133"; //menuColor
}
preNodeCode = nodeCode;
}
//--------------------------------------PRIVATE----------------------------------------------------
function winStatus(msg){
window.status = msg;
return true;
}
function hiddenFolder(folder){
folder.isOpen = false;
var nodeCode = folder.code;
if (isLeafNode(nodeCode)){
return;
}
if (hasBrothers(folder)){
document.getElementById("fldImg"+nodeCode).src = teePlusImg;
}else{
document.getElementById("fldImg"+nodeCode).src = cornerPlusImg;
}
if (document.getElementById("1_fldImg"+nodeCode)){
document.getElementById("1_fldImg"+nodeCode).src = folderImg;
}
//change children
var grandson = getDirectSon(nodeCode);
for (var i=0; i<grandson.length; i++){
document.getElementById("fld"+grandson[i].code).style.display = "none";
grandson[i].isOpen = false;
hiddenFolder(grandson[i]);
}
}
function showFolder(folder){
folder.isOpen = true;
var nodeCode = folder.code;
if (isLeafNode(nodeCode)){
return;
}
if (hasBrothers(folder)){
document.getElementById("fldImg"+nodeCode).src = teeMinusImg;
}else{
document.getElementById("fldImg"+nodeCode).src = cornerMinusImg;
}
if (document.getElementById("1_fldImg"+nodeCode)){
document.getElementById("1_fldImg"+nodeCode).src = folderOpenImg;
}
//change children
var grandson = getDirectSon(nodeCode);
for (var i=0; i<grandson.length; i++){
document.getElementById("fld"+grandson[i].code).style.display = "block";
if (isLeafNode(grandson[i].code)){
if (hasBrothers(grandson[i])){
document.getElementById("fldImg"+grandson[i].code).src = teeImg;
}else{
document.getElementById("fldImg"+grandson[i].code).src = cornerImg;
}
}else{
if (hasBrothers(grandson[i])){
document.getElementById("fldImg"+grandson[i].code).src = teePlusImg;
}else{
document.getElementById("fldImg"+grandson[i].code).src = cornerPlusImg;
}
}
}
}
//==============================================================================================//
function getLayerFolders(layer){
var grade = new Array;
var j=0;
for (var i=0;i<count;i++){
if (folders[i].layer == layer){
grade[j++] = folders[i];
}
}
return grade;
}
function getGrandSon(folder){
var nodes = new Array;
var maxlayer = getMaxLayer();
var n = 0;
for (var i=0;i<count;i++){
if (folders[i].parentId == folder.code){
nodes[n++] = folders[i];
if (folder.layer < maxlayer-1){
var sons = getGrandSon(folders[i]);
for (var j=0;j<sons.length;j++){
nodes[n++] = sons[j];
}
}
}
}
return nodes;
}
function getDirectSon(nodeCode){
var nodes = new Array;
for (var i=0;i<count;i++){
if (folders[i].parentId == nodeCode){
nodes.push(folders[i]);
}
}
return nodes;
}
function getGrandFather(folder){
var nodes = new Array;
var minLayer = getMinLayer();
var n = 0;
for (var i=0;i<count;i++){
if (folders[i].code == folder.parentId){
nodes[n++] = folders[i];
if (folder.layer > minLayer+1){
var fathers = getGrandFather(folders[i]);
for (var j=0;j<fathers.length;j++){
nodes[n++] = fathers[j];
}
}
}
}
return nodes;
}
function getBrother(folder){
var nodes = new Array;
var n = 0;
for (var i=0;i<count ;i++ ){
if (folders[i].parentId==folder.parentId && folders[i].code!=folder.code){
nodes[n++] = folders[i];
}
}
return nodes;
}
function getFolderByCode(nodeCode){
var obj = null;
for (var i=0; i<count; i++){
if (folders[i].code == nodeCode){
return folders[i];
}
}
return obj;
}
function getMaxLayer(){
var maxlayer = 0;
for (var i=0;i<count;i++){
if (folders[i].layer > maxlayer){
maxlayer = folders[i].layer;
}
}
return maxlayer;
}
function getMinLayer(){
var minLayer = 10;
for (var i=0;i<count;i++){
if (folders[i].layer < minLayer){
minLayer = folders[i].layer;
}
}
return minLayer;
}
function isLeafNode(nodeCode){
for (var i=0;i<count;i++){
if (folders[i].parentId == nodeCode){
return false;
}
}
return true;
}
function hasBrothers(folder){
for (var i=0; i<count; i++ ){
if (seqFolders[i].code == folder.code){
for (var j=i+1; j<count; j++){
if (seqFolders[j].parentId==folder.parentId){
return true;
}
}
}
}
return false;
}