You are viewing a plain text version of this content. The canonical link for it is here.
Posted to jetspeed-dev@portals.apache.org by ta...@apache.org on 2006/12/05 23:52:36 UTC

svn commit: r482815 [2/2] - in /portals/jetspeed-2/trunk/applications/j2-admin/src: java/org/apache/jetspeed/portlets/site/ webapp/WEB-INF/ webapp/WEB-INF/velocity/ webapp/WEB-INF/view/ webapp/WEB-INF/view/site/ webapp/images/

Added: portals/jetspeed-2/trunk/applications/j2-admin/src/webapp/WEB-INF/view/site/site-view.vm
URL: http://svn.apache.org/viewvc/portals/jetspeed-2/trunk/applications/j2-admin/src/webapp/WEB-INF/view/site/site-view.vm?view=auto&rev=482815
==============================================================================
--- portals/jetspeed-2/trunk/applications/j2-admin/src/webapp/WEB-INF/view/site/site-view.vm (added)
+++ portals/jetspeed-2/trunk/applications/j2-admin/src/webapp/WEB-INF/view/site/site-view.vm Tue Dec  5 14:52:32 2006
@@ -0,0 +1,1694 @@
+#set($rc = $renderRequest.getAttribute("org.apache.jetspeed.request.RequestContext"))
+#set($req = $rc.Request)
+#set($app = $renderRequest.getContextPath())
+#set($rooturl = "${req.scheme}://${req.serverName}:${req.serverPort}${req.contextPath}/")
+
+  <div dojoType="dialog" id="DeleteResourceDialog" bgColor="grey" bgOpacity="0.5" toggle="fade" toggleDuration="250">
+    <form onsubmit="return false;">
+    <table>
+      <tr>
+        <td>Confirm Deletion of <span id='del.kind'></span> <span id='del.name'></span>:</td><td>&nbsp;</td>
+      </tr>
+      <tr>
+        <td colspan="2" align="right" class="buttonboxright">
+          <button dojoType="Button" onClick="dojo.widget.byId( 'DeleteResourceDialog' ).hide();" >Cancel</button>
+          <button dojoType="Button" onClick="dojo.widget.byId( 'DeleteResourceDialog' ).hide(); deleteResource();">Delete</button>
+        </td>
+      </tr>
+    </table>
+    </form>
+  </div>
+
+  <div dojoType="dialog" id="NewResourceDialog" bgColor="grey" bgOpacity="0.5" toggle="fade" toggleDuration="250" class="constraints">
+    <form onsubmit="return false;">
+    <table>      
+    <tr>
+      <td class="permissions" colspan='2'>Create new <span id='res.kind'></span>:</td><td>&nbsp;</td>        
+    </tr>      
+    <tr>
+      <td class="permissions">Name</td>
+      <td class="permissions">
+        <input type="text" id="res.name" class="medium" required="true" onChange="validateResourceName()"/>
+        <input type='hidden' id='res.parent' />
+      </td>
+    </tr>
+    <tr>
+      <td class="permissions">Title</td>
+      <td class="permissions">
+        <input type="text" id="res.title" class="medium" required="true" onChange="validateNewField()"/>
+      </td>
+    </tr>
+    <tr>
+      <td class="permissions">Short Title</td>
+      <td class="permissions">
+        <input type="text" id="res.short-title" class="medium" />
+      </td>
+    </tr>      
+    <tr id="res.link">
+      <td class="permissions">URL</td>
+      <td class="permissions">
+        <input type="text" id="res.url" class="medium" onChange="validateNewField()"/>
+      </td>
+    </tr>
+      <tr>
+        <td align='right'>
+          <button widgetId='res.save' dojoType="Button" onClick="dojo.widget.byId( 'NewResourceDialog' ).hide(); createResource();">Create</button>
+        </td>
+        <td align='right'>
+          <button dojoType="Button" onClick="dojo.widget.byId( 'NewResourceDialog' ).hide();" >Cancel</button>
+        </td>
+      </tr>
+    </table>
+    </form>
+  </div>
+
+  <div dojoType="dialog" id="NewOwnerDialog" bgColor="grey" bgOpacity="0.5" toggle="fade" toggleDuration="250" class="constraints">
+    <form onsubmit="return false;">
+    <table>      
+    <tr>
+      <td class="permissions" colspan='2'>Owner Constraint:</td><td>&nbsp;</td>        
+    </tr>      
+    <tr>
+      <td class="permissions">Name</td>
+      <td class="permissions">
+        <input type="text" id="owner.name" class="medium" required="true" onChange="validateOwnerName()"/>
+      </td>
+    </tr>
+    <tr>
+        <td align='right'>
+          <button widgetId='owner.save' dojoType="Button" onClick="dojo.widget.byId( 'NewOwnerDialog' ).hide(); createOwner();">Save</button>
+        </td>
+        <td align='right'>
+          <button dojoType="Button" onClick="dojo.widget.byId( 'NewOwnerDialog' ).hide();" >Cancel</button>
+        </td>
+      </tr>
+    </table>
+    </form>
+  </div>
+
+<div dojoType="TreeRPCController" 
+     RPCUrl="${rooturl}/ajaxapi?action=getfolderlist" 
+     widgetId="treeController" 
+     DNDController="create">
+</div>
+
+<div dojoType="TreeSelector" widgetId="treeSelector" eventNames="select:nodeSelected"></div>
+
+<div dojoType="TreeContextMenu" toggle="explode" contextMenuForWindow="false" widgetId="treeContextMenu">
+  <div dojoType="TreeMenuItem" treeActions="remove" iconSrc="$app/images/delete.png" caption="Remove" widgetId="treeContextMenuRemove"></div> 
+  <div dojoType="TreeMenuItem" treeActions="newFolder" iconSrc="$app/images/folder_new.gif" caption="New Folder" widgetId="treeContextMenuNewFolder"></div>
+  <div dojoType="TreeMenuItem" treeActions="newPage" iconSrc="$app/images/page_new.gif" caption="New Page" widgetId="treeContextMenuNewPage"></div>  
+  <div dojoType="TreeMenuItem" treeActions="newLink" iconSrc="$app/images/link_add.png" caption="New Link" widgetId="treeContextMenuNewLink"></div>  
+  <div dojoType="TreeMenuItem" treeActions="copy" iconSrc="$app/images/mouse_add.png" caption="Copy" widgetId="treeContextMenuCopy"></div>
+  <div dojoType="TreeMenuItem" treeActions="move" iconSrc="$app/images/move.gif" caption="Move" widgetId="treeContextMenuMove"></div>
+</div>
+
+<script type="text/javascript">
+function getNewMetaPrototype()
+{
+    return { name: "", language: "", value: "" };
+}
+function getNewSecurityPrototype()
+{
+    return { name: "", kind: "" };
+}
+function createNewInformation(kind)
+{
+    return { kind: kind, modified: false}
+}
+var FolderHandler = function()
+{
+  this.populate = function(data) 
+  {
+     document.getElementById("rhs").style.display = "block";
+     dojo.widget.byId("rhs").show();
+     elementToInput("finfo", "name", data);
+     elementToInput("finfo", "path", data);                                  
+     titlesToInput("finfo", "title", "short-title", data);
+     elementToInput("finfo", "default-page", data);
+     attributeToSelect("finfo", "defaults", "layout-decorator", data);
+     attributeToSelect("finfo", "defaults", "portlet-decorator", data);
+     attributeToCheckbox("finfo", "folder", "hidden", data);
+     window.information = createNewInformation("finfo");
+     populateMetadata("metadata", data, "folder");
+     populateSecurity("security", data, "folder");
+     document.getElementById("divFolderButtons").style.display = "block";     
+  }     
+  this.failure = function(data)
+  {
+  }
+}
+var PageHandler = function()
+{
+  this.populate = function(data) 
+  {
+     document.getElementById("rhs").style.display = "block";
+     dojo.widget.byId("rhs").show();
+     elementToInput("pinfo", "name", data);
+     elementToInput("pinfo", "path", data);
+     titlesToInput("pinfo", "title", "short-title", data);
+     attributeToSelect("pinfo", "defaults", "layout-decorator", data);
+     attributeToSelect("pinfo", "defaults", "portlet-decorator", data);
+     attributeToSelect("pinfo", "defaults", "theme", data);
+     attributeToCheckbox("pinfo", "page", "hidden", data);     
+     window.information = createNewInformation("pinfo");
+     populateMetadata("metadata", data, "page");
+     populateSecurity("security", data, "page");
+     document.getElementById("divFolderButtons").style.display = "none";
+  }     
+  this.failure = function(data)
+  {
+  }
+}
+var LinkHandler = function()
+{
+  this.populate = function(data) 
+  {
+     document.getElementById("rhs").style.display = "block";
+     dojo.widget.byId("rhs").show();
+     elementToInput("linfo", "name", data);
+     elementToInput("linfo", "path", data);
+     titlesToInput("linfo", "title", "short-title", data);
+     elementToInput("linfo", "url", data);
+     elementToSelect("linfo", "target", data);    
+     attributeToCheckbox("linfo", "link", "hidden", data);     
+     window.information = createNewInformation("linfo");
+     populateMetadata("metadata", data, "link");
+     populateSecurity("security", data, "link");
+     document.getElementById("divFolderButtons").style.display = "none";
+  }     
+  this.failure = function(data)
+  {
+  }
+}
+function editResource(node)
+{
+    if (node == null)
+    {
+       alert("Please select a resource in the portal site tree.");
+       return;
+    }    
+    determineSave();
+    if ( node.object == "Folder" )
+    {   
+        var names = new Array("folder");
+        var values = new Array(node.widgetId);
+        ajaxInvoke("getfolder", names, values, new FolderHandler() );     
+        dojo.widget.byId( "saveFInfoButton" ).setDisabled(true);
+        dojo.widget.byId( "revertFInfoButton" ).setDisabled(true);
+        displayTabs( [ "infoTabFolder", "securityTab", "metaTab", "menusTab", "orderTab" ] );
+    }
+    if ( node.object == "Page" )
+    {
+        var names = new Array("page", "fragments");
+        var values = new Array(node.widgetId, "false");
+        ajaxInvoke("getpage", names, values, new PageHandler() );     
+        dojo.widget.byId( "savePInfoButton" ).setDisabled(true);
+        dojo.widget.byId( "revertPInfoButton" ).setDisabled(true);
+        displayTabs( [ "infoTabPage", "securityTab", "metaTab" ] );
+    }
+    else if ( node.object == "Link" )
+    {
+        var names = new Array("link");
+        var values = new Array(node.widgetId);
+        ajaxInvoke("getlink", names, values, new LinkHandler() );         
+        dojo.widget.byId( "saveLInfoButton" ).setDisabled(true);
+        dojo.widget.byId( "revertLInfoButton" ).setDisabled(true);
+        displayTabs( [ "infoTabLinks", "securityTab", "metaTab" ] );
+    }
+}
+function validateNewField()
+{
+    dojo.widget.byId("res.save").setDisabled(disableNewSave());    
+}
+function validateResourceName()
+{
+    var name = dojo.byId("res.name").value;   
+    var kind = dojo.byId("res.kind").innerHTML;
+    if (name != null && dojo.string.trim(name).length > 0)
+    {
+        name = dojo.string.trim(name.toLowerCase());
+        if (kind == "Page")
+        {
+            var regex = new RegExp(".*\.psml");
+            if (!name.match(regex))
+            {
+                name = name + ".psml";
+                dojo.byId("res.name").value = name;
+            }
+        }
+        else if (kind == "Link")
+        {
+            var regex = new RegExp(".*\.link");
+            if (!name.match(regex))
+            {
+                name = name + ".link";
+                dojo.byId("res.name").value = name;
+            }
+        }
+        if (isDupe(kind, name))
+        {
+             alert(kind + " name " + name + " is already in use. Please chose another name.");
+             dojo.widget.byId("res.save").setDisabled(true);    
+        }
+    }
+    dojo.widget.byId("res.save").setDisabled(disableNewSave());    
+}
+function disableNewSave()
+{
+    var title = dojo.byId("res.title").value;   
+    var name = dojo.byId("res.name").value;   
+    var kind = dojo.byId("res.kind").innerHTML;
+    var disabled = false;    
+    if (name == null || dojo.string.trim(name) == "" ||
+        title == null || dojo.string.trim(title) == "")
+        disabled = true;
+    if (kind == "Link")
+    {
+        var url = dojo.byId("res.url").value;
+        if (url == null || dojo.string.trim(url) == "")
+            disabled = true;
+    }
+    return disabled;    
+}
+function isDupe(kind, name)
+{
+    var selector = dojo.widget.byId('treeSelector');
+    var parent = selector.selectedNode;
+    for(var i=0; i<parent.children.length; i++) 
+    {
+        var child = parent.children[i];
+        if (child.object == kind && child.title == name)
+        {
+            return true;
+        }
+    }
+    return false;
+}
+function createResource()
+{
+    var selector = dojo.widget.byId('treeSelector');
+    if (selector.selectedNode == null)
+    {
+        alert("Please select a resource");
+        return;
+    }
+    var parent = selector.selectedNode;
+    if (selector.selectedNode.isFolder == false)
+        parent = selector.selectedNode.parent;
+    
+    var node = new dojo.widget.TreeNode();
+    node.isFolder = false;
+    node.object = document.getElementById("res.kind").innerHTML;
+    var sep = "/";
+    if (parent.widgetId.substring(parent.widgetId.length-1) == "/")
+       sep = "";
+    node.widgetId = parent.widgetId + sep + document.getElementById("res.name").value;
+    node.title = document.getElementById("res.name").value;
+    node.childIconSrc = "$app/images/" + node.object.toLowerCase() + ".gif";
+    node.isFolder = (node.object == "Folder");
+    // create new Node
+    var action = "update" + node.object.toLowerCase();
+    var names = new Array();
+    var values = new Array();
+    names[0] = "method";
+    values[0] = "add";
+    names[1] = "path";
+    values[1] = escape(node.widgetId);
+    names[2] = "name";
+    values[2] = escape(node.title);
+    names[3] = "title";
+    values[3] = escape(document.getElementById("res.title").value);
+    names[4] = "defaultLayout";
+    values[4] = escape(document.getElementById("defaultLayout").value);
+    var index = 5;
+    var stitle = document.getElementById("res.short-title").value;
+    if (stitle != null && stitle != "")
+    {
+        names[index] = "short-title";
+        values[index] = escape(stitle);
+        index = index + 1;
+    }
+    if (node.object == "Link")
+    {
+        names[index] = "url";
+        values[index] = escape(document.getElementById("res.url").value);
+        index = index + 1;
+    }
+    ajaxInvoke(action, names, values, new ResourceAddHandler(parent, node) );     
+}
+function deleteResource()
+{
+    var selector = dojo.widget.manager.getWidgetById('treeSelector');
+    if (selector.selectedNode == null)
+    {
+        alert("Please select a resource");
+        return;
+    }
+    var node = selector.selectedNode;
+    var parent = selector.selectedNode.parent;
+    if (node.title == "/")
+    {
+        alert("Please do not delete the root folder!");
+        return;
+    }
+    var kind = document.getElementById("res.kind").innerHTML;
+    
+    var action = "update" + node.object.toLowerCase();
+    var names = new Array();
+    var values = new Array();
+    names[0] = "method";
+    values[0] = "remove";
+    names[1] = "path";
+    values[1] = escape(node.widgetId);
+    ajaxInvoke(action, names, values, new ResourceDeleteHandler(parent, node) );     
+}
+var ResourceAddHandler = function(parent, node)
+{
+  this.parent = parent;
+  this.node = node;
+  this.populate = function(data) 
+  { 
+    // insert in sorted order
+    for(var i=0; i<parent.children.length; i++) 
+    {
+        var child = parent.children[i];
+        if (child.object == node.object)
+        {
+             if (child.title > node.title)
+             {
+                break;
+             }
+        }
+        else
+        {
+            if (node.object == "Folder")
+                break;
+            if (node.object == "Page" && child.object == "Link")
+                break;
+        }
+    }
+    var controller = dojo.widget.byId('treeController');
+    var res = controller.createChild(parent, i, node);
+    var selector = dojo.widget.byId('treeSelector');
+    selector.select({ source: parent, event: {} });
+    editResource(parent);
+  }
+  this.failure = function(data)
+  {
+  }
+}
+var ResourceDeleteHandler = function(parent, node)
+{
+  this.parent = parent;
+  this.node = node;
+  this.populate = function(data) 
+  { 
+    var controller = dojo.widget.byId('treeController');
+    var res = controller.removeNode(node);
+    var selector = dojo.widget.byId('treeSelector');
+    selector.select({ source: parent, event: {} });
+    editResource(parent);
+  }
+  this.failure = function(data)
+  {
+  }
+}
+function moveResource(node)
+{
+    if (node == null)
+    {
+       alert("Please select a resource in the portal site tree.");
+       return;
+    }    
+    alert("MOVE not implemented");
+}
+function copyResource(node)
+{
+    if (node == null)
+    {
+       alert("Please select a resource in the portal site tree.");
+       return;
+    }    
+    alert("COPY not implemented");
+}
+function removeResource(xnode)
+{
+    var selector = dojo.widget.byId('treeSelector');
+    var node = selector.selectedNode;
+    if (node == null)
+    {
+        selector.select({ source: xnode, event: {} });
+        node = xnode;
+    }
+    var parent = selector.selectedNode.parent;
+    if (node.title == "/")
+    {
+        alert("Please do not delete the root folder!");
+        return;
+    }
+
+    document.getElementById("res.parent").value = node.widgetId;
+    document.getElementById("res.name").value = "";
+    document.getElementById("res.title").value = "";
+    document.getElementById("res.short-title").value = "";
+    document.getElementById("del.kind").innerHTML = node.object;
+    document.getElementById("del.name").innerHTML = node.title;    
+    dojo.widget.byId("res.save").setDisabled(true);
+    dojo.widget.byId( "DeleteResourceDialog" ).show();
+}
+function viewResource(xnode)
+{
+    var selector = dojo.widget.byId('treeSelector');
+    var node = selector.selectedNode;
+    if (node == null)
+    {
+        selector.select({ source: xnode, event: {} });
+        node = xnode;
+    }
+    if (node.object == "Link")
+    {
+        var url = document.getElementById("linfo.url").value;
+        window.open(url, 'w-' + node.title);
+    }
+    else 
+    {
+        var servletPath = "${req.ServletPath}";
+        var regex = new RegExp("/portal.*");
+        if (servletPath.match(regex))
+            servletPath = "portal";
+        else
+        {
+            if (servletPath == "/")
+                servletPath = "portal";
+            else
+                servletPath = "desktop";
+        }
+        window.open("${rooturl}" + servletPath + node.widgetId, 'w-' + node.title);
+    }
+}
+function newResource(kind, xnode)
+{
+    var selector = dojo.widget.byId('treeSelector');
+    var node = selector.selectedNode;
+    if (node == null)
+    {
+        selector.select({ source: xnode, event: {} });
+        node = xnode;
+    }
+    document.getElementById("res.parent").value = node.widgetId;
+    document.getElementById("res.name").value = "";
+    document.getElementById("res.title").value = "";
+    document.getElementById("res.short-title").value = "";
+    document.getElementById("res.kind").innerHTML = kind; 
+    if (kind == "Link")
+        document.getElementById("res.link").style.display = "";
+    else
+        document.getElementById("res.link").style.display = "none";
+    dojo.widget.byId("res.save").setDisabled(true);
+    dojo.widget.byId( "NewResourceDialog" ).show();
+}
+// single click node handler
+var TreeNodeSelectionHandler = function(notUsed) 
+{
+  //this.name = eventName;
+  this.run = function(message) 
+  {        
+      editResource(message.node);
+  }
+}
+// subscribe to node selected (single left-click) event on tree
+dojo.addOnLoad(function() 
+{   
+   dojo.event.topic.subscribe("nodeSelected", new TreeNodeSelectionHandler("notUsed"), 'run');   
+}); 
+/* setup context menu actions */
+dojo.addOnLoad(function() 
+{
+  dojo.event.topic.subscribe('treeContextMenuRemove/engage',
+  function (menuItem) 
+  { 
+      removeResource(menuItem.getTreeNode());   
+  });
+  dojo.event.topic.subscribe('treeContextMenuNewFolder/engage',
+  function (menuItem) 
+  { 
+     newResource("Folder", menuItem.getTreeNode());     
+  });
+  dojo.event.topic.subscribe('treeContextMenuNewPage/engage',
+  function (menuItem) 
+  { 
+     newResource("Page", menuItem.getTreeNode());     
+  });
+  dojo.event.topic.subscribe('treeContextMenuNewLink/engage',
+  function (menuItem) 
+  { 
+     newResource("Link", menuItem.getTreeNode());     
+  });    
+  dojo.event.topic.subscribe('treeContextMenuCopy/engage',
+  function (menuItem) 
+   { 
+      copyResource(menuItem.getTreeNode());
+   });
+  dojo.event.topic.subscribe('treeContextMenuMove/engage',
+  function (menuItem) 
+   { 
+      moveResource(menuItem.getTreeNode());   
+   });
+});
+</script>
+
+#macro (TraverseFolders $f)
+  <div isFolder='true' object='Folder' dojoType="TreeNode" widgetId="$f.Path" title="$f.Name" childIconSrc="$app/images/folder.gif">
+  #foreach($subf in $f.Folders.iterator())
+## DST: MIGHT NEED TO LAZY LOAD  FOR PERFORMANCE 
+##    #TraverseFolders($subf) 
+    <div isFolder='true' object='Folder' dojoType="TreeNode" widgetId="$subf.Path" title="$subf.Name" childIconSrc="$app/images/folder.gif"></div>
+  #end  
+  #foreach($p in $f.Pages.iterator())
+    <div object='Page' dojoType="TreeNode" widgetId="$p.Path" title="$p.Name" childIconSrc="$app/images/page.gif" actionsDisabled="newPage,newFolder,newLink"></div>
+  #end  
+  #foreach($link in $f.Links.iterator())
+    <div object='Link' dojoType="TreeNode" widgetId="$link.Path" title="$link.Name" childIconSrc="$app/images/link.gif" actionsDisabled="newPage,newFolder,newLink,customize"></div>
+  #end  
+  </div>
+#end
+
+#macro (FolderTreeView $f)
+<div dojoType="Tree"  widgetId="siteTree" DNDMode="between" selector="treeSelector" 
+      actionsDisabled="customize,move,delete" toggler="fade" DNDAcceptTypes="siteTree" controller="treeController" menu='treeContextMenu'>
+#TraverseFolders($f)
+</div>
+#end
+
+<!-- state -->
+<input type="hidden" id="site.path"/>
+<input type="hidden" id="site.kind"/>
+<input type="hidden" id="defaultLayout" value="$!defaultLayout"/>
+
+<!-- Start Site View Layout -->
+<div dojoType="LayoutContainer" style="width: 100%; height: 500px; border: 1px solid gray;">
+
+<!-- Start LHS -->    
+<div dojoType="LayoutContainer" widgetId="lhs" layoutAlign="left" style="width: 32%; border: 1px solid gray; ">
+
+<div dojoType="ContentPane" widgetId="lhs2" style="width: 100%; height: 100%; overflow:auto;">
+#FolderTreeView($folders)
+</div>
+</div>
+<!-- Start RHS -->    
+<div dojoType="LayoutContainer" id="rhs" widgetId="rhs" layoutAlign="client" style="display:none; border: 1px solid gray; width: 68%">
+<!-- Start Main Tab Container -->    
+<div id="mainTabContainer" dojoType="TabContainer" selectedChild="infoTabFolder" doLayout="false">
+<div id="infoTabFolder" dojoType="ContentPane" label="Information">
+  <table class="formAnswer" style="width: 100%;">
+    <tr>
+      <td class="emphasise">Name</td>
+      <td width="100%">
+        <input type="text" DISABLED id="finfo.name" class="long" required="true" onChange="updateInfoFields()"/>
+        <input type="hidden" id="finfo.path"/>        
+      </td>
+    </tr>
+    <tr>
+      <td class="emphasise">Title</td>
+      <td width="100%">
+        <input type="text" id="finfo.title" class="long" required="true" onChange="updateInfoFields()"/>
+      </td>
+    </tr>
+    <tr>
+      <td class="emphasise">Short Title</td>
+      <td>
+        <input type="text" id="finfo.short-title" class="medium" onChange="updateInfoFields()"/>
+      </td>
+    </tr>
+    <tr>
+      <td class="emphasise">Default Page</td>
+      <td>
+        <input type="text" id="finfo.default-page" class="medium" onChange="updateInfoFields()"/>
+      </td>
+    </tr>
+    <tr>
+      <td class="emphasise">Page Decorator</td>
+      <td>                                        
+        <select id="finfo.layout-decorator" onChange="updateInfoFields()">
+            <option selected value=""></option>
+#foreach ($dec in $page-decorations)        
+            <option value="$dec">$dec</option>
+#end            
+        </select>      
+      </td>
+    </tr>
+    <tr>
+      <td class="emphasise">Portlet Decorator</td>
+      <td>
+        <select id="finfo.portlet-decorator" onChange="updateInfoFields()">
+            <option selected value=""></option>        
+#foreach ($dec in $portlet-decorations)        
+            <option value="$dec">$dec</option>
+#end            
+        </select>      
+      </td>
+    </tr>
+    <tr>
+      <td class="emphasise">Hidden</td>
+      <td>
+        <input type="checkbox" id="finfo.hidden" onChange="updateInfoFields()"/> 
+      </td>
+    </tr>
+  </table>
+<div dojoType="LayoutContainer" widgetId="FEditorControls" minHeight="20" layoutAlign="bottom" style="width: 20%; height: 55px">
+  <div class="buttonbox">
+    <button widgetId="saveFInfoButton" dojoType="Button" onclick="saveInfo()">Save</button>
+    <button widgetId="revertFInfoButton" dojoType="Button" onclick="revertInfo()">Revert</button>
+  </div>
+</div>
+
+</div> <!-- End Tab Information -->
+
+<div id="infoTabPage" dojoType="ContentPane" label="Information">
+  <table class="formAnswer" style="width: 100%;">
+    <tr>
+      <td class="emphasise">Name</td>
+      <td width="100%">
+        <input DISABLED type="text" id="pinfo.name" class="long" required="true" onChange="updateInfoFields()"/>
+        <input type="hidden" id="pinfo.path"/>
+      </td>
+    </tr>
+    <tr>
+      <td class="emphasise">Title</td>
+      <td width="100%">
+        <input type="text" id="pinfo.title" class="long" required="true" onChange="updateInfoFields()"/>
+      </td>
+    </tr>
+    <tr>
+      <td class="emphasise">Short Title</td>
+      <td>
+        <input type="text" id="pinfo.short-title" class="medium" onChange="updateInfoFields()"/>
+      </td>
+    </tr>
+    <tr>
+      <td class="emphasise">Page Decorator</td>
+      <td>                                        
+        <select id="pinfo.layout-decorator" onChange="updateInfoFields()">
+            <option selected value=""></option>           
+#foreach ($dec in $page-decorations)    
+            <option value="$dec">$dec</option>
+#end            
+        </select>      
+      </td>
+    </tr>
+    <tr>
+      <td class="emphasise">Portlet Decorator</td>
+      <td>
+        <select id="pinfo.portlet-decorator" onChange="updateInfoFields()">
+            <option selected value=""></option>           
+#foreach ($dec in $portlet-decorations)        
+            <option value="$dec">$dec</option>
+#end            
+        </select>      
+      </td>
+    </tr>
+    <tr>
+      <td class="emphasise">Desktop Theme</td>
+      <td>
+        <select id="pinfo.theme" onChange="updateInfoFields()">
+            <option selected value=""></option>           
+#foreach ($dec in $themes)        
+            <option value="$dec">$dec</option>
+#end            
+        </select>      
+      </td>
+    </tr>
+    <tr>
+      <td class="emphasise">Hidden</td>
+      <td>
+        <input type="checkbox" id="pinfo.hidden" onChange="updateInfoFields()" /> 
+      </td>
+    </tr>
+  </table>
+
+<div dojoType="LayoutContainer" widgetId="PEditorControls" minHeight="20" layoutAlign="bottom" style="width: 20%; height: 55px">
+  <div class="buttonbox">
+    <button widgetId="savePInfoButton" dojoType="Button" onclick="saveInfo()">Save</button>
+    <button widgetId="revertPInfoButton" dojoType="Button" onclick="revertInfo()">Revert</button>
+  </div>
+</div>
+
+</div> <!-- End Tab Information -->
+
+<div id="infoTabLinks" dojoType="ContentPane" label="Information">
+  <table class="formAnswer" style="width: 100%;">
+    <tr>
+      <td class="emphasise">Name</td>
+      <td width="100%">
+        <input DISABLED type="text" id="linfo.name" class="long" required="true" onChange="updateInfoFields()"/>
+        <input type="hidden" id="linfo.path"/>
+      </td>
+    </tr>
+    <tr>
+      <td class="emphasise">Title</td>
+      <td width="100%">
+        <input type="text" id="linfo.title" class="long" required="true" onChange="updateInfoFields()"/>
+      </td>
+    </tr>
+    <tr>
+      <td class="emphasise">Short Title</td>
+      <td>
+        <input type="text" id="linfo.short-title"  class="medium" onChange="updateInfoFields()"/>
+      </td>
+    </tr>
+    <tr>
+      <td class="emphasise">URL</td>
+      <td>
+        <input type="text" id="linfo.url" class="long" required="true" onChange="updateInfoFields()"/>
+      </td>
+    </tr>
+    <tr>
+      <td class="emphasise">Target Window</td>
+      <td>
+        <select id="linfo.target" onChange="updateInfoFields()">
+            <option value="blank">New</option>
+            <option value="self">Self</option>
+            <option value="parent">Parent</option>
+            <option value="top">Top</option>
+       </select>
+      </td>
+    </tr>
+    <tr>
+      <td class="emphasise">Hidden</td>
+      <td>
+        <input type="checkbox" id="linfo.hidden" onChange="updateInfoFields()" /> 
+      </td>
+    </tr>
+  </table>
+
+<div dojoType="LayoutContainer" widgetId="LEditorControls" minHeight="20" layoutAlign="bottom" style="width: 20%; height: 55px">
+  <div class="buttonbox">
+    <button widgetId="saveLInfoButton" dojoType="Button" onclick="saveInfo()">Save</button>
+    <button widgetId="revertLInfoButton" dojoType="Button" onclick="revertInfo()">Revert</button>
+  </div>
+</div>
+
+</div> <!-- End Tab Information Link -->
+
+
+<div id="securityTab" dojoType="ContentPane" label="Security">
+<table dojoType="jetspeed:EditorTable" widgetId="securityTable" class="permissions" headClass="fixedHeader" tbodyClass="scrollContent" enableMultipleSelect="true" enableAlternateRows="true" rowAlternateClass="alternateRow" templateCssPath="/j2-admin/css/security-permissions.css" cellpadding="0" cellspacing="0" border="0">
+  <col width="70%"></col>
+  <col width="25%"></col>
+  <thead>
+  <tr>
+  <th field="name" dataType="String">Security Constraint</th>
+  <th field="kind" dataType="String">Constraint Type</th>
+  </tr>
+  </thead>
+  <tbody>
+  </tbody>
+</table>
+<table>
+  <tr>
+    <td>Security Constraint</td>
+      <td>
+        <select id="security.list" onChange="updateSecurityRow('security.list')">
+            <option selected value=""></option>           
+#foreach ($sec in $allSecurityRefs)        
+            <option value="$sec.Name">$sec.Name</option>
+#end            
+        </select>      
+      </td>
+      <td><button widgetId="security.owner" dojoType="Button" onclick="enterOwner()">Owner</button></td>
+  </tr>
+      <td></td>
+      <td></td>
+  </tr>
+</table>
+<div dojoType="LayoutContainer" widgetId="securityControls" minHeight="20" layoutAlign="bottom" style="width: 100%; height: 25px; margin-left:60px;">
+  <div class="buttonbox">
+    <button widgetId="securityNewButton" dojoType="Button" onclick="newEntry()">New</button>
+    <button widgetId="securityDeleteButton" dojoType="Button" onclick="deleteEntry()">Delete</button>
+    <button widgetId="securitySaveButton" dojoType="Button" onclick="saveEntry()">Save</button>
+    <button widgetId="securityRevertButton" dojoType="Button" onclick="revertEntry()">Revert</button>
+  </div>
+</div>
+</div> <!-- End Tab Security -->
+
+<div id="metaTab" dojoType="ContentPane" label="Metadata">
+
+<table dojoType="jetspeed:EditorTable" widgetId="metaTable" class="permissions" headClass="fixedHeader" tbodyClass="scrollContent" enableMultipleSelect="true" enableAlternateRows="true" rowAlternateClass="alternateRow" templateCssPath="/j2-admin/css/security-permissions.css" cellpadding="0" cellspacing="0" border="0">
+  <col width="35%"></col>
+  <col width="15%"></col>
+  <col width="45%"></col>
+  <thead>
+  <tr>
+  <th field="name" dataType="String">Name</th>
+  <th field="language" dataType="String">Language</th>
+  <th field="value" dataType="String">Value</th>        
+  </tr>
+  </thead>
+  <tbody>
+  </tbody>
+</table>
+<table>
+  <tr>
+    <td >Name</td>
+    <td >
+      <input type="text" id="meta.name" class="long" required="true" onChange="updateMetaRow('meta.name')"/>
+    </td>
+  </tr>
+  <tr>
+    <td >Language</td>
+    <td >
+      <input type="text" id="meta.language" class="medium" required="true" onChange="updateMetaRow('meta.language')"/>
+    </td>
+  </tr>
+  <tr>
+    <td >Value</td>
+    <td >
+      <input type="text" id="meta.value" class="long" required="true" onChange="updateMetaRow('meta.value')"/>
+    </td>
+  </tr>
+</table>
+<div dojoType="LayoutContainer" widgetId="metaControls" minHeight="20" layoutAlign="bottom" style="width: 100%; height: 25px; margin-left:60px;">
+  <div class="buttonbox">
+    <button widgetId="metaNewButton" dojoType="Button" onclick="newEntry()">New</button>
+    <button widgetId="metaDeleteButton" dojoType="Button" onclick="deleteEntry()">Delete</button>
+    <button widgetId="metaSaveButton" dojoType="Button" onclick="saveEntry()">Save</button>
+    <button widgetId="metaRevertButton" dojoType="Button" onclick="revertEntry()">Revert</button>
+  </div>
+</div>
+</div> <!-- End Tab Metadata -->
+
+<div id="menusTab" dojoType="ContentPane" label="Menus">
+<p>Coming soon...</p>
+</div> <!-- End Tab Menus -->
+
+<div id="orderTab" dojoType="ContentPane" label="Order">
+<p>Coming soon...</p>
+</div> <!-- End Tab Order -->
+
+</div> <!-- End Tab Container -->
+
+<div dojoType="LayoutContainer" widgetId="MajorActions" minHeight="20" layoutAlign="bottom" style="width: 20%; height: 55px">
+  <div class="buttonbox">
+    <button widgetId="buttonView" dojoType="Button" onclick="viewResource()">View</button>
+    <button widgetId="buttonRemove" dojoType="Button" onclick="removeResource()">Remove</button>
+    <div id='divFolderButtons'>
+    <button widgetId="buttonAddPage" dojoType="Button" onclick="newResource('Page')">Add Page</button>
+    <button widgetId="buttonAddFolder" dojoType="Button" onclick="newResource('Folder')">Add Folder</button>
+    <button widgetId="buttonAddLink" dojoType="Button" onclick="newResource('Link')">Add Link</button>
+    </div>
+  </div>
+</div>
+
+</div> <!-- End RHS -->
+</div> <!-- End Site View Layout -->
+
+<script type="text/javascript">
+// var starttime=new Date().getTime();
+
+var siteViewAllTabIds = [ "infoTabFolder", "infoTabPage", "infoTabLinks", "securityTab", "metaTab", "menusTab", "orderTab" ];
+var siteViewAllTabWidgets = {};
+function displayTabs( tabIdList )
+{
+    var tabContainer = dojo.widget.byId( "mainTabContainer" );
+    for ( var i = 0 ; i < siteViewAllTabIds.length; i++ )
+    {     
+        if ( siteViewAllTabWidgets[ siteViewAllTabIds[i] ] == null )
+            siteViewAllTabWidgets[ siteViewAllTabIds[i] ] = dojo.widget.byId( siteViewAllTabIds[i] );
+        
+        var removeTab = siteViewAllTabWidgets[ siteViewAllTabIds[i] ];
+        if ( removeTab && ! removeTab.js_removed )
+        {
+            removeTab.js_removed = true;
+            tabContainer.removeChild( removeTab );
+        }
+    }
+    if ( tabIdList != null && tabIdList.length > 0 )
+    {
+        for ( var i = 0 ; i < tabIdList.length; i++ )
+        {
+            var displayTab = siteViewAllTabWidgets[ tabIdList[i] ];
+            if ( displayTab )
+            {
+                delete displayTab.js_removed;
+                tabContainer.addChild( displayTab );
+            }
+        }
+        tabContainer.selectChild( siteViewAllTabWidgets[ tabIdList[0] ] );
+    }
+}
+//javascript: displayTabs( [ "infoTab", "menusTab" ] )
+//javascript: alert( jetspeed.printobj( siteViewAllTabWidgets ) )
+
+function retrieveElementValue(elementName, xml) 
+{
+    var path = xml.getElementsByTagName(elementName);
+    if (path != null)
+    {    
+        if (path.length > 0 && path[0].firstChild != null)
+        {
+            var value = path[0].firstChild.nodeValue;
+            return value;
+        }
+    }
+    return "";
+}
+function retrieveAttributeValue(elementName, attributeName, xml) 
+{
+    var path = xml.getElementsByTagName(elementName);
+    if (path != null && path.length > 0)
+    { 
+        var namedItem = path[0].attributes.getNamedItem(attributeName);
+        if (namedItem != null)
+        {            
+            return namedItem.value;
+        }
+    }
+    return "";
+}
+function attributeToCheckbox(prefix, elementName, attributeName, xml)
+{
+    var widget = dojo.byId(prefix + "." + attributeName);
+    if (widget != null)
+    {
+        var isChecked = retrieveAttributeValue(elementName, attributeName, xml);
+        widget.checked = (isChecked == "true");
+    }    
+    return (isChecked == "true");
+}
+function elementToInput(prefix, elementName, xml) 
+{    
+    var widget = document.getElementById(prefix + "." + elementName);    
+    if (widget != null)
+    {
+        widget.value = retrieveElementValue(elementName, xml);
+    }
+}
+function titlesToInput(prefix, titleName, shortName, xml)
+{
+    var title = retrieveElementValue(titleName, xml);
+    var shortTitle = retrieveElementValue(shortName, xml);
+    if (title == shortTitle)
+        shortTitle = "";
+    var titleWidget = document.getElementById(prefix + "." + titleName);    
+    var shortWidget = document.getElementById(prefix + "." + shortName);    
+    titleWidget.value = title;
+    shortWidget.value = shortTitle;
+}
+function elementToSelect(prefix, elementName, xml) 
+{    
+    var el = document.getElementById(prefix + "." + elementName);
+    if (el != null)
+    {
+        var value = retrieveElementValue(elementName, xml);
+        for (var ix=0; ix<el.options.length; ix++)
+        {
+           if (el.options[ix].value == value)
+           {
+              el.options[ix].selected = true;
+              break;
+           }
+        }
+    }
+}
+function attributeToSelect(prefix, elementName, attributeName, xml) 
+{    
+    var el = document.getElementById(prefix + "." + attributeName);    
+    if (el != null)
+    {
+        var value = retrieveAttributeValue(elementName, attributeName, xml);
+        for (var ix=0; ix<el.options.length; ix++)
+        {
+           if (el.options[ix].value == value)
+           {
+             el.options[ix].selected = true;
+             break;
+           }
+        }
+    }
+}
+function ajaxInvoke(action, names, values, handler)
+{
+    var contextPath = document.location.protocol + "/" + "/" + document.location.host + "$req.ContextPath";
+    var requestUrl = contextPath + "/ajaxapi?action=" + action;
+    if (names != null)
+    {
+        for (var ix=0;  ix<names.length; ix++)
+        {
+            requestUrl = requestUrl + "&" + names[ix] + "=" + values[ix];
+        }    
+    }
+    var mimeType = "text/xml";
+    dojo.io.bind({
+      url: requestUrl,
+      mimetype: mimeType,
+      load: function( type, data, evt )
+      {
+        var success = false;
+        var statusElmt = data.getElementsByTagName( "status" );
+        if ( statusElmt != null )
+        {
+            var successVal = statusElmt[0].firstChild.nodeValue;
+            if ( successVal == "success" )
+            {            
+                handler.populate(data);
+                success = true;                
+            }                   
+        }
+        if ( ! success )
+        {
+            var textContent = dojo.dom.innerXML( data );
+            if ( ! textContent )
+                textContent = ( data != null ? "!= null (IE no XMLSerializer)" : "null" );
+            // dojo.raise( "saveEntrySubmit failure url=" + requestUrl + "  xml-content=" + textContent );
+            if (data instanceof XMLDocument)
+            {
+                var reason = retrieveElementValue("reason", data);
+                alert("Portal Communication Failure: " + reason);               
+                handler.failure(reason);
+            }
+            else
+                alert("Unknown Portal Communication Failure");                               
+        }
+    },    
+    error: function( type, error )
+    {
+        var msg = "Portal Communication Error: " + requestUrl + " type: " + type + jetspeed.url.formatBindError( error );
+        // dojo.raise(msg);
+        alert(msg);
+        handler.failure(msg);
+    }
+    });     
+}
+dojo.addOnLoad(function() 
+{   
+   var metaTable = dojo.widget.byId("metaTable");
+   dojo.event.connect( "around", metaTable, "onUISelect", "okToChangeSelectionOrExit" );
+   dojo.event.connect(metaTable, "onSelect", function(e) {
+        processTableRowEvent(e, "metaTable");
+   });
+   dojo.event.connect(metaTable, "updateEditor", updateEditor );
+   dojo.event.connect(metaTable, "saveEntrySubmit", saveMetaEntrySubmit );
+   dojo.event.connect(metaTable, "clearAndDisableEditor", clearAndDisableEditor );
+
+   var securityTable = dojo.widget.byId("securityTable");
+   dojo.event.connect( "around", securityTable, "onUISelect", "okToChangeSelectionOrExit" );
+   dojo.event.connect(securityTable, "onSelect", function(e) {
+        processTableRowEvent(e, "securityTable");
+   });
+   dojo.event.connect(securityTable, "updateEditor", updateEditor );
+   dojo.event.connect(securityTable, "saveEntrySubmit", saveSecurityEntrySubmit );
+   dojo.event.connect(securityTable, "clearAndDisableEditor", clearAndDisableEditor );
+}); 
+// General Table Functions
+function processTableRowEvent(e, tableName)
+{
+    var tableWidget = dojo.widget.byId( tableName );
+    tableWidget.processTableRowEvent(e);
+    if (tableName == "metaTable")
+    {
+        dojo.byId("meta.name").disabled = false;
+        dojo.byId("meta.language").disabled = false;
+        dojo.byId("meta.value").disabled = false;
+        changeButtonState("meta", false, false, true, true);
+    }
+    else if (tableName == "securityTable")
+    {
+        var row = tableWidget.getSelectedRow() ;
+        if (row.kind == "Owner")
+        {                
+            dojo.byId("security.list").disabled = true;
+            dojo.widget.byId("security.owner").disabled = false;
+        }
+        else if (row.kind == "Security Reference")
+        {
+            dojo.byId("security.list").disabled = false;
+            dojo.widget.byId("security.owner").disabled = true;
+        }
+        else
+        {
+            dojo.byId("security.list").disabled = true;
+            dojo.widget.byId("security.owner").disabled = true;
+        }
+        changeButtonState("security", false, false, true, true);
+    }
+}
+function clearAndDisableEditor()
+{
+    var currentTabName = dojo.widget.byId( "mainTabContainer" ).selectedChildWidget.widgetId;
+    if (currentTabName == "metaTab")
+    {
+        resetMeta();
+    }
+    else if (currentTabName == "securityTab")
+    {
+        resetSecurity();
+    }
+}
+// Info Functions
+function updateInfoFields()
+{
+    window.information.modified = true; 
+    var currentTabName = dojo.widget.byId( "mainTabContainer" ).selectedChildWidget.widgetId;
+    if (currentTabName == "infoTabFolder")
+    {
+        dojo.widget.byId( "saveFInfoButton" ).setDisabled(false);
+        dojo.widget.byId( "revertFInfoButton" ).setDisabled(false);
+    }
+    else if (currentTabName == "infoTabPage")
+    {
+        dojo.widget.byId( "savePInfoButton" ).setDisabled(false);
+        dojo.widget.byId( "revertPInfoButton" ).setDisabled(false);
+    }
+    else
+    {
+        dojo.widget.byId( "saveLInfoButton" ).setDisabled(false);
+        dojo.widget.byId( "revertLInfoButton" ).setDisabled(false);
+    }
+}
+function newEntry()
+{
+    var tTableWidget = getTableWidget();
+    tTableWidget.newEntry();
+    if (tTableWidget.js_type == "metadata")
+    {
+        dojo.byId("meta.name").value = "";
+        dojo.byId("meta.language").value = "";
+        dojo.byId("meta.value").value = "";
+        dojo.byId("meta.name").disabled = false;
+        dojo.byId("meta.language").disabled = false;
+        dojo.byId("meta.value").disabled = false;
+        changeButtonState("meta", true, true, true, false);
+    }
+    else if (tTableWidget.js_type == "security")
+    {
+        dojo.byId("security.list").options[0].selected = true;
+        dojo.byId("security.list").disabled = false;
+        dojo.widget.byId("security.owner").setDisabled(false);
+        changeButtonState("security", true, true, true, false);
+    }
+}
+function deleteEntry()
+{
+    var tTableWidget = getTableWidget();
+    tTableWidget.deleteEntry();
+    if (tTableWidget.js_type == "metadata")
+    {
+        resetMeta();
+    }   
+    else if (tTableWidget.js_type == "security")
+    {
+        resetSecurity();
+    }    
+}
+function saveEntry()
+{
+    var tTableWidget = getTableWidget();
+    tTableWidget.saveEntry();
+}
+function revertEntry()
+{
+    var tTableWidget = getTableWidget();
+    tTableWidget.revertEntry();
+    if (tTableWidget.js_type == "metadata")
+    {
+        resetMeta();
+    } 
+    else if (tTableWidget.js_type == "security")
+    {
+        resetSecurity();
+    }   
+}
+function okToChangeSelectionOrExit(invocation)
+{
+    var tTableWidget = getTableWidget();
+    return tTableWidget.okToChangeSelectionOrExit(invocation);
+}
+// Meta Functions
+function resetMeta()
+{
+    var metaName = dojo.byId("meta.name");
+    metaName.value = "";
+    metaName.disabled = true;
+    var metaLanguage = dojo.byId("meta.language");
+    metaLanguage.value = "";
+    metaLanguage.disabled = true;
+    var metaValue = dojo.byId("meta.value");
+    metaValue.value = "";
+    metaValue.disabled = true;    
+    changeButtonState("meta", false, true, true, true);
+}
+function populateMetadata(xmlName, xml, kind)
+{
+   dojo.byId("site.kind").value = kind;
+   elementToInput("site", "path", xml);
+   var metaTable = dojo.widget.byId("metaTable");
+   metaTable.getNewEntryPrototype = getNewMetaPrototype;
+   var data = [] ;
+   var path = xml.getElementsByTagName(xmlName);
+   if (path != null && path.length > 0)
+   {    
+       for (ix=0; ix < path.length; ix++)
+       {
+          var name = path[ix].attributes.getNamedItem("name").value;
+          var lang = path[ix].attributes.getNamedItem("xml:lang").value;
+          var value = path[ix].firstChild.nodeValue;
+          data.push( { name: name, language: lang, value: value, Id: ix + 1} );
+       }
+   }
+   metaTable.js_masterdata = data;
+   metaTable.js_type = "metadata";
+   // metaTable.saveWarningDialogWidgetId = "SaveWarningDialog";
+   metaTable.parseData( metaTable.js_masterdata );
+   metaTable.render( true );
+   resetMeta();
+}
+function updateMetaRow(field)
+{
+    var tTableWidget = getTableWidget();
+    var selectedRowData = tTableWidget.getSelectedRow() ;
+    if ( selectedRowData != null )
+    {
+        if (field == "meta.name")
+          selectedRowData.name = dojo.byId(field).value;
+        else if (field == "meta.language")
+          selectedRowData.language = dojo.byId(field).value;
+        else
+          selectedRowData.value = dojo.byId(field).value;
+        tTableWidget.setModified(selectedRowData);
+        tTableWidget.updateClonedData( selectedRowData, tTableWidget.selected[0] );
+        tTableWidget.render(true);
+        tTableWidget.showSelections();
+        changeButtonState("meta", true, true, false, false);
+    }
+}
+// Security Functions
+function resetSecurity()
+{
+    var securityList = dojo.byId("security.list");
+    securityList.value = "";
+    securityList.disabled = true;
+    dojo.widget.byId("security.owner").setDisabled(true);
+    changeButtonState("security", false, true, true, true);
+}
+function populateSecurity(xmlName, xml, kind)
+{
+   dojo.byId("site.kind").value = kind;
+   elementToInput("site", "path", xml);
+   var securityTable = dojo.widget.byId("securityTable");
+   securityTable.getNewEntryPrototype = getNewSecurityPrototype;
+   var data = [] ;
+   var count = 0;
+   var path = xml.getElementsByTagName("security-ref");
+   if (path != null && path.length > 0)
+   {    
+       for (ix=0; ix < path.length; ix++)
+       {
+          var refName = path[ix].firstChild.nodeValue;
+          count = ix + 1;
+          data.push( { name: refName, kind: "Security Reference", Id: count } );
+       }
+   }
+   path = xml.getElementsByTagName("security-owner");
+   if (path != null && path.length > 0)
+   {    
+       var owner = path[0].firstChild.nodeValue;
+       count = count + 1;
+       data.push( { name: owner, kind: "Owner", Id: count } );
+   }
+   dojo.widget.byId("security.owner").setDisabled(true);       
+   path = xml.getElementsByTagName("security-def");
+   if (path != null && path.length > 0)
+   {    
+       for (ix = 0; ix < path.length; ix++)
+       {
+          count = count + 1;
+          var secid = path[ix].attributes.getNamedItem("id").value;
+          data.push( { name: "Definition editing not yet supported.", kind: "Security Definition", Id: "r" + secid } );
+       }
+   }
+   securityTable.js_masterdata = data;
+   securityTable.js_type = "security";
+   securityTable.parseData( securityTable.js_masterdata );
+   securityTable.render( true );
+   resetSecurity();
+   //dojo.debug("dump sec: "+ securityTable.debugTableData());
+}
+
+function updateSecurityRow(field)
+{
+    var tTableWidget = getTableWidget();
+    var selectedRowData = tTableWidget.getSelectedRow() ;
+    if ( selectedRowData != null )
+    {
+        if (field == "security.list")
+        {
+          selectedRowData.name = dojo.byId(field).value;
+          selectedRowData.kind = "Security Reference";
+        }
+        else if (field == "owner.name")
+        {
+          selectedRowData.name = dojo.byId(field).value;
+          selectedRowData.kind = "Owner";
+        }
+        tTableWidget.setModified(selectedRowData);
+        tTableWidget.updateClonedData( selectedRowData, tTableWidget.selected[0] );
+        tTableWidget.render(true);
+        tTableWidget.showSelections();
+        changeButtonState("security", true, true, false, false);
+    }
+}
+function createOwner()
+{
+    updateSecurityRow("owner.name");
+}
+function changeButtonState(prefix, newState, deleteState, saveState, revertState)
+{
+    dojo.widget.byId(prefix + "NewButton").setDisabled(newState);
+    dojo.widget.byId(prefix + "DeleteButton").setDisabled(deleteState);
+    dojo.widget.byId(prefix + "SaveButton").setDisabled(saveState);
+    dojo.widget.byId(prefix + "RevertButton").setDisabled(revertState);
+}
+function getTableWidget( containedInTab )
+{
+    if ( ! containedInTab )
+        containedInTab = dojo.widget.byId( "mainTabContainer" ).selectedChildWidget;
+    if ( ! containedInTab )
+        alert( "no selected mainTabContainer child widget" );
+    var tableWidgetId = containedInTab.widgetId + "le";
+    var tableWidget = dojo.widget.byId( tableWidgetId );
+    if ( ! tableWidget )
+        alert( "no table widget " + tableWidgetId + " could be found" );
+    return tableWidget;
+}
+function updateEditor( rowData, tTableWidget )
+{
+    if ( ! tTableWidget )
+        tTableWidget = getTableWidget();
+    if (tTableWidget.js_type == "metadata")
+    {
+        dojo.byId("meta.name").value = rowData.name;
+        dojo.byId("meta.language").value = rowData.language;
+        dojo.byId("meta.value").value = rowData.value;
+    }
+    else if (tTableWidget.js_type == "security")
+    {
+        if (rowData.kind == "Security Reference")
+        {
+            dojo.widget.byId("security.owner").setDisabled(true);       
+            var el = dojo.byId("security.list");
+            for (var ix=0; ix < el.options.length; ix++)
+            {
+               if (el.options[ix].value == rowData.name)
+               {
+                  el.options[ix].selected = true;
+                  break;
+               }
+            }
+        }
+    }
+}
+function checkForChanges()
+{
+    var tTableWidget = getTableWidget();
+    return tTableWidget.checkForChanges();
+}
+function saveMetaEntrySubmit(selectedRowData, removeEntry)
+{
+    var tTableWidget = getTableWidget();
+    if (tTableWidget.js_type == "metadata")
+    {
+        changeButtonState("meta", false, false, true, true);
+        var table = getTableWidget();
+        var rowData = table.getSelectedRow();
+        var names = new Array();
+        var values = new Array();
+        names[0] = "method"; 
+        if (removeEntry)
+           values[0] = "remove-meta";
+        else
+            values[0] = (rowData.__isNew)? "add-meta" : "update-meta";
+        names[1] = "path"; 
+        values[1] = escape(dojo.byId("site.path").value);
+        names[2] = "name";
+        values[2] = escape(rowData.name);
+        names[3] = "lang";
+        values[3] = escape(rowData.language);
+        names[4] = "value";
+        values[4] = escape(rowData.value);
+        if (rowData.__isNew == null)
+        {
+            var tId = rowData.Id;
+            var masterData = table.getData( table.js_masterdata, tId );
+            names[5] = "oldname";
+            values[5] = escape(masterData.name);
+            names[6] = "oldlang";
+            values[6] = escape(masterData.language);
+        }
+        var kind = dojo.byId("site.kind").value;
+        var action = "update" + kind;
+        ajaxInvoke(action, names, values, new EmptyHandler() );     
+    }            
+}
+function saveSecurityEntrySubmit(selectedRowData, removeEntry)
+{
+    var tTableWidget = getTableWidget();
+    if (tTableWidget.js_type == "security")
+    {
+        changeButtonState("security", false, false, true, true);
+        var table = getTableWidget();
+        var rowData =  selectedRowData; // table.getSelectedRow(); 
+        var names = new Array();
+        var values = new Array();
+        if (rowData.kind == "Security Definition")
+        {
+            // only support delete thus far
+            names[0] = "method";
+            values[0] = "remove-secdef";
+            names[1] = "path"; 
+            values[1] = escape(dojo.byId("site.path").value);
+            names[2] = "id";
+            values[2] = escape(rowData.Id);
+        }
+        else
+        {
+            names[0] = "method"; 
+            if (removeEntry)
+               values[0] = "remove-secref";
+            else
+                values[0] = (rowData.__isNew)? "add-secref" : "update-secref";
+            names[1] = "path"; 
+            values[1] = escape(dojo.byId("site.path").value);
+            names[2] = "name";
+            values[2] = escape(rowData.name);
+            if (rowData.__isNew == null)
+            {
+                var tId = rowData.Id;
+                var masterData = table.getData( table.js_masterdata, tId );
+                names[3] = "oldname";
+                values[3] = escape(masterData.name);
+            }
+            names[4] = "kind";
+            values[4] = rowData.kind;
+        }
+        var kind = dojo.byId("site.kind").value;
+        var action = "update" + kind;
+        ajaxInvoke(action, names, values, new EmptyHandler() );     
+    }            
+}
+function saveInfo()
+{
+    var currentTabName = dojo.widget.byId( "mainTabContainer" ).selectedChildWidget.widgetId;
+    var names = new Array();
+    var values = new Array();
+    names[0] = "method"; 
+    values[0] = "info";    
+    if (currentTabName == "infoTabFolder")
+    {
+        names[1] = "path"; 
+        values[1] = escape(dojo.byId("finfo.path").value);
+        names[2] = "name";
+        values[2] = escape(dojo.byId("finfo.name").value);
+        names[3] = "title";
+        values[3] = escape(dojo.byId("finfo.title").value);
+        names[4] = "short-title";
+        values[4] = escape(dojo.byId("finfo.short-title").value);
+        names[5] = "layout-decorator";
+        values[5] = escape(dojo.byId("finfo.layout-decorator").value);
+        names[6] = "portlet-decorator";
+        values[6] = escape(dojo.byId("finfo.portlet-decorator").value);
+        names[7] = "default-page";
+        values[7] = escape(dojo.byId("finfo.default-page").value);
+        if (dojo.byId("finfo.hidden").checked)
+        {
+            names[8] = "hidden";
+            values[8] = "true";
+        }
+        ajaxInvoke("updatefolder", names, values, new UpdateInfoHandler() );     
+    }
+    else if (currentTabName == "infoTabPage")
+    {        
+        names[1] = "path"; 
+        values[1] = escape(dojo.byId("pinfo.path").value);
+        names[2] = "name";
+        values[2] = escape(dojo.byId("pinfo.name").value);
+        names[3] = "title";
+        values[3] = escape(dojo.byId("pinfo.title").value);
+        names[4] = "short-title";
+        values[4] = escape(dojo.byId("pinfo.short-title").value);
+        names[5] = "layout-decorator";
+        values[5] = escape(dojo.byId("pinfo.layout-decorator").value);
+        names[6] = "portlet-decorator";
+        values[6] = escape(dojo.byId("pinfo.portlet-decorator").value);
+        names[7] = "theme";
+        values[7] = escape(dojo.byId("pinfo.theme").value);
+        if (dojo.byId("pinfo.hidden").checked)
+        {
+            names[8] = "hidden";
+            values[8] = "true";
+        }
+        ajaxInvoke("updatepage", names, values, new UpdateInfoHandler() );     
+    }
+    else if (currentTabName == "infoTabLinks")
+    {
+        names[1] = "path"; 
+        values[1] = escape(dojo.byId("linfo.path").value);
+        names[2] = "name";
+        values[2] = escape(dojo.byId("linfo.name").value);
+        names[3] = "title";
+        values[3] = escape(dojo.byId("linfo.title").value);
+        names[4] = "short-title";
+        values[4] = escape(dojo.byId("linfo.short-title").value);
+        names[5] = "url";
+        values[5] = escape(dojo.byId("linfo.url").value);
+        names[6] = "target";
+        values[6] = escape(dojo.byId("linfo.target").value);
+        if (dojo.byId("linfo.hidden").checked)
+        {
+            names[7] = "hidden";
+            values[7] = "true";
+        }
+        ajaxInvoke("updatelink", names, values, new UpdateInfoHandler() );     
+    }    
+}
+
+function revertInfo()
+{
+   editResource(dojo.widget.manager.getWidgetById('treeSelector').selectedNode);
+}
+var EmptyHandler = function()
+{
+  this.populate = function(data) 
+  { 
+  }
+  this.failure = function(data)
+  {
+  }
+}
+var UpdateInfoHandler = function()
+{
+  this.populate = function(data) 
+  {
+     window.information.modified = false;
+     var node = dojo.widget.manager.getWidgetById('treeSelector').selectedNode;
+     if ( node.object == "Folder" )
+     {   
+        dojo.widget.byId( "saveFInfoButton" ).setDisabled(true);
+        dojo.widget.byId( "revertFInfoButton" ).setDisabled(true);
+     }
+     else if ( node.object == "Page" )
+     {   
+        dojo.widget.byId( "savePInfoButton" ).setDisabled(true);
+        dojo.widget.byId( "revertPInfoButton" ).setDisabled(true);
+     }
+     else if ( node.object == "Link" )
+     {   
+        dojo.widget.byId( "saveLInfoButton" ).setDisabled(true);
+        dojo.widget.byId( "revertLInfoButton" ).setDisabled(true);
+     }
+  }     
+  this.failure = function(data)
+  {
+     window.information.modified = false;
+  }
+}
+function determineSave(invocation)
+{
+    var tab = dojo.widget.byId( "mainTabContainer").selectedChildWidget;
+    if (tab == null)
+    {
+       if (invocation) 
+           invocation.proceed();
+       return;
+    }
+    var currentTabName = dojo.widget.byId("mainTabContainer").selectedChildWidget.widgetId;
+    if (currentTabName.substr(0,4) == "info")
+    {
+        if (window.information && window.information.modified)
+        {
+            saveInfo();
+        }
+    }
+    else if (currentTabName.substr(0,4) == "meta" || currentTabName.substr(0,4) == "secu")
+    {
+       if (checkForChanges())
+       {
+           saveEntry();
+       }
+    }
+    if (invocation) 
+        invocation.proceed();
+}
+function enterOwner()
+{
+    var tableWidget = getTableWidget();
+    var row = tableWidget.getSelectedRow() ;
+    var path = "";
+    if (row.__isNew == null)
+    {
+        path = row.name;        
+    }
+    else
+    {
+        path = dojo.byId("site.path").value;
+        if (path.substr(0,7) == "/_user/")
+        {
+            path = path.substr(7);
+            var end = path.indexOf("/");
+            if (end != -1)
+            {
+               path = path.substr(0,end);
+            }
+        }
+        else
+        { 
+            path = "";
+        }
+    }
+    document.getElementById("owner.name").value = path;
+    dojo.widget.byId("owner.save").setDisabled(path == "");
+    dojo.widget.byId( "NewOwnerDialog" ).show();
+}
+function validateOwnerName()
+{
+    var name = dojo.byId("owner.name").value;   
+    var disabled = false;    
+    if (name == null || dojo.string.trim(name) == "")
+        disabled = true;
+    dojo.widget.byId("owner.save").setDisabled(disabled);
+}
+function addListeners()
+{
+  var tabContainer = dojo.widget.byId("mainTabContainer");
+  dojo.event.connect("around", tabContainer, "selectChild", function(invocation) 
+  {
+    determineSave(invocation);
+  });
+  var siteTree = dojo.widget.byId("siteTree");
+  dojo.event.connect("around", siteTree, "nodeSelected", function(invocation) 
+  {
+    determineSave(invocation);
+  });
+}
+dojo.addOnLoad( window.addListeners );
+</script>

Added: portals/jetspeed-2/trunk/applications/j2-admin/src/webapp/images/application_edit.png
URL: http://svn.apache.org/viewvc/portals/jetspeed-2/trunk/applications/j2-admin/src/webapp/images/application_edit.png?view=auto&rev=482815
==============================================================================
Binary file - no diff available.

Propchange: portals/jetspeed-2/trunk/applications/j2-admin/src/webapp/images/application_edit.png
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: portals/jetspeed-2/trunk/applications/j2-admin/src/webapp/images/base.gif
URL: http://svn.apache.org/viewvc/portals/jetspeed-2/trunk/applications/j2-admin/src/webapp/images/base.gif?view=auto&rev=482815
==============================================================================
Binary file - no diff available.

Propchange: portals/jetspeed-2/trunk/applications/j2-admin/src/webapp/images/base.gif
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: portals/jetspeed-2/trunk/applications/j2-admin/src/webapp/images/create.gif
URL: http://svn.apache.org/viewvc/portals/jetspeed-2/trunk/applications/j2-admin/src/webapp/images/create.gif?view=auto&rev=482815
==============================================================================
Binary file - no diff available.

Propchange: portals/jetspeed-2/trunk/applications/j2-admin/src/webapp/images/create.gif
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: portals/jetspeed-2/trunk/applications/j2-admin/src/webapp/images/createsmall.gif
URL: http://svn.apache.org/viewvc/portals/jetspeed-2/trunk/applications/j2-admin/src/webapp/images/createsmall.gif?view=auto&rev=482815
==============================================================================
Binary file - no diff available.

Propchange: portals/jetspeed-2/trunk/applications/j2-admin/src/webapp/images/createsmall.gif
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: portals/jetspeed-2/trunk/applications/j2-admin/src/webapp/images/cut.png
URL: http://svn.apache.org/viewvc/portals/jetspeed-2/trunk/applications/j2-admin/src/webapp/images/cut.png?view=auto&rev=482815
==============================================================================
Binary file - no diff available.

Propchange: portals/jetspeed-2/trunk/applications/j2-admin/src/webapp/images/cut.png
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: portals/jetspeed-2/trunk/applications/j2-admin/src/webapp/images/cut_red.png
URL: http://svn.apache.org/viewvc/portals/jetspeed-2/trunk/applications/j2-admin/src/webapp/images/cut_red.png?view=auto&rev=482815
==============================================================================
Binary file - no diff available.

Propchange: portals/jetspeed-2/trunk/applications/j2-admin/src/webapp/images/cut_red.png
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: portals/jetspeed-2/trunk/applications/j2-admin/src/webapp/images/delete.png
URL: http://svn.apache.org/viewvc/portals/jetspeed-2/trunk/applications/j2-admin/src/webapp/images/delete.png?view=auto&rev=482815
==============================================================================
Binary file - no diff available.

Propchange: portals/jetspeed-2/trunk/applications/j2-admin/src/webapp/images/delete.png
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: portals/jetspeed-2/trunk/applications/j2-admin/src/webapp/images/down.gif
URL: http://svn.apache.org/viewvc/portals/jetspeed-2/trunk/applications/j2-admin/src/webapp/images/down.gif?view=auto&rev=482815
==============================================================================
Binary file - no diff available.

Propchange: portals/jetspeed-2/trunk/applications/j2-admin/src/webapp/images/down.gif
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: portals/jetspeed-2/trunk/applications/j2-admin/src/webapp/images/downsmall.png
URL: http://svn.apache.org/viewvc/portals/jetspeed-2/trunk/applications/j2-admin/src/webapp/images/downsmall.png?view=auto&rev=482815
==============================================================================
Binary file - no diff available.

Propchange: portals/jetspeed-2/trunk/applications/j2-admin/src/webapp/images/downsmall.png
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: portals/jetspeed-2/trunk/applications/j2-admin/src/webapp/images/edit.png
URL: http://svn.apache.org/viewvc/portals/jetspeed-2/trunk/applications/j2-admin/src/webapp/images/edit.png?view=auto&rev=482815
==============================================================================
Binary file - no diff available.

Propchange: portals/jetspeed-2/trunk/applications/j2-admin/src/webapp/images/edit.png
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: portals/jetspeed-2/trunk/applications/j2-admin/src/webapp/images/folder.gif
URL: http://svn.apache.org/viewvc/portals/jetspeed-2/trunk/applications/j2-admin/src/webapp/images/folder.gif?view=auto&rev=482815
==============================================================================
Binary file - no diff available.

Propchange: portals/jetspeed-2/trunk/applications/j2-admin/src/webapp/images/folder.gif
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: portals/jetspeed-2/trunk/applications/j2-admin/src/webapp/images/folder_new.gif
URL: http://svn.apache.org/viewvc/portals/jetspeed-2/trunk/applications/j2-admin/src/webapp/images/folder_new.gif?view=auto&rev=482815
==============================================================================
Binary file - no diff available.

Propchange: portals/jetspeed-2/trunk/applications/j2-admin/src/webapp/images/folder_new.gif
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: portals/jetspeed-2/trunk/applications/j2-admin/src/webapp/images/icon_link.gif
URL: http://svn.apache.org/viewvc/portals/jetspeed-2/trunk/applications/j2-admin/src/webapp/images/icon_link.gif?view=auto&rev=482815
==============================================================================
Binary file - no diff available.

Propchange: portals/jetspeed-2/trunk/applications/j2-admin/src/webapp/images/icon_link.gif
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: portals/jetspeed-2/trunk/applications/j2-admin/src/webapp/images/lightning_go.png
URL: http://svn.apache.org/viewvc/portals/jetspeed-2/trunk/applications/j2-admin/src/webapp/images/lightning_go.png?view=auto&rev=482815
==============================================================================
Binary file - no diff available.

Propchange: portals/jetspeed-2/trunk/applications/j2-admin/src/webapp/images/lightning_go.png
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: portals/jetspeed-2/trunk/applications/j2-admin/src/webapp/images/link.gif
URL: http://svn.apache.org/viewvc/portals/jetspeed-2/trunk/applications/j2-admin/src/webapp/images/link.gif?view=auto&rev=482815
==============================================================================
Binary file - no diff available.

Propchange: portals/jetspeed-2/trunk/applications/j2-admin/src/webapp/images/link.gif
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: portals/jetspeed-2/trunk/applications/j2-admin/src/webapp/images/link_add.png
URL: http://svn.apache.org/viewvc/portals/jetspeed-2/trunk/applications/j2-admin/src/webapp/images/link_add.png?view=auto&rev=482815
==============================================================================
Binary file - no diff available.

Propchange: portals/jetspeed-2/trunk/applications/j2-admin/src/webapp/images/link_add.png
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: portals/jetspeed-2/trunk/applications/j2-admin/src/webapp/images/link_break.png
URL: http://svn.apache.org/viewvc/portals/jetspeed-2/trunk/applications/j2-admin/src/webapp/images/link_break.png?view=auto&rev=482815
==============================================================================
Binary file - no diff available.

Propchange: portals/jetspeed-2/trunk/applications/j2-admin/src/webapp/images/link_break.png
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: portals/jetspeed-2/trunk/applications/j2-admin/src/webapp/images/loading.jpg
URL: http://svn.apache.org/viewvc/portals/jetspeed-2/trunk/applications/j2-admin/src/webapp/images/loading.jpg?view=auto&rev=482815
==============================================================================
Binary file - no diff available.

Propchange: portals/jetspeed-2/trunk/applications/j2-admin/src/webapp/images/loading.jpg
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: portals/jetspeed-2/trunk/applications/j2-admin/src/webapp/images/lock.png
URL: http://svn.apache.org/viewvc/portals/jetspeed-2/trunk/applications/j2-admin/src/webapp/images/lock.png?view=auto&rev=482815
==============================================================================
Binary file - no diff available.

Propchange: portals/jetspeed-2/trunk/applications/j2-admin/src/webapp/images/lock.png
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: portals/jetspeed-2/trunk/applications/j2-admin/src/webapp/images/mouse_add.png
URL: http://svn.apache.org/viewvc/portals/jetspeed-2/trunk/applications/j2-admin/src/webapp/images/mouse_add.png?view=auto&rev=482815
==============================================================================
Binary file - no diff available.

Propchange: portals/jetspeed-2/trunk/applications/j2-admin/src/webapp/images/mouse_add.png
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: portals/jetspeed-2/trunk/applications/j2-admin/src/webapp/images/mouse_delete.png
URL: http://svn.apache.org/viewvc/portals/jetspeed-2/trunk/applications/j2-admin/src/webapp/images/mouse_delete.png?view=auto&rev=482815
==============================================================================
Binary file - no diff available.

Propchange: portals/jetspeed-2/trunk/applications/j2-admin/src/webapp/images/mouse_delete.png
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: portals/jetspeed-2/trunk/applications/j2-admin/src/webapp/images/move.gif
URL: http://svn.apache.org/viewvc/portals/jetspeed-2/trunk/applications/j2-admin/src/webapp/images/move.gif?view=auto&rev=482815
==============================================================================
Binary file - no diff available.

Propchange: portals/jetspeed-2/trunk/applications/j2-admin/src/webapp/images/move.gif
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: portals/jetspeed-2/trunk/applications/j2-admin/src/webapp/images/new.png
URL: http://svn.apache.org/viewvc/portals/jetspeed-2/trunk/applications/j2-admin/src/webapp/images/new.png?view=auto&rev=482815
==============================================================================
Binary file - no diff available.

Propchange: portals/jetspeed-2/trunk/applications/j2-admin/src/webapp/images/new.png
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: portals/jetspeed-2/trunk/applications/j2-admin/src/webapp/images/note.gif
URL: http://svn.apache.org/viewvc/portals/jetspeed-2/trunk/applications/j2-admin/src/webapp/images/note.gif?view=auto&rev=482815
==============================================================================
Binary file - no diff available.

Propchange: portals/jetspeed-2/trunk/applications/j2-admin/src/webapp/images/note.gif
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: portals/jetspeed-2/trunk/applications/j2-admin/src/webapp/images/page.gif
URL: http://svn.apache.org/viewvc/portals/jetspeed-2/trunk/applications/j2-admin/src/webapp/images/page.gif?view=auto&rev=482815
==============================================================================
Binary file - no diff available.

Propchange: portals/jetspeed-2/trunk/applications/j2-admin/src/webapp/images/page.gif
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: portals/jetspeed-2/trunk/applications/j2-admin/src/webapp/images/page_edit.png
URL: http://svn.apache.org/viewvc/portals/jetspeed-2/trunk/applications/j2-admin/src/webapp/images/page_edit.png?view=auto&rev=482815
==============================================================================
Binary file - no diff available.

Propchange: portals/jetspeed-2/trunk/applications/j2-admin/src/webapp/images/page_edit.png
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: portals/jetspeed-2/trunk/applications/j2-admin/src/webapp/images/page_new.gif
URL: http://svn.apache.org/viewvc/portals/jetspeed-2/trunk/applications/j2-admin/src/webapp/images/page_new.gif?view=auto&rev=482815
==============================================================================
Binary file - no diff available.

Propchange: portals/jetspeed-2/trunk/applications/j2-admin/src/webapp/images/page_new.gif
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: portals/jetspeed-2/trunk/applications/j2-admin/src/webapp/images/page_white_go.png
URL: http://svn.apache.org/viewvc/portals/jetspeed-2/trunk/applications/j2-admin/src/webapp/images/page_white_go.png?view=auto&rev=482815
==============================================================================
Binary file - no diff available.

Propchange: portals/jetspeed-2/trunk/applications/j2-admin/src/webapp/images/page_white_go.png
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: portals/jetspeed-2/trunk/applications/j2-admin/src/webapp/images/plus.gif
URL: http://svn.apache.org/viewvc/portals/jetspeed-2/trunk/applications/j2-admin/src/webapp/images/plus.gif?view=auto&rev=482815
==============================================================================
Binary file - no diff available.

Propchange: portals/jetspeed-2/trunk/applications/j2-admin/src/webapp/images/plus.gif
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: portals/jetspeed-2/trunk/applications/j2-admin/src/webapp/images/recyclebin.gif
URL: http://svn.apache.org/viewvc/portals/jetspeed-2/trunk/applications/j2-admin/src/webapp/images/recyclebin.gif?view=auto&rev=482815
==============================================================================
Binary file - no diff available.

Propchange: portals/jetspeed-2/trunk/applications/j2-admin/src/webapp/images/recyclebin.gif
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: portals/jetspeed-2/trunk/applications/j2-admin/src/webapp/images/removesmall.gif
URL: http://svn.apache.org/viewvc/portals/jetspeed-2/trunk/applications/j2-admin/src/webapp/images/removesmall.gif?view=auto&rev=482815
==============================================================================
Binary file - no diff available.

Propchange: portals/jetspeed-2/trunk/applications/j2-admin/src/webapp/images/removesmall.gif
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: portals/jetspeed-2/trunk/applications/j2-admin/src/webapp/images/table_edit.png
URL: http://svn.apache.org/viewvc/portals/jetspeed-2/trunk/applications/j2-admin/src/webapp/images/table_edit.png?view=auto&rev=482815
==============================================================================
Binary file - no diff available.

Propchange: portals/jetspeed-2/trunk/applications/j2-admin/src/webapp/images/table_edit.png
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: portals/jetspeed-2/trunk/applications/j2-admin/src/webapp/images/test.html
URL: http://svn.apache.org/viewvc/portals/jetspeed-2/trunk/applications/j2-admin/src/webapp/images/test.html?view=auto&rev=482815
==============================================================================
--- portals/jetspeed-2/trunk/applications/j2-admin/src/webapp/images/test.html (added)
+++ portals/jetspeed-2/trunk/applications/j2-admin/src/webapp/images/test.html Tue Dec  5 14:52:32 2006
@@ -0,0 +1,92 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
+        "http://www.w3.org/TR/html4/strict.dtd">
+<html>
+<head>
+<title>Dojo Tree Widget Test</title>
+
+<script type="text/javascript">
+	var djConfig = {isDebug: true};
+	//var djConfig = {isDebug: true, debugAtAllCosts: true };
+</script>
+<script type="text/javascript" src="../../../dojo.js"></script>
+<script type="text/javascript">
+	dojo.require("dojo.lang.*");
+	dojo.require("dojo.widget.*");
+	dojo.require("dojo.widget.Tree");
+	dojo.hostenv.writeIncludes();
+</script>
+</head>
+<body>
+
+<h2>Show root expanders, show gridlines, with icons (fade). Also node with HTML title.</h2>
+
+<div dojoType="Tree" toggle="fade">
+	<div dojoType="TreeNode" title="<span style='color:blue;font-style:italic'>HTML title</span>" childIconSrc="../../../src/widget/templates/images/treenode_node.gif">
+		<div dojoType="TreeNode" title="Item 1.1" childIconSrc="../../../src/widget/templates/images/treenode_node.gif"></div>
+		<div dojoType="TreeNode" title="Item 1.2" childIconSrc="../../../src/widget/templates/images/treenode_node.gif">
+			<div dojoType="TreeNode" title="Item 1.2.1" childIconSrc="../../../src/widget/templates/images/treenode_node.gif">
+				<div dojoType="TreeNode" title="Item 1.2.1.1" childIconSrc="../../../src/widget/templates/images/treenode_node.gif"></div>
+			</div>
+			<div dojoType="TreeNode" title="Item 1.2.2" childIconSrc="../../../src/widget/templates/images/treenode_node.gif"></div>
+		</div>
+		<div dojoType="TreeNode" title="Item 1.3" childIconSrc="../../../src/widget/templates/images/treenode_node.gif">
+			<div dojoType="TreeNode" title="Item 1.3.1" childIconSrc="../../../src/widget/templates/images/treenode_node.gif"></div>
+			<div dojoType="TreeNode" title="Item 1.3.2" childIconSrc="../../../src/widget/templates/images/treenode_node.gif"></div>
+		</div>
+		<div dojoType="TreeNode" title="Item 1.4" childIconSrc="../../../src/widget/templates/images/treenode_node.gif">
+			<div dojoType="TreeNode" title="Item 1.4.1" childIconSrc="../../../src/widget/templates/images/treenode_node.gif"></div>
+		</div>
+	</div>
+	<div dojoType="TreeNode" title="Item 2" childIconSrc="../../../src/widget/templates/images/treenode_node.gif"></div>
+</div>
+
+<h2>Hide root expanders, show gridlines</h2>
+
+<div dojoType="Tree" showRootGrid="false">
+	<div dojoType="TreeNode" title="Item 1">
+		<div dojoType="TreeNode" title="Item 1.1">
+			<div dojoType="TreeNode" title="Item 1.2"></div>
+		</div>
+	</div>
+	<div dojoType="TreeNode" title="Item 2">
+		<div dojoType="TreeNode" title="Item 2.1"></div>
+	</div>
+
+	<div dojoType="TreeNode" title="Item 3"></div>
+</div>
+
+<h2>Show root expanders, hide gridlines (wipe)</h2>
+
+<div dojoType="Tree" showGrid="false" toggle="wipe" toggleDuration="500">
+	<div dojoType="TreeNode" title="Item 1">
+		<div dojoType="TreeNode" title="Item 1.1">
+			<div dojoType="TreeNode" title="Item 1.2"></div>
+		</div>
+	</div>
+	<div dojoType="TreeNode" title="Item 2">
+		<div dojoType="TreeNode" title="Item 2.1"></div>
+		<div dojoType="TreeNode" title="Item 2.2"></div>
+		<div dojoType="TreeNode" title="Item 2.3"></div>
+		<div dojoType="TreeNode" title="Item 2.4"></div>
+		<div dojoType="TreeNode" title="Item 2.5"></div>
+	</div>
+	<div dojoType="TreeNode" title="Item 3"></div>
+</div>
+
+
+<h2>Hide root expanders, hide gridlines</h2>
+
+<div dojoType="Tree" showGrid="false" showRootGrid="false">
+	<div dojoType="TreeNode" title="Item 1">
+		<div dojoType="TreeNode" title="Item 1.1">
+			<div dojoType="TreeNode" title="Item 1.2"></div>
+		</div>
+	</div>
+	<div dojoType="TreeNode" title="Item 2">
+		<div dojoType="TreeNode" title="Item 2.1"></div>
+	</div>
+	<div dojoType="TreeNode" title="Item 3"></div>
+</div>
+
+</body>
+</html>

Added: portals/jetspeed-2/trunk/applications/j2-admin/src/webapp/images/up.gif
URL: http://svn.apache.org/viewvc/portals/jetspeed-2/trunk/applications/j2-admin/src/webapp/images/up.gif?view=auto&rev=482815
==============================================================================
Binary file - no diff available.

Propchange: portals/jetspeed-2/trunk/applications/j2-admin/src/webapp/images/up.gif
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: portals/jetspeed-2/trunk/applications/j2-admin/src/webapp/images/upsmall.png
URL: http://svn.apache.org/viewvc/portals/jetspeed-2/trunk/applications/j2-admin/src/webapp/images/upsmall.png?view=auto&rev=482815
==============================================================================
Binary file - no diff available.

Propchange: portals/jetspeed-2/trunk/applications/j2-admin/src/webapp/images/upsmall.png
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: portals/jetspeed-2/trunk/applications/j2-admin/src/webapp/images/wand.png
URL: http://svn.apache.org/viewvc/portals/jetspeed-2/trunk/applications/j2-admin/src/webapp/images/wand.png?view=auto&rev=482815
==============================================================================
Binary file - no diff available.

Propchange: portals/jetspeed-2/trunk/applications/j2-admin/src/webapp/images/wand.png
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream



---------------------------------------------------------------------
To unsubscribe, e-mail: jetspeed-dev-unsubscribe@portals.apache.org
For additional commands, e-mail: jetspeed-dev-help@portals.apache.org