tree.jsp

<%@?page?import="org.springframework.context.ApplicationContext"%>
<%@?page?import="org.springframework.web.context.support.WebApplicationContextUtils"%>
<%@?page?import="cn.yhct.cms.CmsService"%>
<%@?page?import="java.util.List"%>
<%@?page?import="cn.yhct.cms.model.Column"%>
<%@?page?import="java.util.Set"%>
<%@?page?import="java.util.Iterator"%>
<%@?page?import="org.springframework.context.support.FileSystemXmlApplicationContext"%>
<%@?page?import="javax.servlet.*"%>
<%@?page?import="javax.servlet.http.*"%>
<%@?page?import="javax.servlet.jsp.*"%>
<%@?page?import="java.io.PrintWriter"%>

<%--
??Created?by?IntelliJ?IDEA.
??User:?ChenFeng
??Date:?
2006-7-19
??Time:?
17:14:28
--%>
<%@?page?contentType="text/html;charset=GBK"?language="java"?%>
<html>
??
<head>
????
<title>TREE</title>
????
<link?rel="StyleSheet"?href="img/dtree.css"?type="text/css"?/>
????
<script?type="text/javascript"?src="img/dtree.js"></script>
??
</head>
??
<body>
?
<p>
<%
ApplicationContext?ctx?
=?WebApplicationContextUtils.getWebApplicationContext(session.getServletContext());
CmsService?cmsService?
=?(CmsService)?ctx.getBean("cmsService");
List?rootColumns?
=?cmsService.getAllRootColumns();
%>

??????
<%!
??????
int?con?=0;
??????
public?void?getParentItem(JspWriter?out)????throws?java.io.IOException
??????{

??????????ApplicationContext?ctx?
=ctx?=?new?FileSystemXmlApplicationContext("application_context.xml");
??????????CmsService?cmsService?
=?(CmsService)?ctx.getBean("cmsService");
??????????List?rootColumns?
=?cmsService.getAllRootColumns();
??????????out.print(
"?<link?rel=\"StyleSheet\"?href=\"img/dtree.css\"?type=\"text/css\"?/>");
??????????out.print(
"?<script?type=\"text/javascript\"?src=\"img/dtree.js\"></script>");
??????????out.print(
"?<script?type=\"text/javascript\">");
??????????out.print(
"?d?=?new?dTree('d');");
??????????out.print(
"?d.add(0,-1,'樹(shù)');");

??????????
for(int?i=0;i<rootColumns.size();i++){
??????????Column?column?
=?(Column)rootColumns.get(i);
??????????con
++;
??????????out.print(
"?d.add("+con+","+0+",'"+column.getName()+"');");
??????????
this.getSubItem(column,out,con);

??????????}
??????????out.print(
"?document.write(d);");
??????????out.print(
"?</script>");

??????}
???????
public?void?getSubItem(Column?column,JspWriter?out,int?content)?throws?java.io.IOException
??????{
????????
for(Iterator?childColumns?=?column.getChildColumn().iterator();childColumns.hasNext();)
????????{
????????con
++;
????????Column?childColumn?
=?(Column)?childColumns.next();
????????out.print(
"?d.add("+con+","+content+",'"+column.getName()+"');");
????????
this.getSubItem(childColumn,out,con);
????????}
??????}
??????
%>

??
<%
?????
this.getParentItem(out);
??
%>

??
</body>
</html>


dtree.js





//?Node?object

function?Node(id,?pid,?name,?url,?title,?target,?icon,?iconOpen,?open)?{

????
this.id?=?id;

????
this.pid?=?pid;

????
this.name?=?name;

????
this.url?=?url;

????
this.title?=?title;

????
this.target?=?target;

????
this.icon?=?icon;

????
this.iconOpen?=?iconOpen;

????
this._io?=?open?||?false;

????
this._is?=?false;

????
this._ls?=?false;

????
this._hc?=?false;

????
this._ai?=?0;

????
this._p;

};



//?Tree?object

function?dTree(objName)?{

????
this.config?=?{

????????target????????????????????:?
null,

????????folderLinks????????????:?
true,

????????useSelection????????:?
true,

????????useCookies????????????:?
true,

????????useLines????????????????:?
true,

????????useIcons????????????????:?
true,

????????useStatusText????????:?
false,

????????closeSameLevel????:?
false,

????????inOrder????????????????????:?
false

????}

????
this.icon?=?{

????????root????????????????:?'img
/base.gif',

????????folder????????????:?'img
/folder.gif',

????????folderOpen????:?'img
/folderopen.gif',

????????node????????????????:?'img
/page.gif',

????????empty????????????????:?'img
/empty.gif',

????????line????????????????:?'img
/line.gif',

????????join????????????????:?'img
/join.gif',

????????joinBottom????:?'img
/joinbottom.gif',

????????plus????????????????:?'img
/plus.gif',

????????plusBottom????:?'img
/plusbottom.gif',

????????minus????????????????:?'img
/minus.gif',

????????minusBottom????:?'img
/minusbottom.gif',

????????nlPlus????????????:?'img
/nolines_plus.gif',

????????nlMinus????????????:?'img
/nolines_minus.gif'

????};

????
this.obj?=?objName;

????
this.aNodes?=?[];

????
this.aIndent?=?[];

????
this.root?=?new?Node(-1);

????
this.selectedNode?=?null;

????
this.selectedFound?=?false;

????
this.completed?=?false;

};



//?Adds?a?new?node?to?the?node?array

dTree.prototype.add?
=?function(id,?pid,?name,?url,?title,?target,?icon,?iconOpen,?open)?{

????
this.aNodes[this.aNodes.length]?=?new?Node(id,?pid,?name,?url,?title,?target,?icon,?iconOpen,?open);

};



//?Open/close?all?nodes

dTree.prototype.openAll?
=?function()?{

????
this.oAll(true);

};

dTree.prototype.closeAll?
=?function()?{

????
this.oAll(false);

};



//?Outputs?the?tree?to?the?page

dTree.prototype.toString?
=?function()?{

????
var?str?=?'<div?class="dtree">\n';

????
if?(document.getElementById)?{

????????
if?(this.config.useCookies)?this.selectedNode?=?this.getSelected();

????????str?
+=?this.addNode(this.root);

????}?
else?str?+=?'Browser?not?supported.';

????str?
+=?'</div>';

????
if?(!this.selectedFound)?this.selectedNode?=?null;

????
this.completed?=?true;

????
return?str;

};



//?Creates?the?tree?structure

dTree.prototype.addNode?
=?function(pNode)?{

????
var?str?=?'';

????
var?n=0;

????
if?(this.config.inOrder)?n?=?pNode._ai;

????
for?(n;?n<this.aNodes.length;?n++)?{

????????
if?(this.aNodes[n].pid?==?pNode.id)?{

????????????
var?cn?=?this.aNodes[n];

????????????cn._p?
=?pNode;

????????????cn._ai?
=?n;

????????????
this.setCS(cn);

????????????
if?(!cn.target?&&?this.config.target)?cn.target?=?this.config.target;

????????????
if?(cn._hc?&&?!cn._io?&&?this.config.useCookies)?cn._io?=?this.isOpen(cn.id);

????????????
if?(!this.config.folderLinks?&&?cn._hc)?cn.url?=?null;

????????????
if?(this.config.useSelection?&&?cn.id?==?this.selectedNode?&&?!this.selectedFound)?{

????????????????????cn._is?
=?true;

????????????????????
this.selectedNode?=?n;

????????????????????
this.selectedFound?=?true;

????????????}

????????????str?
+=?this.node(cn,?n);

????????????
if?(cn._ls)?break;

????????}

????}

????
return?str;

};



//?Creates?the?node?icon,?url?and?text

dTree.prototype.node?
=?function(node,?nodeId)?{

????
var?str?=?'<div?class="dTreeNode">'?+?this.indent(node,?nodeId);

????
if?(this.config.useIcons)?{

????????
if?(!node.icon)?node.icon?=?(this.root.id?==?node.pid)???this.icon.root?:?((node._hc)???this.icon.folder?:?this.icon.node);

????????
if?(!node.iconOpen)?node.iconOpen?=?(node._hc)???this.icon.folderOpen?:?this.icon.node;

????????
if?(this.root.id?==?node.pid)?{

????????????node.icon?
=?this.icon.root;

????????????node.iconOpen?
=?this.icon.root;

????????}

????????str?
+=?'<img?id="i'?+?this.obj?+?nodeId?+?'"?src="'?+?((node._io)???node.iconOpen?:?node.icon)?+?'"?alt=""?/>';

????}

????
if?(node.url)?{

????????str?
+=?'<a?id="s'?+?this.obj?+?nodeId?+?'"?class="'?+?((this.config.useSelection)???((node._is???'nodeSel'?:?'node'))?:?'node')?+?'"?href="'?+?node.url?+?'"';

????????
if?(node.title)?str?+=?'?title="'?+?node.title?+?'"';

????????
if?(node.target)?str?+=?'?target="'?+?node.target?+?'"';

????????
if?(this.config.useStatusText)?str?+=?'?onmouseover="window.status=\''?+?node.name?+?'\';return?true;"?onmouseout="window.status=\'\';return?true;"?';

????????
if?(this.config.useSelection?&&?((node._hc?&&?this.config.folderLinks)?||?!node._hc))

????????????str?
+=?'?onclick="javascript:?'?+?this.obj?+?'.s('?+?nodeId?+?');"';

????????str?
+=?'>';

????}

????
else?if?((!this.config.folderLinks?||?!node.url)?&&?node._hc?&&?node.pid?!=?this.root.id)

????????str?
+=?'<a?href="javascript:?'?+?this.obj?+?'.o('?+?nodeId?+?');"?class="node">';

????str?
+=?node.name;

????
if?(node.url?||?((!this.config.folderLinks?||?!node.url)?&&?node._hc))?str?+=?'</a>';

????str?
+=?'</div>';

????
if?(node._hc)?{

????????str?
+=?'<div?id="d'?+?this.obj?+?nodeId?+?'"?class="clip"?style="display:'?+?((this.root.id?==?node.pid?||?node._io)???'block'?:?'none')?+?';">';

????????str?
+=?this.addNode(node);

????????str?
+=?'</div>';

????}

????
this.aIndent.pop();

????
return?str;

};



//?Adds?the?empty?and?line?icons

dTree.prototype.indent?
=?function(node,?nodeId)?{

????
var?str?=?'';

????
if?(this.root.id?!=?node.pid)?{

????????
for?(var?n=0;?n<this.aIndent.length;?n++)

????????????str?
+=?'<img?src="'?+?(?(this.aIndent[n]?==?1?&&?this.config.useLines)???this.icon.line?:?this.icon.empty?)?+?'"?alt=""?/>';

????????(node._ls)?
??this.aIndent.push(0)?:?this.aIndent.push(1);

????????
if?(node._hc)?{

????????????str?
+=?'<a?href="javascript:?'?+?this.obj?+?'.o('?+?nodeId?+?');"><img?id="j'?+?this.obj?+?nodeId?+?'"?src="';

????????????if?(!this.config.useLines)?str?+=?(node._io)???this.icon.nlMinus?:?this.icon.nlPlus;

????????????else?str?+=?(?(node._io)???((node._ls?&&?this.config.useLines)???this.icon.minusBottom?:?this.icon.minus)?:?((node._ls?&&?this.config.useLines)???this.icon.plusBottom?:?this.icon.plus?)?);

????????????str?+=?'
"?alt=""?/></a>';

????????}?
else?str?+=?'<img?src="'?+?(?(this.config.useLines)???((node._ls)???this.icon.joinBottom?:?this.icon.join?)?:?this.icon.empty)?+?'"?alt=""?/>';

????}

????
return?str;

};



//?Checks?if?a?node?has?any?children?and?if?it?is?the?last?sibling

dTree.prototype.setCS?
=?function(node)?{

????
var?lastId;

????
for?(var?n=0;?n<this.aNodes.length;?n++)?{

????????
if?(this.aNodes[n].pid?==?node.id)?node._hc?=?true;

????????
if?(this.aNodes[n].pid?==?node.pid)?lastId?=?this.aNodes[n].id;

????}

????
if?(lastId==node.id)?node._ls?=?true;

};



//?Returns?the?selected?node

dTree.prototype.getSelected?
=?function()?{

????
var?sn?=?this.getCookie('cs'?+?this.obj);

????
return?(sn)???sn?:?null;

};



//?Highlights?the?selected?node

dTree.prototype.s?
=?function(id)?{

????
if?(!this.config.useSelection)?return;

????
var?cn?=?this.aNodes[id];

????
if?(cn._hc?&&?!this.config.folderLinks)?return;

????
if?(this.selectedNode?!=?id)?{

????????
if?(this.selectedNode?||?this.selectedNode==0)?{

????????????eOld?
=?document.getElementById("s"?+?this.obj?+?this.selectedNode);

????????????eOld.className?
=?"node";

????????}

????????eNew?
=?document.getElementById("s"?+?this.obj?+?id);

????????eNew.className?
=?"nodeSel";

????????
this.selectedNode?=?id;

????????
if?(this.config.useCookies)?this.setCookie('cs'?+?this.obj,?cn.id);

????}

};



//?Toggle?Open?or?close

dTree.prototype.o?
=?function(id)?{

????
var?cn?=?this.aNodes[id];

????
this.nodeStatus(!cn._io,?id,?cn._ls);

????cn._io?
=?!cn._io;

????
if?(this.config.closeSameLevel)?this.closeLevel(cn);

????
if?(this.config.useCookies)?this.updateCookie();

};



//?Open?or?close?all?nodes

dTree.prototype.oAll?
=?function(status)?{

????
for?(var?n=0;?n<this.aNodes.length;?n++)?{

????????
if?(this.aNodes[n]._hc?&&?this.aNodes[n].pid?!=?this.root.id)?{

????????????
this.nodeStatus(status,?n,?this.aNodes[n]._ls)

????????????
this.aNodes[n]._io?=?status;

????????}

????}

????
if?(this.config.useCookies)?this.updateCookie();

};



//?Opens?the?tree?to?a?specific?node

dTree.prototype.openTo?
=?function(nId,?bSelect,?bFirst)?{

????
if?(!bFirst)?{

????????
for?(var?n=0;?n<this.aNodes.length;?n++)?{

????????????
if?(this.aNodes[n].id?==?nId)?{

????????????????nId
=n;

????????????????
break;

????????????}

????????}

????}

????
var?cn=this.aNodes[nId];

????
if?(cn.pid==this.root.id?||?!cn._p)?return;

????cn._io?
=?true;

????cn._is?
=?bSelect;

????
if?(this.completed?&&?cn._hc)?this.nodeStatus(true,?cn._ai,?cn._ls);

????
if?(this.completed?&&?bSelect)?this.s(cn._ai);

????
else?if?(bSelect)?this._sn=cn._ai;

????
this.openTo(cn._p._ai,?false,?true);

};



//?Closes?all?nodes?on?the?same?level?as?certain?node

dTree.prototype.closeLevel?
=?function(node)?{

????
for?(var?n=0;?n<this.aNodes.length;?n++)?{

????????
if?(this.aNodes[n].pid?==?node.pid?&&?this.aNodes[n].id?!=?node.id?&&?this.aNodes[n]._hc)?{

????????????
this.nodeStatus(false,?n,?this.aNodes[n]._ls);

????????????
this.aNodes[n]._io?=?false;

????????????
this.closeAllChildren(this.aNodes[n]);

????????}

????}

}



//?Closes?all?children?of?a?node

dTree.prototype.closeAllChildren?
=?function(node)?{

????
for?(var?n=0;?n<this.aNodes.length;?n++)?{

????????
if?(this.aNodes[n].pid?==?node.id?&&?this.aNodes[n]._hc)?{

????????????
if?(this.aNodes[n]._io)?this.nodeStatus(false,?n,?this.aNodes[n]._ls);

????????????
this.aNodes[n]._io?=?false;

????????????
this.closeAllChildren(this.aNodes[n]);????????

????????}

????}

}



//?Change?the?status?of?a?node(open?or?closed)

dTree.prototype.nodeStatus?
=?function(status,?id,?bottom)?{

????eDiv????
=?document.getElementById('d'?+?this.obj?+?id);

????eJoin????
=?document.getElementById('j'?+?this.obj?+?id);

????
if?(this.config.useIcons)?{

????????eIcon????
=?document.getElementById('i'?+?this.obj?+?id);

????????eIcon.src?
=?(status)???this.aNodes[id].iconOpen?:?this.aNodes[id].icon;

????}

????eJoin.src?
=?(this.config.useLines)?

????((status)
?((bottom)?this.icon.minusBottom:this.icon.minus):((bottom)?this.icon.plusBottom:this.icon.plus)):

????((status)
?this.icon.nlMinus:this.icon.nlPlus);

????eDiv.style.display?
=?(status)???'block':?'none';

};





//?[Cookie]?Clears?a?cookie

dTree.prototype.clearCookie?
=?function()?{

????
var?now?=?new?Date();

????
var?yesterday?=?new?Date(now.getTime()?-?1000?*?60?*?60?*?24);

????
this.setCookie('co'+this.obj,?'cookieValue',?yesterday);

????
this.setCookie('cs'+this.obj,?'cookieValue',?yesterday);

};



//?[Cookie]?Sets?value?in?a?cookie

dTree.prototype.setCookie?
=?function(cookieName,?cookieValue,?expires,?path,?domain,?secure)?{

????document.cookie?
=

????????escape(cookieName)?
+?'='?+?escape(cookieValue)

????????
+?(expires???';?expires='?+?expires.toGMTString()?:?'')

????????
+?(path???';?path='?+?path?:?'')

????????
+?(domain???';?domain='?+?domain?:?'')

????????
+?(secure???';?secure'?:?'');

};



//?[Cookie]?Gets?a?value?from?a?cookie

dTree.prototype.getCookie?
=?function(cookieName)?{

????
var?cookieValue?=?'';

????
var?posName?=?document.cookie.indexOf(escape(cookieName)?+?'=');

????
if?(posName?!=?-1)?{

????????
var?posValue?=?posName?+?(escape(cookieName)?+?'=').length;

????????
var?endPos?=?document.cookie.indexOf(';',?posValue);

????????
if?(endPos?!=?-1)?cookieValue?=?unescape(document.cookie.substring(posValue,?endPos));

????????
else?cookieValue?=?unescape(document.cookie.substring(posValue));

????}

????
return?(cookieValue);

};



//?[Cookie]?Returns?ids?of?open?nodes?as?a?string

dTree.prototype.updateCookie?
=?function()?{

????
var?str?=?'';

????
for?(var?n=0;?n<this.aNodes.length;?n++)?{

????????
if?(this.aNodes[n]._io?&&?this.aNodes[n].pid?!=?this.root.id)?{

????????????
if?(str)?str?+=?'.';

????????????str?
+=?this.aNodes[n].id;

????????}

????}

????
this.setCookie('co'?+?this.obj,?str);

};



//?[Cookie]?Checks?if?a?node?id?is?in?a?cookie

dTree.prototype.isOpen?
=?function(id)?{

????
var?aOpen?=?this.getCookie('co'?+?this.obj).split('.');

????
for?(var?n=0;?n<aOpen.length;?n++)

????????
if?(aOpen[n]?==?id)?return?true;

????
return?false;

};



//?If?Push?and?pop?is?not?implemented?by?the?browser

if?(!Array.prototype.push)?{

????Array.prototype.push?
=?function?array_push()?{

????????
for(var?i=0;i<arguments.length;i++)

????????????
this[this.length]=arguments[i];

????????
return?this.length;

????}

};

if?(!Array.prototype.pop)?{

????Array.prototype.pop?
=?function?array_pop()?{

????????lastElement?
=?this[this.length-1];

????????
this.length?=?Math.max(this.length-1,0);

????????
return?lastElement;

????}

};