[Cluster-devel] conga/luci Makefile cluster/100wait cluster/cl ...

rmccabe at sourceware.org rmccabe at sourceware.org
Fri Jun 30 17:00:13 UTC 2006


CVSROOT:	/cvs/cluster
Module name:	conga
Changes by:	rmccabe at sourceware.org	2006-06-30 17:00:03

Modified files:
	luci           : Makefile 
Added files:
	luci/cluster   : 100wait clu_portlet_fetcher clusterportlet.css 
	                 form-chooser form-macros index_html main_footer 
	                 main_logo main_pathbar main_personalbar 
	                 main_sections portlet_cluconfig 
	                 portlet_cluconfig_macro status_check systest 
	luci/storage   : 100wait.gif black_bar_40.png 
	                 black_right_end_40.png blue_bar_40.png 
	                 blue_cap_40.png blue_right_end_40.png 
	                 cache_report clu_portlet_fetcher 
	                 clusterportlet.css form-chooser form-macros 
	                 icon_bd_LV.png icon_bd_LV_snapshot.png 
	                 icon_bd_crypto.png icon_bd_ide.png 
	                 icon_bd_multipath.png icon_bd_net.png 
	                 icon_bd_partition.png icon_bd_raid.png 
	                 icon_bd_scsi.png icon_mapper_PT.png 
	                 icon_mapper_VG.png icon_mapper_crypto.png 
	                 icon_mapper_multipath.png icon_mapper_raid.png 
	                 index_html main_footer main_logo main_pathbar 
	                 main_personalbar main_sections mappings_macros 
	                 mappings_provider portlet_cluconfig 
	                 portlet_cluconfig_macro red_bar_40.png 
	                 red_cap_40.png red_right_end_40.png 
	                 selection_1px_40.png selection_bar_40.png 
	                 selection_left_end_40.png 
	                 selection_right_end_40.png snapshot.gif 
	                 tree_bullet.gif tree_closed.gif tree_opened.gif 
	                 tree_transparent.gif validate_html 

Log message:
	check in the page template, image, and css files for storage and homebase that currently reside only in Zope's DB (Data.fs)

Patches:
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/Makefile.diff?cvsroot=cluster&r1=1.5&r2=1.6
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/cluster/100wait.diff?cvsroot=cluster&r1=NONE&r2=1.1
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/cluster/clu_portlet_fetcher.diff?cvsroot=cluster&r1=NONE&r2=1.1
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/cluster/clusterportlet.css.diff?cvsroot=cluster&r1=NONE&r2=1.1
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/cluster/form-chooser.diff?cvsroot=cluster&r1=NONE&r2=1.1
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/cluster/form-macros.diff?cvsroot=cluster&r1=NONE&r2=1.1
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/cluster/index_html.diff?cvsroot=cluster&r1=NONE&r2=1.1
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/cluster/main_footer.diff?cvsroot=cluster&r1=NONE&r2=1.1
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/cluster/main_logo.diff?cvsroot=cluster&r1=NONE&r2=1.1
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/cluster/main_pathbar.diff?cvsroot=cluster&r1=NONE&r2=1.1
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/cluster/main_personalbar.diff?cvsroot=cluster&r1=NONE&r2=1.1
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/cluster/main_sections.diff?cvsroot=cluster&r1=NONE&r2=1.1
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/cluster/portlet_cluconfig.diff?cvsroot=cluster&r1=NONE&r2=1.1
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/cluster/portlet_cluconfig_macro.diff?cvsroot=cluster&r1=NONE&r2=1.1
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/cluster/status_check.diff?cvsroot=cluster&r1=NONE&r2=1.1
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/cluster/systest.diff?cvsroot=cluster&r1=NONE&r2=1.1
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/storage/100wait.gif.diff?cvsroot=cluster&r1=NONE&r2=1.1
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/storage/black_bar_40.png.diff?cvsroot=cluster&r1=NONE&r2=1.1
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/storage/black_right_end_40.png.diff?cvsroot=cluster&r1=NONE&r2=1.1
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/storage/blue_bar_40.png.diff?cvsroot=cluster&r1=NONE&r2=1.1
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/storage/blue_cap_40.png.diff?cvsroot=cluster&r1=NONE&r2=1.1
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/storage/blue_right_end_40.png.diff?cvsroot=cluster&r1=NONE&r2=1.1
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/storage/cache_report.diff?cvsroot=cluster&r1=NONE&r2=1.1
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/storage/clu_portlet_fetcher.diff?cvsroot=cluster&r1=NONE&r2=1.1
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/storage/clusterportlet.css.diff?cvsroot=cluster&r1=NONE&r2=1.1
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/storage/form-chooser.diff?cvsroot=cluster&r1=NONE&r2=1.1
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/storage/form-macros.diff?cvsroot=cluster&r1=NONE&r2=1.1
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/storage/icon_bd_LV.png.diff?cvsroot=cluster&r1=NONE&r2=1.1
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/storage/icon_bd_LV_snapshot.png.diff?cvsroot=cluster&r1=NONE&r2=1.1
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/storage/icon_bd_crypto.png.diff?cvsroot=cluster&r1=NONE&r2=1.1
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/storage/icon_bd_ide.png.diff?cvsroot=cluster&r1=NONE&r2=1.1
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/storage/icon_bd_multipath.png.diff?cvsroot=cluster&r1=NONE&r2=1.1
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/storage/icon_bd_net.png.diff?cvsroot=cluster&r1=NONE&r2=1.1
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/storage/icon_bd_partition.png.diff?cvsroot=cluster&r1=NONE&r2=1.1
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/storage/icon_bd_raid.png.diff?cvsroot=cluster&r1=NONE&r2=1.1
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/storage/icon_bd_scsi.png.diff?cvsroot=cluster&r1=NONE&r2=1.1
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/storage/icon_mapper_PT.png.diff?cvsroot=cluster&r1=NONE&r2=1.1
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/storage/icon_mapper_VG.png.diff?cvsroot=cluster&r1=NONE&r2=1.1
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/storage/icon_mapper_crypto.png.diff?cvsroot=cluster&r1=NONE&r2=1.1
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/storage/icon_mapper_multipath.png.diff?cvsroot=cluster&r1=NONE&r2=1.1
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/storage/icon_mapper_raid.png.diff?cvsroot=cluster&r1=NONE&r2=1.1
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/storage/index_html.diff?cvsroot=cluster&r1=NONE&r2=1.1
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/storage/main_footer.diff?cvsroot=cluster&r1=NONE&r2=1.1
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/storage/main_logo.diff?cvsroot=cluster&r1=NONE&r2=1.1
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/storage/main_pathbar.diff?cvsroot=cluster&r1=NONE&r2=1.1
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/storage/main_personalbar.diff?cvsroot=cluster&r1=NONE&r2=1.1
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/storage/main_sections.diff?cvsroot=cluster&r1=NONE&r2=1.1
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/storage/mappings_macros.diff?cvsroot=cluster&r1=NONE&r2=1.1
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/storage/mappings_provider.diff?cvsroot=cluster&r1=NONE&r2=1.1
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/storage/portlet_cluconfig.diff?cvsroot=cluster&r1=NONE&r2=1.1
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/storage/portlet_cluconfig_macro.diff?cvsroot=cluster&r1=NONE&r2=1.1
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/storage/red_bar_40.png.diff?cvsroot=cluster&r1=NONE&r2=1.1
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/storage/red_cap_40.png.diff?cvsroot=cluster&r1=NONE&r2=1.1
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/storage/red_right_end_40.png.diff?cvsroot=cluster&r1=NONE&r2=1.1
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/storage/selection_1px_40.png.diff?cvsroot=cluster&r1=NONE&r2=1.1
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/storage/selection_bar_40.png.diff?cvsroot=cluster&r1=NONE&r2=1.1
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/storage/selection_left_end_40.png.diff?cvsroot=cluster&r1=NONE&r2=1.1
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/storage/selection_right_end_40.png.diff?cvsroot=cluster&r1=NONE&r2=1.1
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/storage/snapshot.gif.diff?cvsroot=cluster&r1=NONE&r2=1.1
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/storage/tree_bullet.gif.diff?cvsroot=cluster&r1=NONE&r2=1.1
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/storage/tree_closed.gif.diff?cvsroot=cluster&r1=NONE&r2=1.1
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/storage/tree_opened.gif.diff?cvsroot=cluster&r1=NONE&r2=1.1
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/storage/tree_transparent.gif.diff?cvsroot=cluster&r1=NONE&r2=1.1
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/storage/validate_html.diff?cvsroot=cluster&r1=NONE&r2=1.1

--- conga/luci/Makefile	2006/06/16 23:14:34	1.5
+++ conga/luci/Makefile	2006/06/30 17:00:02	1.6
@@ -1,4 +1,4 @@
-# $Id: Makefile,v 1.5 2006/06/16 23:14:34 kupcevic Exp $
+# $Id: Makefile,v 1.6 2006/06/30 17:00:02 rmccabe Exp $
 
 
 all: luci
@@ -60,7 +60,7 @@
 PLONEINSTANCE=luci
 DBFILE=Data.fs
 ZOPEFTP=localhost:8021
-ZOPEHTTP=http://localhost:8080/
+ZOPEHTTP=http://localhost:25639/
 ZOPEDIRS=cluster storage homebase
 
 all_old: tar
@@ -72,7 +72,7 @@
 
 import_pts:
 	@pwd=`pwd` ; cd $(PT_DIR) && \
-	( for i in $(ZOPEDIRS) ; do wget -q -r -nH --cut-dirs=1 "ftp://$(ZOPEUSER):$(ZOPEPASS)@$(ZOPEFTP)/$(PLONEINSTANCE)/$$i/" ; done) ; cd $$pwd
+	( for i in $(ZOPEDIRS) ; do wget -r -nH --cut-dirs=1 "ftp://$(ZOPEUSER):$(ZOPEPASS)@$(ZOPEFTP)/$(PLONEINSTANCE)/$$i/*" ; done) ; cd $$pwd
 
 pack:
 	@./make_tools/pack.py $(ZOPEINSTANCE)/var/Data.fs
/cvs/cluster/conga/luci/cluster/100wait,v  -->  standard output
revision 1.1
Binary files /cvs/cluster/conga/luci/cluster/100wait and - differ
co: output error: Broken pipe
co aborted
/cvs/cluster/conga/luci/cluster/clu_portlet_fetcher,v  -->  standard output
revision 1.1
--- conga/luci/cluster/clu_portlet_fetcher
+++ -	2006-06-30 17:00:05.263304000 +0000
@@ -0,0 +1,42 @@
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"
+      i18n:domain="plone">
+
+<body>
+
+<metal:leftcolumn define-macro="left_column">
+<!-- unchecked_clusystems are all clusters...the check_clusters call filters list through user permissions -->
+<span tal:define="global unchecked_clusystems root/luci/systems/cluster/objectItems"/>
+<span tal:define="global clusystems python:here.check_clusters(request,unchecked_clusystems)"/>
+<div tal:omit-tag="" metal:use-macro="here/portlet_cluconfig/macros/cluchooseportlet" /> 
+<span tal:omit-tag="" tal:define="global hasclustername request/clustername |nothing"/>
+<span tal:omit-tag="" tal:condition="hasclustername">
+<div tal:omit-tag="" metal:use-macro="here/portlet_cluconfig/macros/cluconfigportlet" />
+</span>
+</metal:leftcolumn>
+
+<!--
+
+<metal:rightcolumn define-macro="right_column"
+   tal:define="Iterator python:modules['Products.CMFPlone'].IndexIterator;
+               tabindex python:Iterator(pos=20000);"
+   tal:condition="sr">
+
+    <metal:block tal:repeat="slot sr">
+        <tal:dontcrash tal:on-error="python:context.plone_log('Error %s on %s while rendering portlet %s'%(error.type, error.value, slot[0]))"
+                       tal:define="pathexpr python:slot[0];
+                                   usemacro python:slot[1];">
+
+        <tal:block tal:condition="usemacro">
+            <metal:block metal:use-macro="python:path(pathexpr)" />
+        </tal:block>
+
+        <span tal:condition="not: usemacro"
+              tal:replace="structure python:path(pathexpr)" />
+
+        </tal:dontcrash>
+    </metal:block>
+</metal:rightcolumn>
+-->
+
+</body>
+</html>
/cvs/cluster/conga/luci/cluster/clusterportlet.css,v  -->  standard output
revision 1.1
--- conga/luci/cluster/clusterportlet.css
+++ -	2006-06-30 17:00:05.428827000 +0000
@@ -0,0 +1,238 @@
+dl.portlet {
+    margin: 1px 0 1em 0;
+    border-bottom: 1px solid #8cacbb;
+}
+
+dl.portlet a {
+    text-decoration: none;
+}
+#portal-columns {
+    width: 100% !important;
+    border-collapse: collapse;
+    border-spacing: 0;
+}
+                                                                                
+#portal-column-one {
+    vertical-align: top;
+    width: 16em;
+}
+                                                                                
+#portal-column-content {
+    vertical-align: top;
+    margin: 0;
+    padding: 0;
+}
+                                                                                
+#portal-column-two {
+    vertical-align: top;
+    width: 16em;
+}
+                                                                                
+/* Padding for the columns */
+                                                                                
+#portal-column-one .visualPadding {
+    padding: 2em 0em 1em 2em;
+}
+                                                                                
+#portal-column-two .visualPadding {
+    padding: 2em 2em 1em 0em;
+}
+
+/* XXX: The two below rules should really be in the rule above, but that makes the items grow/shrink on :hover (navtree) - need to investigate how to make it not do that. ~limi, Dec 2005 */
+dd.portletItem a,
+dd.portletFooter a {
+    border-bottom: none;
+}
+dd.portletItem a:visited,
+dd.portletFooter a:visited {
+    color: #436976;
+}
+
+.portletHeader {
+    background-color: #dee7ec;
+    border: 1px solid #8cacbb;
+    padding: 0em 1em;
+    text-transform: lowercase;
+    font-weight: normal;
+    line-height: 1.6em;
+}
+
+.portletHeader a {
+    color: Black;
+}
+
+.portletItem {
+    margin: 0;
+    padding: 1em;
+    border-left: 1px solid #8cacbb;
+    border-right: 1px solid #8cacbb;
+}
+.portletItem a {
+    display: block;
+}
+
+.portletItemDetails {
+    text-align: right;
+    display: block;
+    color: Black;
+}
+
+dd.portletFooter {
+    background-color: #eef3f5;
+    margin: 0;
+    padding: 0.25em 1em;
+    border: 1px solid #8cacbb;
+    border-style: dotted solid none solid;
+    text-align: right;
+}
+
+
+/* Elements that enable layout with rounded corners */
+
+.portletTopLeft {}
+.portletTopRight {}
+.portletBottomLeft {}
+.portletBottomRight {}
+.portletCluConfigTree {
+    margin: 0 0 0 0.75em;
+    padding: 0;
+    list-style: none;
+    list-style-image: none;
+    line-height: 1em;
+}
+
+
+
+.cluConfigTree {
+    list-style: none;
+    list-style-image: none;
+    margin-top: 1px;
+}
+
+.cluConfig li {
+    margin-bottom: 1px;
+}
+
+.cluConfigTreeItem {
+    display: block;
+    padding: 0;
+    margin: 0;
+}
+.cluConfigTreeItem a,
+dd.portletItem .cluConfigTreeItem a {
+    border: 1px solid White;
+    display: block;
+    text-decoration: none;
+    padding-top: 0.2em;
+    padding-bottom: 0.25em;
+}
+
+.cluConfigTreeItem a:hover,
+dd.portletItem .cluConfigTreeItem a:hover {
+    background-color: #dee7ec;
+    color: #436976;
+    border: 1px solid #8cacbb;
+}
+
+.cluConfigTreeCurrentItem {
+    background-color: #dee7ec;
+    color: #436976;
+    border: 1px solid #8cacbb !important;
+}
+li.cluConfigTreeCurrentItem {
+    display: block;
+    padding: 0 0 0 1px;
+    margin: 0 0 2px -1px;
+}
+li.cluConfigTreeCurrentItem a,
+li.cluConfigTreeCurrentItem a:hover {
+    display: block;
+    border: 1px solid #dee7ec;
+    min-height: 1.6em;
+    line-height: 1.6em;
+    height: auto;
+}
+
+/* Another workaround for broken Internet Explorer */
+
+* html li.cluConfigTreeCurrentItem a,
+* html li.cluConfigTreeCurrentItem a:hover {
+    height: 1.6em;
+}
+.type-nodecfg, .type-nodes, .type-node, .type-nodelist, 
+.type-nodegrid, .type-nodeadd {
+display: block;
+}
+
+.cluConfigTreeLevel0 { margin: 0; }
+.cluConfigTreeLevel1 { margin-left: 1em;}
+.cluConfigTreeLevel2 { margin-left: 0.75em; }
+.cluConfigTreeLevel3 { margin-left: 0.75em; }
+.cluConfigTreeLevel4 { margin-left: 0.75em; }
+.cluConfigTreeLevel5 { margin-left: 0.75em; }
+
+#main-portal-logo {
+    background: url(./clusterbanner.png) no-repeat;
+    border: 0;
+    margin: 0.75em 0em 0.75em 1.5em;
+    padding: 0;
+}
+
+#main-portal-logo a {
+    display: block;
+    text-decoration: none;
+    overflow: hidden;
+    border: 0;
+    margin: 0;
+    padding: 0;
+    padding-top: 87px;
+    height: 0px !important;
+    height /**/: 57px;
+    width: 252px;
+    cursor: pointer;
+}
+
+#portal-globalnav li a {
+    /* The normal, unselected tabs. They are all links */
+    background-color: transparent;
+    border-color: #8cacabb;
+    border-width: 1px;
+    border-style: solid solid none solid;
+    color: #436976;
+    height: auto;
+    margin-right: 0.5em;
+    padding: 0em 1.25em;
+    text-decoration: none;
+    text-transform: lowercase;
+}
+
+#portal-globalnav li.selected a {
+    /* The selected tab. There's only one of this */
+    background-color: #dee7ec;
+    border: 1px solid #8cacbb;
+    border-bottom: #dee7ec 1px solid;
+    color: #436976;
+}
+#portal-globalnav li a:hover {
+    background-color: #dee7ec;
+    border-color: #8cacbb;
+    border-bottom-color: #dee7ec;
+    color: #436976;
+}
+#portal-personaltools {
+    /* Bar with personalized menu (user preferences, favorites etc) */
+    background-color: #dee7ec;
+    border-top-color: #8cacbb;
+    border-top-style: solid;
+    border-top-width: 1px;
+    border-bottom-color: #8cacbb;
+    border-bottom-style: solid;
+    border-bottom-width: 1px;
+    line-height: 1.6em;
+    color: Black;
+    padding: 0em 3em 0em 3em;
+    margin: 0;
+    text-align: right;
+    text-transform: lowercase;
+    list-style: none;
+}
/cvs/cluster/conga/luci/cluster/form-chooser,v  -->  standard output
revision 1.1
--- conga/luci/cluster/form-chooser
+++ -	2006-06-30 17:00:05.579000000 +0000
@@ -0,0 +1,137 @@
+<html>
+  <head>
+    <title tal:content="template/title">The title</title>
+  </head>
+  <body>
+ 
+  <metal:choose-form metal:define-macro="main-form">
+  <span tal:define="global waiting request/specialpagetype |nothing"/>
+  <span tal:condition="busywaiting">
+    <div metal:use-macro="here/form-macros/macros/busywaitpage"/>
+  </span>
+  <span tal:condition="not: busywaiting">
+    <span tal:omit-tag="" tal:define="global ptype request/pagetype |nothing"/>  
+    <span tal:omit-tag="" tal:condition="python: not ptype">
+     <div metal:use-macro="here/form-macros/macros/entry-form"/>
+    </span>
+    <span tal:omit-tag="" tal:condition="python: ptype == '0'">
+     <div metal:use-macro="here/form-macros/macros/entry-form"/>
+    </span>
+    <span tal:omit-tag="" tal:condition="python: ptype == '4'">
+     <div metal:use-macro="here/form-macros/macros/clusters-form"/>
+    </span>
+    <span tal:omit-tag="" tal:condition="python: ptype == '5'">
+     <div metal:use-macro="here/form-macros/macros/cluster-form"/>
+    </span>
+    <span tal:omit-tag="" tal:condition="python: ptype == '6'">
+     <div metal:use-macro="here/form-macros/macros/clusteradd-form"/>
+    </span>
+    <span tal:omit-tag="" tal:condition="python: ptype == '7'">
+     <div metal:use-macro="here/form-macros/macros/clusters-form"/>
+    </span>
+    <span tal:omit-tag="" tal:condition="python: ptype == '9'">
+     <div metal:use-macro="here/form-macros/macros/node-form"/>
+    </span>
+    <span tal:omit-tag="" tal:condition="python: ptype == '10'">
+     <div metal:use-macro="here/form-macros/macros/nodes-form"/>
+    </span>
+    <span tal:omit-tag="" tal:condition="python: ptype == '11'">
+     <div metal:use-macro="here/form-macros/macros/nodelist-form"/>
+    </span>
+    <span tal:omit-tag="" tal:condition="python: ptype == '12'">
+     <div metal:use-macro="here/form-macros/macros/nodegrid-form"/>
+    </span>
+    <span tal:omit-tag="" tal:condition="python: ptype == '14'">
+     <div metal:use-macro="here/form-macros/macros/nodes-form"/>
+    </span>
+    <span tal:omit-tag="" tal:condition="python: ptype == '15'">
+     <div metal:use-macro="here/form-macros/macros/nodeadd-form"/>
+    </span>
+    <span tal:omit-tag="" tal:condition="python: ptype == '16'">
+     <div metal:use-macro="here/form-macros/macros/nodeprocess-form"/>
+    </span>
+    <span tal:omit-tag="" tal:condition="python: ptype == '20'">
+     <div metal:use-macro="here/form-macros/macros/servicelist-form"/>
+    </span>
+    <span tal:omit-tag="" tal:condition="python: ptype == '21'">
+     <div metal:use-macro="here/form-macros/macros/serviceadd-form"/>
+    </span>
+    <span tal:omit-tag="" tal:condition="python: ptype == '22'">
+     <div metal:use-macro="here/form-macros/macros/servicelist-form"/>
+    </span>
+    <span tal:omit-tag="" tal:condition="python: ptype == '23'">
+     <div metal:use-macro="here/form-macros/macros/servicelist-form"/>
+    </span>
+    <span tal:omit-tag="" tal:condition="python: ptype == '24'">
+     <div metal:use-macro="here/form-macros/macros/serviceconfig-form"/>
+    </span>
+    <span tal:omit-tag="" tal:condition="python: ptype == '25'">
+     <div metal:use-macro="here/form-macros/macros/serviceprocess-form"/>
+    </span>
+    <span tal:omit-tag="" tal:condition="python: ptype == '26'">
+     <div metal:use-macro="here/form-macros/macros/servicestart"/>
+    </span>
+    <span tal:omit-tag="" tal:condition="python: ptype == '27'">
+     <div metal:use-macro="here/form-macros/macros/servicestop"/>
+    </span>
+    <span tal:omit-tag="" tal:condition="python: ptype == '28'">
+     <div metal:use-macro="here/form-macros/macros/servicerestart"/>
+    </span>
+    <span tal:omit-tag="" tal:condition="python: ptype == '30'">
+     <div metal:use-macro="here/form-macros/macros/resources-form"/>
+    </span>
+    <span tal:omit-tag="" tal:condition="python: ptype == '31'">
+     <div metal:use-macro="here/form-macros/macros/resourceadd-form"/>
+    </span>
+    <span tal:omit-tag="" tal:condition="python: ptype == '32'">
+     <div metal:use-macro="here/form-macros/macros/resourcelist-form"/>
+    </span>
+    <span tal:omit-tag="" tal:condition="python: ptype == '33'">
+     <div metal:use-macro="here/form-macros/macros/resourceconfig-form"/>
+    </span>
+    <span tal:omit-tag="" tal:condition="python: ptype == '34'">
+     <div metal:use-macro="here/form-macros/macros/resource-form"/>
+    </span>
+    <span tal:omit-tag="" tal:condition="python: ptype == '35'">
+     <div metal:use-macro="here/form-macros/macros/resourceprocess-form"/>
+    </span>
+    <span tal:omit-tag="" tal:condition="python: ptype == '40'">
+     <div metal:use-macro="here/form-macros/macros/fdoms-form"/>
+    </span>
+    <span tal:omit-tag="" tal:condition="python: ptype == '41'">
+     <div metal:use-macro="here/form-macros/macros/fdomadd-form"/>
+    </span>
+    <span tal:omit-tag="" tal:condition="python: ptype == '42'">
+     <div metal:use-macro="here/form-macros/macros/fdomlist-form"/>
+    </span>
+    <span tal:omit-tag="" tal:condition="python: ptype == '43'">
+     <div metal:use-macro="here/form-macros/macros/fdomconfig-form"/>
+    </span>
+    <span tal:omit-tag="" tal:condition="python: ptype == '44'">
+     <div metal:use-macro="here/form-macros/macros/fdom-form"/>
+    </span>
+    <span tal:omit-tag="" tal:condition="python: ptype == '45'">
+     <div metal:use-macro="here/form-macros/macros/fdomprocess-form"/>
+    </span>
+    <span tal:omit-tag="" tal:condition="python: ptype == '50'">
+     <div metal:use-macro="here/form-macros/macros/fencedevs-form"/>
+    </span>
+    <span tal:omit-tag="" tal:condition="python: ptype == '51'">
+     <div metal:use-macro="here/form-macros/macros/fencedevadd-form"/>
+    </span>
+    <span tal:omit-tag="" tal:condition="python: ptype == '52'">
+     <div metal:use-macro="here/form-macros/macros/fencedevlist-form"/>
+    </span>
+    <span tal:omit-tag="" tal:condition="python: ptype == '45'">
+     <div metal:use-macro="here/form-macros/macros/fencedevconfig-form"/>
+    </span>
+    <span tal:omit-tag="" tal:condition="python: ptype == '54'">
+     <div metal:use-macro="here/form-macros/macros/fencedev-form"/>
+    </span>
+    <span tal:omit-tag="" tal:condition="python: ptype == '55'">
+     <div metal:use-macro="here/form-macros/macros/fencedevprocess-form"/>
+    </span>
+   </span>
+  </metal:choose-form>
+  </body>
+</html>
/cvs/cluster/conga/luci/cluster/form-macros,v  -->  standard output
revision 1.1
--- conga/luci/cluster/form-macros
+++ -	2006-06-30 17:00:05.776536000 +0000
@@ -0,0 +1,317 @@
+<html>
+  <head>
+    <title tal:content="template/title">The title</title>
+  </head>
+  <body>
+    
+  <div metal:define-macro="entry-form">
+   <h2>Entry Form</h2>
+  </div>
+  <div metal:define-macro="busywaitpage">
+   <table>
+    <tr>
+     <td>
+      <h2>Please be patient - this cluster's configuration is being modified.</h2>
+     </td>
+    </tr>
+    <tr>
+     <td>
+      <img src="100wait"/>
+     </td>
+    </tr>
+   </table>
+    
+  </div>
+  <div metal:define-macro="clusters-form">
+     <table>
+      <tbody>
+       <span tal:repeat="clu clusystems">
+        <span tal:define="ragent python:here.getRicciAgent(clu)">
+         <span tal:define="global stat python:here.getClusterStatus(ragent)"/>
+         <span tal:define="global cstatus python:here.getClustersInfo(stat,request)"/>
+        </span>
+       <tr width="100%" STYLE="border-bottom: blue 3px groove;">
+        <td width="100%" STYLE="border-bottom: #8cacbb 3px solid;">
+         <table width="800px">
+          <tr STYLE="padding:10px;margin:10px;border-width:0px;"><td STYLE="padding:10px;margin:10px;border-width:0px;"><h1 STYLE="border:0px;">Cluster Name: <span tal:content="cstatus/clustername"/></h1></td>
+            <td STYLE="margin:10px"><form METHOD=POST onSubmit="return dropdown(this.gourl)">
+              <SELECT NAME="gourl">
+               <span tal:condition="python:cstatus['running'] == 'true'">
+               <OPTION VALUE="">This cluster is running...</OPTION>
+               <OPTION VALUE=""><font color="red">Stop this cluster</font></OPTION>
+               </span>
+               <span tal:condition="python:cstatus['running'] == 'false'">
+               <OPTION VALUE="">This cluster is stopped...</OPTION>
+               <OPTION VALUE=""><font color="green">Start this cluster</font></OPTION>
+               </span>
+              </SELECT>
+              <INPUT TYPE=SUBMIT VALUE="Go"/>
+             </FORM>
+            </td>
+            <td STYLE="width:30%; text-align:right;"><h1 STYLE="border:0px;">Pretty Name: <span tal:content="cstatus/clusteralias"/></h1></td>
+       </tr>
+       <tr STYLE="padding:10px;margin:10px"><td STYLE="padding:10px;margin:10px"><h2 STYLE="border:0px;">Status:  <i><span tal:content="cstatus/status"/></i></h2></td>
+                                            <td STYLE="padding:10px;margin:10px"><h2 STYLE="border:0px;">Total Cluster Votes:  <i><span tal:content="cstatus/votes"/></i></h2></td>
+                                            <td STYLE="padding:10px;margin:10px"><h2 STYLE="border:0px;">Minimum Required Quorum:  <i><span tal:content="cstatus/minquorum"/></i></h2></td>
+       </tr>
+       <tr STYLE="padding:10px;margin:10px"><td STYLE="padding:10px;margin:10px"><h2 STYLE="border:0px;">Nodes:</h2>  <ul><span tal:repeat="nd cstatus/currentnodes"><li><a href="" tal:attributes="href nd/configurl"><span tal:content="nd/nodename"/></a></li></span></ul></td>
+           <td STYLE="width:30%;text-align:right"><h3>Currently Hosting: </h3><ul><span tal:repeat="svc cstatus/currentservices"><li><a href="" tal:attributes="href svc/svcurl"><span tal:content="svc/name"/></a></li></span></ul></td>
+       </tr>
+        
+        </span>
+      </tbody>
+     </table>
+  </div>
+  <div metal:define-macro="cluster-form">
+   <h2>Cluster Form</h2>
+  </div>
+  <div metal:define-macro="clusteradd-form">
+   <h2>Cluster Add Form</h2>
+  </div>
+  <div metal:define-macro="clusterconfig-form">
+   <h2>Cluster Configuration Form</h2>
+  </div>
+  <div metal:define-macro="node-form">
+   <h2>Node Form</h2>
+  </div>
+  <div metal:define-macro="nodes-form">
+    <table>
+     <span tal:define="global ricci_agent python:here.getRicciAgentForCluster(request)"/>
+     <span tal:define="global status python:here.getClusterStatus(ricci_agent)"/>
+     <span tal:define="global nds python:here.getNodesInfo(modelb,status,request)"/>
+     <span tal:repeat="nd nds">
+     <tr width="100%" STYLE="border-bottom: blue 3px groove;">
+      <td width="100%" STYLE="border-bottom: #8cacbb 3px solid;">
+       <table width="800px">
+        <tr STYLE="padding:10px;margin:10px;border-width:0px;"><td STYLE="padding:10px;margin:10px;border-width:0px;"><h1 STYLE="border:0px;">Node Name: <span tal:content="nd/nodename"/></h1></td>
+            <td STYLE="margin:10px"><form METHOD=POST onSubmit="return dropdown(this.gourl)">
+              <SELECT NAME="gourl">
+               <OPTION VALUE="">Choose a Task...</OPTION>
+               <OPTION VALUE="" tal:attributes="VALUE nd/configurl">Configure</OPTION>
+               <OPTION VALUE="">Have node leave cluster</OPTION>
+               <OPTION VALUE="">Stop all cluster services</OPTION>
+               <OPTION VALUE="">----------</OPTION>
+               <OPTION VALUE="">Fence this node</OPTION>
+               <OPTION VALUE="">Reboot this node</OPTION>
+               <OPTION VALUE="">----------</OPTION>
+               <OPTION VALUE="">Delete</OPTION>
+              </SELECT>
+              <INPUT TYPE=SUBMIT VALUE="Go"/>
+             </FORM>
+            </td>
+            <td STYLE="width:30%; text-align:right;"><h3><a href="" tal:attributes="href nd/fenceurl">Manage Fencing for this Node</a></h3></td>
+       </tr>
+       <tr STYLE="padding:10px;margin:10px"><td STYLE="padding:10px;margin:10px"><h2 STYLE="border:0px;">Status:  <i><span tal:content="nd/status"/></i></h2></td></tr>
+       <tr STYLE="padding:10px;margin:10px"><td STYLE="padding:10px;margin:10px"><h2 STYLE="border:0px;">Currently Hosting:</h2>  <ul><span tal:repeat="svc nd/currentservices"><li><a href="" tal:attributes="href svc/svcurl"><span tal:content="svc/servicename"/></a></li></span></ul></td>
+           <td STYLE="width:30%;text-align:right"><h3>Failover Domain Membership: </h3><ul><span tal:repeat="fdom nd/fdoms"><li><a href="" tal:attributes="href fdom/fdomurl"><span tal:content="fdom/name"/></a></li></span></ul></td>
+       </tr>
+      </table>
+        </tr>
+     
+     </span>
+     </table>
+  </div>
+  <div metal:define-macro="nodelist-form">
+   <h2>Node List Form</h2>
+  </div>
+  <div metal:define-macro="nodegrid-form">
+   <h2>Node Grid Form</h2>
+  </div>
+  <div metal:define-macro="nodeconfig-form">
+   <h2>Node Configuration Form</h2>
+  </div>
+  <div metal:define-macro="nodeadd-form">
+   <h2>Node Add Form</h2>
+  </div>
+  <div metal:define-macro="nodeprocess-form">
+   <h2>Node Process Form</h2>
+  </div>
+  <div metal:define-macro="services-form">
+   <h2>Services Form</h2>
+  </div>
+  <div metal:define-macro="servicelist-form">
+    <table>
+     <span tal:define="global ricci_agent python:here.getRicciAgentForCluster(request)"/>
+     <span tal:define="global svcstatus python:here.getClusterStatus(ricci_agent)"/>
+     <span tal:define="global svcinf python:here.getServicesInfo(svcstatus,modelb,request)"/>
+     <span tal:define="global svcs svcinf/services"/>
+     <span tal:repeat="svc svcs">
+     <tr width="100%" STYLE="border-bottom: blue 3px groove;">
+      <td width="100%" STYLE="border-bottom: #8cacbb 3px solid;">
+       <table width="800px">
+        <tr STYLE="padding:10px;margin:10px;border-width:0px;"><td STYLE="padding:10px;margin:10px;border-width:0px;"><h1 STYLE="border:0px;">Service Name: <span tal:content="svc/name"/></h1></td>
+            <td STYLE="margin:10px"><form METHOD=POST onSubmit="return dropdown(this.gourl)">
+              <SELECT NAME="gourl">
+               <OPTION VALUE="">Choose a Task...</OPTION>
+               <OPTION VALUE="" tal:attributes="VALUE svc/cfgurl">Configure</OPTION>
+               <OPTION VALUE="">----------</OPTION>
+               <OPTION VALUE="">Delete</OPTION>
+              </SELECT>
+              <INPUT TYPE=SUBMIT VALUE="Go"/>
+             </FORM>
+            </td>
+           <span tal:define="autostart svc/autostart |nothing">
+            <span tal:condition="autostart">
+             <td STYLE="width:30%; text-align:right;"><h2 STYLE="border:0px;">Autostart is enabled for this service</h2></td>
+            </span>
+            <span tal:condition="not: autostart">
+             <td STYLE="width:30%; text-align:right;"><h2 STYLE="border:0px;">Autostart is enabled for this service</h2></td>
+            </span>
+           </span>
+       </tr>
+        <span tal:define="running svc/running |nothing">
+         <span tal:condition="running">
+          <tr STYLE="padding:10px;margin:10px">
+           <td STYLE="padding:10px;margin:10px"><h2 STYLE="border:0px;">Status:  <i><font color="green">Running on <span tal:content="svc/nodename"/></font></i></h2></td>
+           <td STYLE="width:30%;text-align:right"><h2 STYLE="border:0px;">Failover Domain Association: <span tal:content="svc/faildom"/></h2></td>
+          </tr>
+         </span>
+         <span tal:condition="not: running">
+          <tr STYLE="padding:10px;margin:10px">
+           <td STYLE="padding:10px;margin:10px"><h2 STYLE="border:0px;">Status:  <i><font color="red">This service is stopped</font></i></h2></td>
+
+           <td STYLE="width:30%;text-align:center"><h2 STYLE="border:0px;">Failover Domain Association: <span tal:content="svc/faildom"/></h2></td>
+          </tr>
+         </span>
+        </span>
+ 
+      </table>
+        </tr>
+     
+     </span>
+     </table>
+ 
+  </div>
+  <div metal:define-macro="serviceadd-form">
+   <h2>Service Add Form</h2>
+  </div>
+  <div metal:define-macro="servicestart">
+    <span tal:define="global ricci_agent python:here.getRicciAgentForCluster(request)"/>
+    <span tal:define="result python:here.serviceStart(ricci_agent, request)"/>
+    <!-- <span metal:use-macro="here/form-macros/macros/serviceconfig-form"/> -->
+  </div>
+  <div metal:define-macro="servicerestart">
+  <span tal:define="global ricci_agent python:here.getRicciAgentForCluster(request)"/>
+    <span tal:define="result python:here.serviceRestart(ricci_agent, request)"/>
+    <!-- <span metal:use-macro="here/form-macros/macros/serviceconfig-form"/> -->
+  </div>
+  <div metal:define-macro="servicestop">
+  <span tal:define="global ricci_agent python:here.getRicciAgentForCluster(request)"/>
+    <span tal:define="result python:here.serviceStop(ricci_agent,request)"/>
+    <!-- <span metal:use-macro="here/form-macros/macros/serviceconfig-form"/> -->
+  </div>
+  <div metal:define-macro="serviceconfig-form">
+  <span tal:define="global ricci_agent python:here.getRicciAgentForCluster(request)"/>
+   <span tal:define="global sstat python:here.getClusterStatus(ricci_agent)"/>
+   <span tal:define="global sinfo python:here.getServiceInfo(sstat, modelb,request)">
+    <span tal:define="global running sinfo/running | nothing"/>
+   <table width="800px">
+    <tr STYLE="padding:10px;margin:10px;border-width:0px;">
+     <td STYLE="padding:10px;margin:10px;border-width:0px;"><h1 STYLE="border:0px;">Service Name: <span tal:content="sinfo/name"/></h1></td>
+       <td STYLE="margin:10px"><form METHOD=POST onSubmit="return dropdown(this.gourl)">
+         <SELECT NAME="gourl">
+          <span tal:define="global innermap sinfo/innermap"/>
+          <span tal:condition="running">
+           <OPTION VALUE=""><span tal:content="innermap/current"/></OPTION>
+           <OPTION VALUE="" tal:attributes="VALUE innermap/restarturl">Restart this service</OPTION>
+           <OPTION VALUE="">----------</OPTION>
+           <OPTION VALUE="" tal:attributes="VALUE innermap/disableurl">Disable this service</OPTION>
+           <OPTION VALUE="">----------</OPTION>
+            <span tal:repeat="starturl innermap/links">
+             <OPTION VALUE=""  tal:attributes="VALUE starturl/url">Start this service on <span tal:content="starturl/nodename"/></OPTION>
+            </span>
+           <OPTION VALUE="">----------</OPTION>
+           <OPTION VALUE="">Delete this service</OPTION>
+           </span>
+           <span tal:condition="not: running">
+           <OPTION VALUE=""><span tal:content="innermap/current"/></OPTION>
+           <OPTION VALUE="">----------</OPTION>
+           <OPTION VALUE="" tal:attributes="VALUE innermap/enableurl">Enable this service</OPTION>
+           <OPTION VALUE="">----------</OPTION>
+           <span tal:define="starturls innermap/links">
+            <span tal:repeat="starturl starturls">
+             <OPTION VALUE="" tal:attributes="VALUE starturl/url">Start this service on <span tal:content="starturl/nodename"/></OPTION>
+            </span>
+           </span>
+           <OPTION VALUE="">----------</OPTION>
+           <OPTION VALUE="">Delete This service</OPTION>
+           </span>
+          </SELECT>
+          <INPUT TYPE=SUBMIT VALUE="Go"/>
+         </FORM>
+        </td>
+       </tr>
+     
+       <tr STYLE="padding:10px;margin:10px;border-width:0px;">
+      <span tal:condition="running">
+       <td STYLE="width:30%;text-align:center"><h1 STYLE="border:0px;">Service Status: <font color="green"><i>Running</i></font></h1></td>
+      </span>
+      <span tal:condition="not: running">
+       <td STYLE="width:30%;text-align:center"><h1 STYLE="border:0px;">Service Status: <font color="red"><i>Stopped</i></font></h1></td>
+      </span>
+    </tr>
+   </table>
+   </span>
+  </div>
+  <div metal:define-macro="service-form">
+   <h2>Service Form</h2>
+  </div>
+  <div metal:define-macro="serviceprocess-form">
+   <h2>Service Process Form</h2>
+  </div>
+  <div metal:define-macro="resources-form">
+   <h2>Resources Form</h2>
+  </div>
+  <div metal:define-macro="resourcelist-form">
+   <h2>Resource List Form</h2>
+  </div>
+  <div metal:define-macro="resourceadd-form">
+   <h2>Resource Add Form</h2>
+  </div>
+  <div metal:define-macro="resourceconfig-form">
+   <h2>Resource Configuration Form</h2>
+  </div>
+  <div metal:define-macro="resource-form">
+   <h2>Resource Form</h2>
+  </div>
+  <div metal:define-macro="resourceprocess-form">
+   <h2>Resource Process Form</h2>
+  </div>
+  <div metal:define-macro="fdoms-form">
+   <h2>Failover Domains Form</h2>
+  </div>
+  <div metal:define-macro="fdomlist-form">
+   <h2>Failover Domains List Form</h2>
+  </div>
+  <div metal:define-macro="fdomadd-form">
+   <h2>Failover Domain Add Form</h2>
+  </div>
+  <div metal:define-macro="fdomconfig-form">
+   <h2>Failover Domain Configuration Form</h2>
+  </div>
+  <div metal:define-macro="fdom-form">
+   <h2>Failover Domain Form</h2>
+  </div>
+  <div metal:define-macro="fdomprocess-form">
+   <h2>Failover Domain Process Form</h2>
+  </div>
+  <div metal:define-macro="fencedevs-form">
+   <h2>Fence Devices Form</h2>
+  </div>
+  <div metal:define-macro="fencedevlist-form">
+   <h2>Fence Device List Form</h2>
+  </div>
+  <div metal:define-macro="fencedevadd-form">
+   <h2>Fence Device Add Form</h2>
+  </div>
+  <div metal:define-macro="fencedevconfig-form">
+   <h2>Fence Device Configuration Form</h2>
+  </div>
+  <div metal:define-macro="fencedev-form">
+   <h2>Fence Device Form</h2>
+  </div>
+  <div metal:define-macro="fencedevprocess-form">
+   <h2>Fence Device Process Form</h2>
+  </div>
+  </body>
+</html>
/cvs/cluster/conga/luci/cluster/index_html,v  -->  standard output
revision 1.1
--- conga/luci/cluster/index_html
+++ -	2006-06-30 17:00:05.895575000 +0000
@@ -0,0 +1,242 @@
+<metal:page define-macro="master"><metal:doctype define-slot="doctype"><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"></metal:doctype>
+<metal:block define-slot="top_slot" />
+<metal:block use-macro="here/global_defines/macros/defines" />
+
+<html xmlns="http://www.w3.org/1999/xhtml"
+      xml:lang="en"
+      lang="en"
+      tal:attributes="lang language;
+                      xml:lang language">
+
+   <head metal:use-macro="here/header/macros/html_header">
+
+
+                    
+  
+
+     <metal:fillbase fill-slot="base">
+      <metal:baseslot define-slot="base">
+        <base href="" tal:attributes="href here/renderBase" />
+      </metal:baseslot>
+    </metal:fillbase>
+
+    <metal:headslot fill-slot="head_slot"
+                    tal:define="lang language;
+                                charset site_properties/default_charset|string:utf-8">
+
+      <metal:cache use-macro="here/global_cache_settings/macros/cacheheaders">
+        Get the global cache headers located in global_cache_settings.
+      </metal:cache>
+
+      <metal:headslot define-slot="head_slot" />
+    <div tal:define="global hascluster request/clustername |nothing; global busywaiting python:None;"/>
+    <span tal:condition="not: hascluster">
+    <meta googaa="ooo"/>
+    </span>
+    <span tal:condition="hascluster">
+      <span tal:define="global isBusy python:here.isClusterBusy(request)"/>
+      <span tal:define="global firsttime request/busyfirst |nothing"/>
+      <span tal:condition="firsttime">
+       <span tal:define="global busywaiting python:True"/>
+      </span>
+      <span tal:define="global busy isBusy/busy |nothing"/>
+       <span tal:condition="busy">
+        <span tal:define="global busywaiting python:True"/>
+        <meta http-equiv="refresh" content="" tal:attributes="content isBusy/refreshurl"/> 
+       </span>
+    </span>
+      <tal:comment replace="nothing"> A slot where you can insert elements in the header from a template </tal:comment>
+    </metal:headslot>
+
+
+
+    <metal:cssslot fill-slot="css_slot">
+      <tal:comment replace="nothing"> A slot where you can insert CSS in the header from a template </tal:comment>
+    
+  <style type="text/css"><!-- @import url(./clusterportlet.css); --></style>
+      <metal:cssslot define-slot="css_slot" />
+    </metal:cssslot>
+
+    <metal:javascriptslot fill-slot="javascript_head_slot">
+      <tal:comment replace="nothing"> A slot where you can insert javascript in the header from a template </tal:comment>
+      <SCRIPT TYPE="text/javascript">
+      <!--
+       function dropdown(mySel)
+       {
+        var myWin, myVal;
+        myVal = mySel.options[mySel.selectedIndex].value;
+        if(myVal)
+          {
+            if(mySel.form.target)myWin = parent[mySel.form.target];
+            else myWin = window;
+            if (! myWin) return true;
+               myWin.location = myVal;
+          }
+         return false;
+        }
+        //-->
+       </SCRIPT>
+      <metal:javascriptslot define-slot="javascript_head_slot" />
+    </metal:javascriptslot>
+
+  </head>
+
+  <body tal:attributes="class here/getSectionFromURL;
+                        dir python:test(isRTL, 'rtl', 'ltr')">
+    <div id="visual-portal-wrapper">
+
+      <div id="portal-top" i18n:domain="plone">
+
+        <div id="portal-header">
+          <a class="hiddenStructure"
+             accesskey="2"
+             tal:attributes="href string:${request/ACTUAL_URL}#documentContent"
+             i18n:translate="label_skiptocontent">Skip to content.</a>
+
+          <a class="hiddenStructure"
+             accesskey="6"
+             tal:attributes="href string:${request/ACTUAL_URL}#portlet-navigation-tree"
+             i18n:translate="label_skiptonavigation">Skip to navigation</a>
+<!--
+             <div metal:use-macro="here/global_siteactions/macros/site_actions">
+               Site-wide actions (Contact, Sitemap, Help, Style Switcher etc)
+             </div>
+-->
+<!--
+             <div metal:use-macro="here/global_searchbox/macros/quick_search">
+               The quicksearch box, normally placed at the top right
+             </div>
+-->
+             <a metal:use-macro="here/main_logo/macros/main_portal_logo">
+               The portal logo, linked to the portal root
+             </a>
+<!--
+             <div metal:use-macro="here/global_skinswitcher/macros/skin_tabs">
+               The skin switcher tabs. Based on which role you have, you
+               get a selection of skins that you can switch between.
+             </div>
+-->
+             <div metal:use-macro="here/main_sections/macros/portal_tabs">
+               The global sections tabs. (Welcome, News etc)
+             </div>
+          </div>
+
+          <div metal:use-macro="here/main_personalbar/macros/personal_bar">
+             The personal bar. (log in, logout etc...)
+           </div>
+<!--
+           <div metal:use-macro="here/main_pathbar/macros/path_bar">
+             The breadcrumb navigation ("you are here")
+           </div>
+      </div>
+-->
+      <div class="visualClear"><!-- --></div>
+
+      <tal:comment replace="nothing">
+      The wrapper table. It contains the three columns. There's a table-less
+      alternative in the plone_tableless skin layer that you can use if you
+      prefer layouts that don't use tables.
+      </tal:comment>
+    <!-- <div tal:define="global hascluster request/clustername |nothing"/>  -->
+    <span tal:condition="hascluster">
+    <span tal:define="global ricci_agent python:here.getRicciAgentForCluster(request)"/>
+    <div tal:omit-tag="" tal:define="global modelb python:here.getmodelbuilder(ricci_agent)" />  
+    </span>
+      <table id="portal-columns">
+        <tbody>
+          <tr>
+            <tal:comment replace="nothing"> Start of the left column </tal:comment>
+            <td id="portal-column-one"
+                metal:define-slot="column_one_slot"
+                tal:condition="sl">
+              <div class="visualPadding">
+                <metal:portlets define-slot="portlets_one_slot">
+                  <metal:leftportlets use-macro="here/clu_portlet_fetcher/macros/left_column">
+                    This instruction gets the portlets (boxes) for the left column.
+                  </metal:leftportlets>
+                </metal:portlets>
+                 
+              </div>
+            </td>
+            <tal:comment replace="nothing"> End of the left column </tal:comment>
+
+            <tal:comment replace="nothing"> Start of main content block </tal:comment>
+            <td id="portal-column-content">
+
+              <metal:block define-slot="content">
+                <div id="content"
+                     metal:define-macro="content">
+
+  
+
+                  <div class="documentContent" id="region-content">
+
+                    <a name="documentContent"></a>
+
+                    <metal:bodytext metal:define-slot="main" tal:content="nothing">
+                
+                      Page body text
+                    </metal:bodytext>
+                <span tal:omit-tag="" tal:define="global cname request/clustername |nothing"/>
+                <span tal:omit-tag="" tal:condition="not: cname">
+                <h1>Choose a cluster to administer</h1>
+                 </span>
+                <span tal:omit-tag="" tal:condition="cname">
+                <h1 tal:content="string:${cname}"></h1>
+                 </span>
+
+ 
+                  </div>
+
+                </div>
+
+              </metal:block>
+             <metal:main-form-content use-macro="here/form-chooser/macros/main-form">
+                <h1>Future Site of Forms</h1>
+             </metal:main-form-content>
+            </td>
+            <tal:comment replace="nothing"> End of main content block </tal:comment>
+
+<!--
+            <tal:comment replace="nothing"> Start of right column </tal:comment>
+            <td id="portal-column-two"
+                metal:define-slot="column_two_slot"
+                tal:condition="sr">
+              <div class="visualPadding">
+                <metal:portlets define-slot="portlets_two_slot">
+                  <metal:rightportlets use-macro="here/portlets_fetcher/macros/right_column">
+                    This instruction gets the portlets (boxes) for the right column.
+                  </metal:rightportlets>
+                </metal:portlets>
+                 
+              </div>
+            </td>
+            <tal:comment replace="nothing"> End of the right column </tal:comment>
+-->
+          </tr>
+        </tbody>
+      </table>
+      <tal:comment replace="nothing"> end column wrapper </tal:comment>
+
+      <div class="visualClear"><!-- --></div>
+
+
+      <hr class="netscape4" />
+
+      <metal:block i18n:domain="plone">
+
+        <metal:footer use-macro="here/main_footer/macros/portal_footer">
+          Footer
+        </metal:footer>
+
+        <metal:colophon use-macro="here/colophon/macros/colophon">
+          The colophon area - contains details about the production of
+          the site. Typically "powered by" buttons, standards, tools used.
+        </metal:colophon>
+      </metal:block>
+
+    </div>
+
+</body>
+</html>
+</metal:page>
/cvs/cluster/conga/luci/cluster/main_footer,v  -->  standard output
revision 1.1
--- conga/luci/cluster/main_footer
+++ -	2006-06-30 17:00:06.525419000 +0000
@@ -0,0 +1,37 @@
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<body>
+<div id="portal-footer" metal:define-macro="portal_footer">
+
+<p>
+    <span i18n:translate="description_copyright" tal:omit-tag="">
+    The 
+    <span>
+        <a href="http://redhat.com">Conga™ Cluster and Storage Management System</a>
+    </span>
+    is Copyright
+    <acronym title="Copyright" i18n:name="copyright" i18n:attributes="title title_copyright;">©</acronym>
+    2000-<span i18n:name="current_year" 
+               tal:define="now modules/DateTime/DateTime" 
+               tal:content="now/year" />
+    by 
+    <span>
+        <a href="http://redhat.com/Conga">Red Hat, Luci, Ricci, </a>
+    </span>
+    et al.
+    </span>
+</p>
+
+<p>
+
+
+    <span i18n:translate="description_license">
+    Distributed under the 
+        <span i18n:name="license">
+            <a href="http://creativecommons.org/licenses/GPL/2.0/" i18n:translate="label_gnu_gpl_licence">GNU GPL license</a>
+        </span>.
+    </span>
+</p>
+
+</div>
+</body>
+</html>
\ No newline at end of file
/cvs/cluster/conga/luci/cluster/main_logo,v  -->  standard output
revision 1.1
--- conga/luci/cluster/main_logo
+++ -	2006-06-30 17:00:06.614260000 +0000
@@ -0,0 +1,15 @@
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"
+      i18n:domain="plone">
+
+<body>
+
+<!-- THE PORTAL LOGO DEFINITION -->
+<h1 id="main-portal-logo" metal:define-macro="main_portal_logo">
+    <a href="/">
+        Luci
+    </a>
+</h1>
+
+
+</body>
+</html>
/cvs/cluster/conga/luci/cluster/main_pathbar,v  -->  standard output
revision 1.1
--- conga/luci/cluster/main_pathbar
+++ -	2006-06-30 17:00:06.782077000 +0000
@@ -0,0 +1,40 @@
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"
+      i18n:domain="plone">
+
+<body>
+
+<!-- THE PATHBAR (breadcrumbs) DEFINITION -->
+<div metal:define-macro="path_bar"
+     id="portal-breadcrumbs"
+     tal:define="breadcrumbs python:putils.createBreadCrumbs(here);
+                     portal_url portal_url|utool">
+
+    <span id="breadcrumbs-you-are-here" i18n:translate="you_are_here">You 
+are here:</span>
+    <a i18n:translate="tabs_home" tal:attributes="href python:portal_url">Home</a>
+    <span tal:condition="breadcrumbs" class="breadcrumbSeparator">
+        <tal:ltr condition="not: isRTL">→</tal:ltr> 
+        <tal:rtl condition="isRTL">←</tal:rtl> 
+    </span>
+    <span tal:repeat="crumb breadcrumbs"
+          tal:attributes="dir python:test(isRTL, 'rtl', 'ltr')">
+        <tal:last tal:define="is_last repeat/crumb/end">
+            <a href="#"
+               tal:omit-tag="not: crumb/absolute_url"
+               tal:condition="python:not is_last"
+               tal:attributes="href crumb/absolute_url"
+               tal:content="crumb/Title">
+                crumb
+            </a>
+            <span class="breadcrumbSeparator" tal:condition="not: is_last"> 
+                <tal:ltr condition="not: isRTL">→</tal:ltr> 
+                <tal:rtl condition="isRTL">←</tal:rtl> 
+            </span>
+            <span tal:condition="is_last"
+                  tal:content="crumb/Title">crumb</span>
+         </tal:last>
+    </span>
+
+</div>
+</body>
+</html>
/cvs/cluster/conga/luci/cluster/main_personalbar,v  -->  standard output
revision 1.1
--- conga/luci/cluster/main_personalbar
+++ -	2006-06-30 17:00:07.528406000 +0000
@@ -0,0 +1,44 @@
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"
+      i18n:domain="plone">
+
+<body>
+
+<!-- THE PERSONAL BAR DEFINITION -->
+
+<div metal:define-macro="personal_bar"
+      tal:define="display_actions python:user_actions[:-1]+global_actions+user_actions[-1:];
+                  getIconFor nocall:putils/getIconFor;"
+      tal:omit-tag="">
+
+<h5 class="hiddenStructure" i18n:translate="heading_personal_tools">Personal tools</h5>
+
+<ul id="portal-personaltools">
+    <li class="portalUser" 
+        tal:condition="not: isAnon"><a 
+        id="user-name"
+        tal:omit-tag="not: mtool/getHomeFolder"
+        tal:attributes="href string:${mtool/getHomeUrl}">
+        <span class="visualCaseSensitive"
+              tal:replace="user/getUserName">
+             John
+        </span>
+    </a></li>
+
+    <tal:actions tal:repeat="action python:here.getOrderedUserActions(keyed_actions=keyed_actions)">
+        <li tal:define="icon python:getIconFor(action['category'], action['id'], None);
+                        class_name string:actionicon-${action/category}-${action/id};
+                        class_name python:test(icon, class_name, nothing);"
+            tal:attributes="class class_name">
+            <a href=""
+               tal:attributes="href action/url;
+                               class python:test(icon, 'visualIconPadding', nothing);">
+               <tal:actionname i18n:translate="" tal:content="action/name">dummy</tal:actionname>
+            </a>
+        </li>
+    </tal:actions>
+
+</ul>
+</div>
+
+</body>
+</html>
/cvs/cluster/conga/luci/cluster/main_sections,v  -->  standard output
revision 1.1
--- conga/luci/cluster/main_sections
+++ -	2006-06-30 17:00:07.633171000 +0000
@@ -0,0 +1,27 @@
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"
+      i18n:domain="plone">
+
+<body>
+
+<!-- THE SECTION TABS DEFINITION -->
+<div metal:define-macro="portal_tabs"
+     tal:omit-tag=""
+     tal:define="tabs python:here.getTabs(request)">
+
+    <h5 class="hiddenStructure" i18n:translate="heading_sections">Sections</h5>
+
+    <ul id="portal-globalnav">
+       <tal:tabs tal:repeat="tab tabs">
+        <li tal:attributes="id string:portaltab-${tab/Title};
+                            class python:test(tab['isSelected'], 'selected', 'plain');">
+            <a href="" 
+               tal:content="tab/Title"
+               tal:attributes="href tab/Taburl;
+                               title tab/Description|nothing">
+            Tab Name
+            </a></li></tal:tabs>
+    </ul>
+</div>
+
+</body>
+</html>
/cvs/cluster/conga/luci/cluster/portlet_cluconfig,v  -->  standard output
revision 1.1
--- conga/luci/cluster/portlet_cluconfig
+++ -	2006-06-30 17:00:07.874291000 +0000
@@ -0,0 +1,60 @@
+<html xmlns:tal="http://xml.zope.org/namespaces/tal"
+      xmlns:metal="http://xml.zope.org/namespaces/metal">
+
+<body>
+
+
+<div metal:define-macro="cluchooseportlet"   
+       tal:omit-tag=""
+       tal:define="global data python:here.createCluChooser(request, clusystems)">
+       
+<dl class="portlet" id="portlet-cluconfig-tree">
+    <dt class="portletHeader">
+        <a href="#">
+          Clusters
+        </a>
+    </dt>
+    
+    <dd class="portletItemSingle">
+        <ul class="portletCluConfigTree cluConfigTreeLevel0">
+
+            <tal:clucfgtree define=" level python:1;
+                                     children python:data.get('children',[]);
+                                     show_children python:True;
+                                     isNaviTree python:False;">
+                <metal:main metal:use-macro="here/portlet_cluconfig_macro/macros/cluconfig_main" />
+            </tal:clucfgtree>
+        </ul>
+    </dd>
+</dl>
+
+</div>
+
+<div metal:define-macro="cluconfigportlet"
+       tal:omit-tag=""
+       tal:define="global data python:here.createCluConfigTree(request, modelb)">
+       
+<dl class="portlet" id="portlet-cluconfig-tree">
+    <dt class="portletHeader">
+        <a href="#" tal:attributes="href python:here.getClusterURL(request,modelb)">
+          <div tal:omit-tag="" tal:content="python: here.getClusterAlias(modelb)" /> 
+        </a>
+    </dt>
+    
+    <dd class="portletItemSingle">
+        <ul class="portletCluConfigTree cluConfigTreeLevel0">
+
+            <tal:clucfgtree define=" level python:1;
+                                     children python:data.get('children',[]);
+                                     show_children python:True;
+                                     isNaviTree python:False;">
+                <metal:main metal:use-macro="here/portlet_cluconfig_macro/macros/cluconfig_main" />
+            </tal:clucfgtree>
+        </ul>
+    </dd>
+</dl>
+
+</div>
+
+</body>
+</html>
/cvs/cluster/conga/luci/cluster/portlet_cluconfig_macro,v  -->  standard output
revision 1.1
--- conga/luci/cluster/portlet_cluconfig_macro
+++ -	2006-06-30 17:00:08.040244000 +0000
@@ -0,0 +1,41 @@
+<html>
+<body>
+<metal:main define-macro="cluconfig_main">
+<tal:cfgitem repeat="item children">
+<li class="cluConfigTreeItem visualNoMarker"
+    tal:define="parent_shows_children show_children|nothing;
+                children item/children|nothing;
+                cur_item item/currentItem;"
+    tal:condition="python: (cur_item or parent_shows_children or children)">
+
+   <tal:level define="item_type_class python: 'type-' + item['cfg_type'];"> 
+    <div tal:attributes="class item_type_class">
+        <a tal:condition="cur_item"
+           tal:attributes="href item/absolute_url;
+                           title item/Description|nothing;
+                           class string: cluConfigTreeCurrentItem visualIconPadding"
+            tal:content="item/Title|nothing">
+            Selected Item Title</a>
+        <tal:children condition="python: parent_shows_children or children">
+        <a tal:condition="not: cur_item"
+           tal:attributes="href item/absolute_url;
+                           title item/Description|nothing;
+                           class string: visualIconPadding;"
+            tal:content="item/Title|nothing">
+            Unselected Item Title</a>
+        </tal:children>
+    </div>
+
+    <ul tal:attributes="class python:'cluConfigTree cluConfigTreeLevel'+str(level)"
+        tal:define="show_children item/show_children| python:True;
+                    level python:level+1;"
+        tal:condition="python: (show_children or isNaviTree) and children">
+        <metal:recurse use-macro="here/portlet_cluconfig_macro/macros/cluconfig_main"/>
+    </ul>
+    </tal:level>
+</li>
+</tal:cfgitem>
+</metal:main>
+</body>
+</html>
+
/cvs/cluster/conga/luci/cluster/status_check,v  -->  standard output
revision 1.1
--- conga/luci/cluster/status_check
+++ -	2006-06-30 17:00:08.427865000 +0000
@@ -0,0 +1,9 @@
+<html>
+  <head>
+    <title tal:content="template/title">The title</title>
+  </head>
+  <body>
+    <span tal:define="stuff python:here.getClusterStatus('merope.lab')"/>
+    
+  </body>
+</html>
/cvs/cluster/conga/luci/cluster/systest,v  -->  standard output
revision 1.1
--- conga/luci/cluster/systest
+++ -	2006-06-30 17:00:08.547373000 +0000
@@ -0,0 +1,14 @@
+<html>
+  <head>
+    <title tal:content="template/title">The title</title>
+  </head>
+  <body>
+<span tal:define="global items root/plonybalony/systems/cluster/objectItems">
+    <div tal:repeat="item items">
+      id: <span tal:replace="python:item[0]" />
+    </div>
+   </span>
+    
+
+  </body>
+</html>
/cvs/cluster/conga/luci/storage/100wait.gif,v  -->  standard output
revision 1.1
Binary files /cvs/cluster/conga/luci/storage/100wait.gif and - differ
co: output error: Broken pipe
co aborted
/cvs/cluster/conga/luci/storage/black_bar_40.png,v  -->  standard output
revision 1.1
Binary files /cvs/cluster/conga/luci/storage/black_bar_40.png and - differ
/cvs/cluster/conga/luci/storage/black_right_end_40.png,v  -->  standard output
revision 1.1
Binary files /cvs/cluster/conga/luci/storage/black_right_end_40.png and - differ
/cvs/cluster/conga/luci/storage/blue_bar_40.png,v  -->  standard output
revision 1.1
Binary files /cvs/cluster/conga/luci/storage/blue_bar_40.png and - differ
/cvs/cluster/conga/luci/storage/blue_cap_40.png,v  -->  standard output
revision 1.1
Binary files /cvs/cluster/conga/luci/storage/blue_cap_40.png and - differ
/cvs/cluster/conga/luci/storage/blue_right_end_40.png,v  -->  standard output
revision 1.1
Binary files /cvs/cluster/conga/luci/storage/blue_right_end_40.png and - differ
/cvs/cluster/conga/luci/storage/cache_report,v  -->  standard output
revision 1.1
--- conga/luci/storage/cache_report
+++ -	2006-06-30 17:00:09.496414000 +0000
@@ -0,0 +1,17 @@
+<span tal:omit-tag="" 
+      tal:define="global storagename request/storagename|nothing"/>
+<span tal:omit-tag="" 
+      tal:define="stosystemss context/systems/storage/objectItems;
+                  global allowed_systems python:here.allowed_systems(user, stosystemss);
+                  global access_to_host_allowed python:here.access_to_host_allowed(storagename, allowed_systems)"/>
+<span tal:omit-tag="" 
+      tal:define="global ricci python:here.get_ricci_communicator(storagename, allowed_systems);
+                  global storage_report python:here.get_storage_report(ricci, request.SESSION)"/>
+<span tal:omit-tag=""
+      tal:condition="storage_report">
+OK
+</span>
+<span tal:omit-tag=""
+      tal:condition="not: storage_report">
+error
+</span>
/cvs/cluster/conga/luci/storage/clu_portlet_fetcher,v  -->  standard output
revision 1.1
--- conga/luci/storage/clu_portlet_fetcher
+++ -	2006-06-30 17:00:09.586553000 +0000
@@ -0,0 +1,43 @@
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"
+      i18n:domain="plone">
+
+<body>
+
+<metal:leftcolumn define-macro="left_column">
+<span tal:define="global stosystems allowed_systems"/>
+<div tal:omit-tag="" metal:use-macro="here/portlet_cluconfig/macros/stochooseportlet" /> 
+<!--
+<span tal:omit-tag="" tal:define="global hasstoragename request/storagename |nothing"/>
+<span tal:omit-tag="" tal:condition="hasstoragename">
+-->
+<span tal:omit-tag="" tal:condition="storage_report">
+<div tal:omit-tag="" metal:use-macro="here/portlet_cluconfig/macros/stoconfigportlet" />
+</span>
+</metal:leftcolumn>
+
+<!--
+
+<metal:rightcolumn define-macro="right_column"
+   tal:define="Iterator python:modules['Products.CMFPlone'].IndexIterator;
+               tabindex python:Iterator(pos=20000);"
+   tal:condition="sr">
+
+    <metal:block tal:repeat="slot sr">
+        <tal:dontcrash tal:on-error="python:context.plone_log('Error %s on %s while rendering portlet %s'%(error.type, error.value, slot[0]))"
+                       tal:define="pathexpr python:slot[0];
+                                   usemacro python:slot[1];">
+
+        <tal:block tal:condition="usemacro">
+            <metal:block metal:use-macro="python:path(pathexpr)" />
+        </tal:block>
+
+        <span tal:condition="not: usemacro"
+              tal:replace="structure python:path(pathexpr)" />
+
+        </tal:dontcrash>
+    </metal:block>
+</metal:rightcolumn>
+-->
+
+</body>
+</html>
/cvs/cluster/conga/luci/storage/clusterportlet.css,v  -->  standard output
revision 1.1
--- conga/luci/storage/clusterportlet.css
+++ -	2006-06-30 17:00:09.677918000 +0000
@@ -0,0 +1,238 @@
+dl.portlet {
+    margin: 1px 0 1em 0;
+    border-bottom: 1px solid #8cacbb;
+}
+
+dl.portlet a {
+    text-decoration: none;
+}
+#portal-columns {
+    width: 100% !important;
+    border-collapse: collapse;
+    border-spacing: 0;
+}
+                                                                                
+#portal-column-one {
+    vertical-align: top;
+    width: 16em;
+}
+                                                                                
+#portal-column-content {
+    vertical-align: top;
+    margin: 0;
+    padding: 0;
+}
+                                                                                
+#portal-column-two {
+    vertical-align: top;
+    width: 16em;
+}
+                                                                                
+/* Padding for the columns */
+                                                                                
+#portal-column-one .visualPadding {
+    padding: 2em 0em 1em 2em;
+}
+                                                                                
+#portal-column-two .visualPadding {
+    padding: 2em 2em 1em 0em;
+}
+
+/* XXX: The two below rules should really be in the rule above, but that makes the items grow/shrink on :hover (navtree) - need to investigate how to make it not do that. ~limi, Dec 2005 */
+dd.portletItem a,
+dd.portletFooter a {
+    border-bottom: none;
+}
+dd.portletItem a:visited,
+dd.portletFooter a:visited {
+    color: #436976;
+}
+
+.portletHeader {
+    background-color: #dee7ec;
+    border: 1px solid #8cacbb;
+    padding: 0em 1em;
+    text-transform: lowercase;
+    font-weight: normal;
+    line-height: 1.6em;
+}
+
+.portletHeader a {
+    color: Black;
+}
+
+.portletItem {
+    margin: 0;
+    padding: 1em;
+    border-left: 1px solid #8cacbb;
+    border-right: 1px solid #8cacbb;
+}
+.portletItem a {
+    display: block;
+}
+
+.portletItemDetails {
+    text-align: right;
+    display: block;
+    color: Black;
+}
+
+dd.portletFooter {
+    background-color: #eef3f5;
+    margin: 0;
+    padding: 0.25em 1em;
+    border: 1px solid #8cacbb;
+    border-style: dotted solid none solid;
+    text-align: right;
+}
+
+
+/* Elements that enable layout with rounded corners */
+
+.portletTopLeft {}
+.portletTopRight {}
+.portletBottomLeft {}
+.portletBottomRight {}
+.portletCluConfigTree {
+    margin: 0 0 0 0.75em;
+    padding: 0;
+    list-style: none;
+    list-style-image: none;
+    line-height: 1em;
+}
+
+
+
+.cluConfigTree {
+    list-style: none;
+    list-style-image: none;
+    margin-top: 1px;
+}
+
+.cluConfig li {
+    margin-bottom: 1px;
+}
+
+.cluConfigTreeItem {
+    display: block;
+    padding: 0;
+    margin: 0;
+}
+.cluConfigTreeItem a,
+dd.portletItem .cluConfigTreeItem a {
+    border: 1px solid White;
+    display: block;
+    text-decoration: none;
+    padding-top: 0.2em;
+    padding-bottom: 0.25em;
+}
+
+.cluConfigTreeItem a:hover,
+dd.portletItem .cluConfigTreeItem a:hover {
+    background-color: #dee7ec;
+    color: #436976;
+    border: 1px solid #8cacbb;
+}
+
+.cluConfigTreeCurrentItem {
+    background-color: #dee7ec;
+    color: #436976;
+    border: 1px solid #8cacbb !important;
+}
+li.cluConfigTreeCurrentItem {
+    display: block;
+    padding: 0 0 0 1px;
+    margin: 0 0 2px -1px;
+}
+li.cluConfigTreeCurrentItem a,
+li.cluConfigTreeCurrentItem a:hover {
+    display: block;
+    border: 1px solid #dee7ec;
+    min-height: 1.6em;
+    line-height: 1.6em;
+    height: auto;
+}
+
+/* Another workaround for broken Internet Explorer */
+
+* html li.cluConfigTreeCurrentItem a,
+* html li.cluConfigTreeCurrentItem a:hover {
+    height: 1.6em;
+}
+.type-nodecfg, .type-nodes, .type-node, .type-nodelist, 
+.type-nodegrid, .type-nodeadd {
+display: block;
+}
+
+.cluConfigTreeLevel0 { margin: 0; }
+.cluConfigTreeLevel1 { margin-left: 1em;}
+.cluConfigTreeLevel2 { margin-left: 0.75em; }
+.cluConfigTreeLevel3 { margin-left: 0.75em; }
+.cluConfigTreeLevel4 { margin-left: 0.75em; }
+.cluConfigTreeLevel5 { margin-left: 0.75em; }
+
+#main-portal-logo {
+    background: url(./clusterbanner.png) no-repeat;
+    border: 0;
+    margin: 0.75em 0em 0.75em 1.5em;
+    padding: 0;
+}
+
+#main-portal-logo a {
+    display: block;
+    text-decoration: none;
+    overflow: hidden;
+    border: 0;
+    margin: 0;
+    padding: 0;
+    padding-top: 87px;
+    height: 0px !important;
+    height /**/: 57px;
+    width: 252px;
+    cursor: pointer;
+}
+
+#portal-globalnav li a {
+    /* The normal, unselected tabs. They are all links */
+    background-color: transparent;
+    border-color: #8cacabb;
+    border-width: 1px;
+    border-style: solid solid none solid;
+    color: #436976;
+    height: auto;
+    margin-right: 0.5em;
+    padding: 0em 1.25em;
+    text-decoration: none;
+    text-transform: lowercase;
+}
+
+#portal-globalnav li.selected a {
+    /* The selected tab. There's only one of this */
+    background-color: #dee7ec;
+    border: 1px solid #8cacbb;
+    border-bottom: #dee7ec 1px solid;
+    color: #436976;
+}
+#portal-globalnav li a:hover {
+    background-color: #dee7ec;
+    border-color: #8cacbb;
+    border-bottom-color: #dee7ec;
+    color: #436976;
+}
+#portal-personaltools {
+    /* Bar with personalized menu (user preferences, favorites etc) */
+    background-color: #dee7ec;
+    border-top-color: #8cacbb;
+    border-top-style: solid;
+    border-top-width: 1px;
+    border-bottom-color: #8cacbb;
+    border-bottom-style: solid;
+    border-bottom-width: 1px;
+    line-height: 1.6em;
+    color: Black;
+    padding: 0em 3em 0em 3em;
+    margin: 0;
+    text-align: right;
+    text-transform: lowercase;
+    list-style: none;
+}
/cvs/cluster/conga/luci/storage/form-chooser,v  -->  standard output
revision 1.1
--- conga/luci/storage/form-chooser
+++ -	2006-06-30 17:00:09.763294000 +0000
@@ -0,0 +1,61 @@
+<html>
+  <head>
+    <title tal:content="template/title">The title</title>
+  </head>
+  <body>
+ 
+  <metal:choose-form metal:define-macro="main-form">
+
+<!--
+    <span tal:omit-tag="" tal:condition="python: storage_report == None and storagename != None">
+      <div metal:use-macro="here/form-macros/macros/error-form"/>
+    </span>
+-->
+
+    <span tal:omit-tag="" tal:condition="python: access_to_host_allowed == False and storagename != None">
+      <h2>
+       Insufficient rights
+      </h2>
+      <div metal:use-macro="here/form-macros/macros/error-form"/>
+    </span>
+
+    <span tal:omit-tag="" tal:condition="python: storage_report == None and storagename != None and access_to_host_allowed">
+      <div metal:use-macro="here/form-macros/macros/wait-probing-storage"/> 
+    </span>
+
+    <span tal:omit-tag="" tal:condition="python: (pagetype == '0' or pagetype == None) and storagename == None">
+      <div metal:use-macro="here/form-macros/macros/systems-form"/>
+    </span>
+
+    <span tal:omit-tag="" tal:condition="python: pagetype=='commit_changes' and storage_report != None">
+      <div metal:use-macro="here/form-macros/macros/commit-changes"/> 
+    </span>
+
+    <span tal:omit-tag="" tal:condition="python: pagetype == '44' and storage_report != None">
+      <div metal:use-macro="here/form-macros/macros/view-mappers-all-form"/>
+    </span>
+
+    <span tal:omit-tag="" tal:condition="python: pagetype == '51' and storage_report != None">
+      <div metal:use-macro="here/form-macros/macros/view-mappers-form"/>
+    </span>
+
+    <span tal:omit-tag="" tal:condition="python: pagetype == '52' and storage_report != None">
+      <div metal:use-macro="here/form-macros/macros/view-mapper-form"/>
+    </span>
+
+    <span tal:omit-tag="" tal:condition="python: pagetype == '61' and storage_report != None">
+      <div metal:use-macro="here/form-macros/macros/view-hard-drives-form"/>
+    </span>
+
+    <span tal:omit-tag="" tal:condition="python: pagetype == '62' and storage_report != None">
+      <div metal:use-macro="here/form-macros/macros/view-BD-form"/>
+    </span>
+
+    <span tal:omit-tag="" tal:condition="python: pagetype == '101' and storage_report != None">
+      <div metal:use-macro="here/form-macros/macros/create-mapper-form"/>
+    </span>
+
+  </metal:choose-form>
+
+  </body>
+</html>
/cvs/cluster/conga/luci/storage/form-macros,v  -->  standard output
revision 1.1
--- conga/luci/storage/form-macros
+++ -	2006-06-30 17:00:09.854492000 +0000
@@ -0,0 +1,1434 @@
+<html>
+  <head>
+    <title tal:content="template/title">The title</title>
+  </head>
+  <body>
+
+
+<div metal:define-macro="forms-css">
+   <style>
+      table.form td { padding: 0px;  }
+   </style>
+</div>
+
+
+
+
+<div metal:define-macro="commit-changes">
+   commiting changes...
+  <span tal:define="main_URL context/storage/index_html/absolute_url" 
+        tal:replace="structure python:here.apply(ricci, storage_report, request, main_URL)">
+   here.apply() response
+  </span>
+</div>
+
+
+
+
+<div metal:define-macro="wait-probing-storage">
+   <script>
+function strip_left(txt) {
+   for (i=0; i<txt.length; i++) {
+      if (txt[i] == " " || txt[i] == "\n")
+         continue;
+      return txt.substr(i);
+   }
+   return txt;
+}
+function cache_report_callback() {
+  if (xmlHttp_object.readyState == 4) {
+    var i = (window.location + '').indexOf('?');
+    var list_URL = (window.location + '').substr(0, i);
+    if (xmlHttp_object.status == 200) {
+        res = xmlHttp_object.responseText;
+        res = strip_left(res);
+        if (res.substr(0, 2) == "OK") {
+           window.location.reload();
+        } else {
+           alert('An error has occured while probing storage');
+           window.location = list_URL;
+        }
+    } else {
+        alert("Error retrieving data from server");
+        window.location = list_URL;
+    }
+  }
+}
+function cache_report() {
+   var i = (window.location + '').indexOf('?');
+   var URL = 'cache_report' + (window.location + '').substr(i);
+   initiate_async_get(URL, cache_report_callback);
+}
+setTimeout("cache_report()", 10)
+   </script>
+   
+   <table style="width: 100%;">
+    <tr>
+     <td align="center">
+      <img src="100wait.gif" style="padding-top: 1cm;"/>
+     </td>
+    </tr>
+    <tr>
+     <td align="center">
+      <div style="padding-bottom: 4cm;">Probing storage</div>
+     </td>
+    </tr>
+   </table>
+</div>
+
+
+
+
+  <div metal:define-macro="systems-form">
+   <table cellpadding="4"
+          tal:define="sort_by request/sort_by|nothing">
+    <tr tal:define="main_url context/storage/index_html/absolute_url">
+     <th>
+      <a tal:condition="python:sort_by == 'hostname' or sort_by == None"
+         tal:attributes="href python:main_url + '?pagetype=' + str(pagetype) + '&sort_by=hostname_reverse'">
+       Hostname
+      </a>
+      <a tal:condition="python:sort_by != 'hostname' and sort_by != None" 
+         tal:attributes="href python:main_url + '?pagetype=' + str(pagetype) + '&sort_by=hostname'">
+       Hostname
+      </a>
+     </th>
+     <th>
+      <a tal:condition="python:sort_by == 'OS'"
+         tal:attributes="href python:main_url + '?pagetype=' + str(pagetype) + '&sort_by=OS_reverse'">
+       Operating System
+      </a>
+      <a tal:condition="python:sort_by != 'OS'"
+         tal:attributes="href python:main_url + '?pagetype=' + str(pagetype) + '&sort_by=OS'">
+       Operating System
+      </a>
+     </th>
+     <th>
+      <a tal:condition="python:sort_by == 'cluster_name'"
+         tal:attributes="href python:main_url + '?pagetype=' + str(pagetype) + '&sort_by=cluster_name_reverse'">
+       Cluster Name
+      </a>
+      <a tal:condition="python:sort_by != 'cluster_name'"
+         tal:attributes="href python:main_url + '?pagetype=' + str(pagetype) + '&sort_by=cluster_name'">
+       Cluster Name
+      </a>
+     </th>
+     <th>
+      <a tal:condition="python:sort_by == 'cluster_alias'"
+         tal:attributes="href python:main_url + '?pagetype=' + str(pagetype) + '&sort_by=cluster_alias_reverse'">
+       Cluster Alias
+      </a>
+      <a tal:condition="python:sort_by != 'cluster_alias'"
+         tal:attributes="href python:main_url + '?pagetype=' + str(pagetype) + '&sort_by=cluster_alias'">
+       Cluster Alias
+      </a>
+     </th>
+    </tr>
+    <span tal:omit-tag="" 
+          tal:repeat="sys python:here.build_systems_list(sort_by, allowed_systems)">
+     <tr>
+      <td tal:define="tmp_host sys/hostname">
+       <a tal:condition="sys/available"
+          tal:attributes="href python:request['URL'] + '?pagetype=44&storagename=' + tmp_host">
+        <span tal:replace="tmp_host"/>
+       </a>
+       <span style="color:red" tal:condition="not: sys/available" tal:content="tmp_host"/>
+      </td>
+      <td>
+       <span tal:condition="sys/available" tal:replace="sys/OS"/>
+       <span style="color:red" tal:condition="not: sys/available" tal:content="sys/OS"/>
+      </td>
+      <td>
+       <span tal:replace="sys/cluname"/>
+      </td>
+      <td>
+       <span tal:replace="sys/clualias"/>
+      </td>
+     </tr>
+    </span>
+   </table>
+  </div> 
+
+
+  <div metal:define-macro="error-form">
+   <h2>Error Form</h2>
+   An error has occured, more details once implemented :)
+  </div>
+
+
+<div tal:omit-tag="" metal:define-macro="tree-css">
+ <style type="text/css">
+  @media screen, print {
+   ul.tree              { margin-left : 0px; padding : 0px; }
+   ul.tree ul.tree, ul.tree ul , ul.tree li { margin-left : 10px; padding : 0px; }
+   ul.tree              { list-style: none; }
+   ul.tree li           { padding-left: 0px; }
+   ul.tree li.opened    { padding-left: 0px; background-image: url(tree_opened.gif); background-repeat: no-repeat; background-position: 0 0; }
+   ul.tree li.closed    { padding-left: 0px; background-image: url(tree_closed.gif); background-repeat: no-repeat; background-position: 0 0; }
+   ul.tree li.bullet    { padding-left: 0px; background-image: url(tree_bullet.gif); background-repeat: no-repeat; background-position: 0 0; }
+   ul.tree li.opened ul { display: block; }
+   ul.tree li.closed ul { display: none; }
+  }
+ </style>
+</div>
+<div tal:omit-tag="" metal:define-macro="li-collapse-handler">
+ <a onClick="this.parentNode.className = (this.parentNode.className == 'opened') ? 'closed' : 'opened';"><img src="tree_transparent.gif"/></a>
+</div>
+
+
+  <div metal:define-macro="view-mappers-form">
+   <div metal:use-macro="here/form-macros/macros/tree-css"/>
+   <div metal:use-macro="here/form-macros/macros/content-scripts"/>
+   <div metal:use-macro="here/form-macros/macros/single-visible-span"/>
+   <div metal:use-macro="here/form-macros/macros/form-scripts"/>
+   <span tal:omit-tag=""
+         tal:define="mapper_type request/mapper_type;
+                     mappers_all python:here.get_mappers_data(storage_report)">
+    <span tal:omit-tag=""
+          tal:condition="python:mapper_type in mappers_all">
+     <span tal:omit-tag=""
+           tal:define="mappers_data python:mappers_all[mapper_type]">
+      <div metal:use-macro="here/form-macros/macros/display-mappers-of-type"/>
+     </span>
+    </span>
+    <span tal:omit-tag=""
+          tal:condition="python:mapper_type not in mappers_all">
+     Please use links to navigate around, don't modify address bar
+    </span>
+   </span>
+  </div>
+
+
+  <div metal:define-macro="view-hard-drives-form">
+   <div metal:use-macro="here/form-macros/macros/tree-css"/>
+   <div metal:use-macro="here/form-macros/macros/content-scripts"/>
+   <div metal:use-macro="here/form-macros/macros/single-visible-span"/>
+   <div metal:use-macro="here/form-macros/macros/form-scripts"/>
+   <span tal:omit-tag=""
+         tal:define="mappers_all python:here.get_mappers_data(storage_report)">
+    <span tal:omit-tag=""
+          tal:repeat="mapper_type python:mappers_all.keys()">
+     <span tal:omit-tag=""
+           tal:condition="python:mapper_type == 'hard_drives'"
+           tal:define="mappers_data python:mappers_all[mapper_type]">
+      <div metal:use-macro="here/form-macros/macros/display-hard-drives"/>
+     </span>
+    </span>
+   </span>
+  </div>
+
+
+  <div metal:define-macro="view-mappers-all-form">
+   <div metal:use-macro="here/form-macros/macros/tree-css"/>
+   <div metal:use-macro="here/form-macros/macros/content-scripts"/>
+   <div metal:use-macro="here/form-macros/macros/single-visible-span"/>
+   <div metal:use-macro="here/form-macros/macros/form-scripts"/>
+   <span tal:omit-tag=""
+         tal:define="mappers_all python:here.get_mappers_data(storage_report)">
+    <span tal:omit-tag=""
+          tal:repeat="mapper_type python:mappers_all.keys()">
+     <span tal:omit-tag=""
+           tal:condition="python:mapper_type == 'hard_drives'"
+           tal:define="mappers_data python:mappers_all[mapper_type]">
+      <div metal:use-macro="here/form-macros/macros/display-hard-drives"/>
+     </span>
+    </span>
+    <span tal:omit-tag=""
+          tal:repeat="mapper_type python:mappers_all.keys()">
+     <span tal:omit-tag=""
+           tal:condition="python:mapper_type != 'hard_drives'"
+           tal:define="mappers_data python:mappers_all[mapper_type]">
+      <div metal:use-macro="here/form-macros/macros/display-mappers-of-type"/>
+     </span>
+    </span>
+   </span>
+  </div>
+
+
+
+  <div metal:define-macro="display-mappers-of-type">
+      <h2 tal:content="python:mappers_data['pretty_type'] + 's'"/>
+      <span tal:condition="not: mappers_data/mappers">
+       No <span tal:replace="mappers_data/pretty_type"/>s exist on <span tal:replace="storagename"/>.
+       <br/>
+       Use link on the left to create new <span tal:replace="mappers_data/pretty_type"/>.
+      </span>
+      <ul class="tree"
+          tal:condition="mappers_data/mappers">
+       <span tal:repeat="mapper mappers_data/mappers">
+        <li tal:condition="mapper/pretty_name"
+            class="closed"><div metal:use-macro="here/form-macros/macros/li-collapse-handler"/>
+         <a tal:define="tmp_URL context/storage/index_html/absolute_url;
+                        URL python:tmp_URL + '?storagename=' + storagename + '&pagetype=52'"
+            tal:attributes="href python:URL + '&mapper_type=' + mapper['mapper_type'] + '&mapper_id=' + mapper['mapper_id']"
+            tal:content="mapper/pretty_name"></a>
+         <ul class="tree">
+          <li class="closed"><div metal:use-macro="here/form-macros/macros/li-collapse-handler"/>
+           <span tal:replace="mapper/pretty_type"/> Properties:
+           <ul class="tree">
+            <li>
+             <span tal:define="properties_span_id mapper/mapper_id"
+                   tal:attributes="id properties_span_id">
+              <div metal:use-macro="here/form-macros/macros/display-mapper"/>
+             </span>
+            </li>
+           </ul>
+          </li>
+          <li class="closed"><div metal:use-macro="here/form-macros/macros/li-collapse-handler"/>
+           <span tal:replace="mapper/pretty_targets_name"/>:
+           <ul class="tree">
+            <span tal:repeat="target mapper/targets">
+             <li class="closed"><div metal:use-macro="here/form-macros/macros/li-collapse-handler"/>
+              <a tal:define="tmp_URL context/storage/index_html/absolute_url;
+                             URL python:tmp_URL + '?storagename=' + storagename + '&pagetype=62'"
+                 tal:attributes="href python:URL + '&mapper_type=' + target['mapper_type'] + '&mapper_id=' + target['mapper_id'] + '&bd_path=' + target['path']"
+                 tal:content="target/pretty_name"/>
+              <span tal:content="target/description"/>
+              <ul class="tree">
+               <li tal:define="bd_data            target;
+                               prefix             python:mapper['mapper_id'] + '_target_' + bd_data['path'] + '_';
+                               properties_span_id python:prefix + 'properties_span_id'">
+                <span tal:attributes="id properties_span_id">
+                 <div metal:use-macro="here/form-macros/macros/display-BD"/>
+                </span>
+               </li>
+              </ul>
+             </li>
+            </span>
+           </ul>
+          </li>
+          <li class="closed"><div metal:use-macro="here/form-macros/macros/li-collapse-handler"/>
+           <span tal:replace="mapper/pretty_sources_name"/>:
+           <ul class="tree">
+            <span tal:repeat="source mapper/sources">
+             <li class="closed"><div metal:use-macro="here/form-macros/macros/li-collapse-handler"/>
+              <a tal:define="tmp_URL context/storage/index_html/absolute_url;
+                             URL python:tmp_URL + '?storagename=' + storagename + '&pagetype=62'"
+                 tal:attributes="href python:URL + '&mapper_type=' + source['mapper_type'] + '&mapper_id=' + source['mapper_id'] + '&bd_path=' + source['path']"
+                 tal:content="source/path"/>
+              <span tal:content="source/description"/>
+              <ul class="tree">
+               <li tal:define="bd_data            source;
+                               prefix             python:mapper['mapper_id'] + '_source_' + bd_data['path'] + '_';
+                               properties_span_id python:prefix + 'properties_span_id'">
+                <span tal:attributes="id properties_span_id">
+                 <div metal:use-macro="here/form-macros/macros/display-BD"/>
+                </span>
+               </li>
+              </ul>
+             </li>
+            </span>
+           </ul>
+          </li>
+         </ul>
+        </li>
+       </span>
+      </ul>
+  </div>
+
+
+  <div metal:define-macro="display-hard-drives">
+      <h2 tal:content="mappers_data/pretty_type"/>
+      <span tal:condition="not: mappers_data/mappers">
+       No <span tal:replace="mappers_data/pretty_type"/>s exist on <span tal:replace="storagename"/>.
+       <br/>
+       Use link on the left to create new <span tal:replace="mappers_data/pretty_type"/>.
+      </span>
+      <ul class="tree"
+          tal:condition="mappers_data/mappers">
+       <span tal:repeat="mapper mappers_data/mappers">
+            <span tal:repeat="target mapper/targets">
+             <li class="closed"><div metal:use-macro="here/form-macros/macros/li-collapse-handler"/>
+              <a tal:define="tmp_URL context/storage/index_html/absolute_url;
+                             URL python:tmp_URL + '?storagename=' + storagename + '&pagetype=62'"
+                 tal:attributes="href python:URL + '&mapper_type=' + target['mapper_type'] + '&mapper_id=' + target['mapper_id'] + '&bd_path=' + target['path']"
+                 tal:content="target/pretty_name"/>
+              <span tal:content="target/description"/>
+              <ul class="tree">
+               <li tal:define="bd_data            target;
+                               prefix             python:mapper['mapper_id'] + '_target_' + bd_data['path'] + '_';
+                               properties_span_id python:prefix + 'properties_span_id'">
+                <span tal:attributes="id properties_span_id">
+                 <div metal:use-macro="here/form-macros/macros/display-BD"/>
+                </span>
+               </li>
+              </ul>
+             </li>
+            </span>
+       </span>
+      </ul>
+  </div>
+
+
+
+  <div metal:define-macro="view-mapper-form">
+   <div metal:use-macro="here/form-macros/macros/content-scripts"/>
+   <div metal:use-macro="here/form-macros/macros/form-scripts"/>
+   <div metal:use-macro="here/form-macros/macros/single-visible-span"/>
+   <span tal:omit-tag="" 
+         tal:define="mapper             python:here.get_mapper_data(storage_report, request['mapper_id']);
+                     properties_span_id python:mapper['mapper_id'] + '_properties_span_id'">
+    <div align="center">
+     <h3>
+      <span tal:content="python:mapper['pretty_type'] + ' '"/>
+      <span style="cursor: pointer; text-decoration: underline"
+            tal:attributes="onclick python:'singleVisibleSpan(\'' + properties_span_id + '\', \'' + mapper['mapper_id'] + '\')'"
+            tal:content="mapper/pretty_name">
+       mapper name
+      </span>
+     </h3>
+    </div>
+    
+    
+    <input type="checkbox" 
+           id="graphics_checkbox_id"
+           checked=""
+           onchange="var s = (this.checked)?'graphical_view':'textual_view'; singleVisibleSpan('mappings_view', s);"/>
+     Graphical View
+    <span id="mappings_view">
+    
+    <div id="graphical_view" class="visible">
+     <iframe style="border: none;"
+             tal:attributes="src     python:'mappings_provider?storagename=' + storagename + '&mapper_id=' + mapper['mapper_id'];
+                             width   string:700px;
+                             height  string:180"></iframe>
+    </div>
+    
+    <div id="textual_view" class="invisible">
+    <br/>
+    <div>
+     <h3>
+      <span tal:omit-tag="" 
+            tal:define="targets mapper/targets_all">
+       <span tal:omit-tag="" 
+             tal:condition="python:len(targets) > 1"
+             tal:content="python:mapper['pretty_targets_name'] + ': '"/>
+       <span tal:omit-tag="" 
+             tal:condition="python:len(targets) == 1"
+             tal:content="python:mapper['pretty_target_name'] + ': '"/>
+       <span tal:omit-tag="" 
+             tal:repeat="t targets">
+        <span style="cursor: pointer; text-decoration: underline"
+              tal:attributes="onclick python:'singleVisibleSpan(\'' + properties_span_id + '\', \'' + t['path'] + '\')'"
+              tal:content="t/pretty_name">
+         target name
+        </span>
+       </span>
+      </span>
+     </h3>
+    </div>
+    <br/>
+    <div>
+     <h3>
+      <span tal:omit-tag="" 
+            tal:define="sources mapper/sources">
+       <span tal:omit-tag="" 
+             tal:condition="python: len(sources) > 1"
+             tal:content="python:mapper['pretty_sources_name'] + ': '"/>
+       <span tal:omit-tag="" 
+             tal:condition="python: len(sources) == 1"
+             tal:content="python:mapper['pretty_source_name'] + ': '"/>
+       <span tal:omit-tag="" 
+             tal:repeat="s sources">
+        <span style="cursor: pointer; text-decoration: underline"
+              tal:attributes="onclick python:'singleVisibleSpan(\'' + properties_span_id + '\', \'' + s['path'] + '\')'"
+              tal:content="s/pretty_name">
+         source name
+        </span>
+       </span>
+      </span>
+     </h3>
+    </div>
+    <br/>
+    </div>
+    
+    </span>  <!-- display -->
+    
+    
+    
+    
+    
+    <div tal:attributes="id properties_span_id"
+          style="width: 700px; height: 320px; overflow: auto; ">
+     <span id="warning_box"
+           style="position:absolute; visibility: hidden; border: medium double red; color: red; background-color: white; text-align: center; width: 350px; ">
+     </span>
+
+     <div tal:attributes="id    mapper/mapper_id;
+                          class string:visible">
+      <div metal:use-macro="here/form-macros/macros/display-mapper"/>
+     </div>
+     <span tal:omit-tag=""
+           tal:repeat="bd_data mapper/targets">
+      <div tal:attributes="id    bd_data/path;
+                            class string:invisible"> 
+       <div metal:use-macro="here/form-macros/macros/display-BD"/>
+      </div>
+     </span>
+     <span tal:omit-tag=""
+           tal:repeat="bd_data mapper/new_targets">
+      <div tal:attributes="id    bd_data/path;
+                            class string:invisible"> 
+       <div metal:use-macro="here/form-macros/macros/display-BD"/>
+      </div>
+     </span>
+     <span tal:omit-tag=""
+           tal:repeat="bd_data mapper/sources">
+      <div tal:attributes="id    bd_data/path;
+                           class string:invisible"> 
+       <div metal:use-macro="here/form-macros/macros/display-BD"/>
+      </div>
+     </span>
+    </div>
+   </span>
+  </div>
+
+
+
+  <div metal:define-macro="view-BDs-form">
+   <h2>BDs Form</h2>
+  </div>
+
+
+
+  <div metal:define-macro="view-BD-form">
+   <div metal:use-macro="here/form-macros/macros/content-scripts"/>
+   <div metal:use-macro="here/form-macros/macros/form-scripts"/>
+   <div metal:use-macro="here/form-macros/macros/single-visible-span"/>
+   <span tal:omit-tag="" 
+         tal:define="bd_data python:here.get_bd_data(storage_report, request['mapper_id'], request['bd_path']); 
+                     mapper python:here.get_mapper_data(storage_report, request['mapper_id'])">
+    <span tal:define="properties_span_id string:if seen in javascript error log -> FIXME">
+     <div metal:use-macro="here/form-macros/macros/display-BD"/>
+    </span>
+   </span>
+  </div>
+
+
+
+  <div metal:define-macro="create-mapper-form" 
+       tal:define="mapper                  python:here.get_mapper_template_data(storage_report, request['mapper_type']); 
+                   prefix                  python:'create_mapper_template_' + mapper['mapper_type'] + '_'; 
+                   properties_span_id      string:; 
+                   mapper_template_form_id python:prefix + 'mapper_template_form_id'; 
+                   create_mapper_button_id python:prefix + 'mapper_template_apply_button_id'">
+   <div metal:use-macro="here/form-macros/macros/forms-css"/>
+   <div metal:use-macro="here/form-macros/macros/form-scripts"/>
+   <form tal:attributes="id      mapper_template_form_id; 
+                         method  string:get">
+    <input tal:attributes="type  string:hidden; 
+                           name  string:pagetype; 
+                           value string:commit_changes"/>
+    <input tal:attributes="type  string:hidden; 
+                           name  string:object_type; 
+                           value string:mapper_template"/>
+    <input tal:attributes="type  string:hidden; 
+                           name  string:mapper_type; 
+                           value mapper/mapper_type"/>
+    <input tal:attributes="type  string:hidden; 
+                           name  string:mapper_id; 
+                           value python:''"/>
+    <input tal:attributes="type  string:hidden; 
+                           name  string:storagename; 
+                           value storagename"/>
+    <table class="form">
+     <caption>
+      <div align="left">
+       <h2>
+        New <span tal:replace="mapper/pretty_type"/>
+       </h2>
+      </div>
+     </caption>
+     <tr>
+      <th>
+       <div align="left">
+        
+       </div>
+      </th>
+      <th>
+       <div align="left">
+        <span tal:replace="mapper/pretty_type"/> Properties
+       </div>
+      </th>
+      <th>
+       <div align="left">
+        <span tal:replace="mapper/pretty_sources_name"/>
+       </div>
+      <th>
+     </tr>
+     <tr>
+      <td>
+       <table>
+        <tr>
+         <td>
+          icon
+         </td>
+        </tr>
+        <tr>
+         <td>
+          <table>
+
+          </table>
+         </td>
+        </tr>
+       </table>
+      </td>
+      <td>
+       <span tal:omit-tag="" 
+             tal:define="props mapper/props">
+        <div metal:use-macro="here/form-macros/macros/display-props"/>
+       </span>
+      </td>
+      <td>
+       <table>
+        <caption tal:condition="python:mapper['min_sources'] == mapper['max_sources']">
+         Select <span tal:replace="mapper/min_sources"/> <span tal:replace="mapper/pretty_source_name"/>
+        </caption>
+        <caption tal:condition="python:mapper['min_sources'] != mapper['max_sources']">
+         Select <span tal:replace="mapper/min_sources"/> to <span tal:replace="mapper/max_sources"/> <span tal:replace="mapper/pretty_sources_name"/>
+        </caption>
+        <span tal:omit-tag=""
+              tal:define="bds mapper/new_sources"
+              tal:repeat="bd bds">
+         <tr>
+          <td>
+           <table>
+            <tr>
+             <td>
+              <input tal:attributes="type string:checkbox; 
+                                     name python:'source_bd_' + bd['path']"/>
+             </td>
+             <td>
+              <span tal:replace="bd/path"/> (<span tal:replace="bd/props/size/value"/> <span tal:replace="bd/props/size/units"/> - <span tal:replace="bd/pretty_type"/>)
+             </td>
+            </tr>
+           </table>
+          </td>
+         </tr>
+        </span>
+       </table>
+      </td>
+     </tr>
+     <tr>
+      <td>
+       
+      </td>
+      <td>
+       
+      </td>
+      <td>
+       <div align="right">
+        <input type="button" 
+               name="action_type" 
+               value="Reset" 
+               onclick="return reset_form(this.form)"
+               class="form_button"/>
+        <input tal:define="prompt_msg    python:'Do you really want to create new ' + mapper['pretty_type'] + '?';
+                           validate_url  context/validate_html/absolute_url" 
+               tal:attributes="id      create_mapper_button_id; 
+                               type    string:button; 
+                               name    string:action_type; 
+                               value   string:Create; 
+                               onclick python:'return validate_and_submit_form(\'' + validate_url + '\', \'' + mapper_template_form_id + '\', \'' + create_mapper_button_id + '\', \'' + prompt_msg + '\')'"
+               class="form_button"/>
+       </div>
+      </td>
+     </tr>
+    </table>
+   </form>
+  </div>
+
+
+    
+
+
+
+    
+
+
+  <div tal:omit-tag="" metal:define-macro="display-props">
+   <span tal:omit-tag=""
+         tal:define="predefines_test python:'display-props: ' + str(props) + prefix + properties_span_id"/>
+   <table>
+    <span tal:omit-tag="" 
+          tal:repeat="p props">
+     <tr tal:define="prop python:props[p];
+                     prop_pr_name prop/pretty_name">
+      <td tal:content="prop_pr_name"/>
+      <td tal:define="prop_type prop/type;
+                      prop_units prop/units">
+       <table>
+        <tr>
+         <td>
+          <span tal:condition="python:prop_type == 'label'">
+           <span tal:omit-tag=""
+                 tal:condition="prop/replacements|nothing">
+            <input tal:attributes="type string:hidden;
+                                   name p;
+                                   value prop/value"/>
+            <select tal:define="repls prop/replacements;
+                                select_id python:prefix + '_select_replace_block_' + p"
+                    tal:attributes="id       select_id;
+                                    onfocus  python:'replace_properties_block__old_select_value = this.value';
+                                    onchange python:'replace_properties_block(\'' + properties_span_id + '\', \'' + select_id + '\')'">
+             <span tal:omit-tag="" 
+                   tal:repeat="repl_name repls/repl_names">
+              <option tal:attributes="value python:repls[repl_name]['path']"/><span tal:replace="repl_name"/>
+             </span>
+            </select>
+           </span>
+           <span tal:condition="not: prop/replacements|nothing"
+                 tal:replace="prop/value"/>
+          </span>
+
+
+
+          <input tal:condition="python:prop_type == 'text'"
+                 tal:attributes="name        p; 
+                                 type        string:text; 
+                                 value       prop/value;
+                                 onkeypress  python:'return validate_text_keypress(this, event, 2, \'' + prop['validation']['illegal_chars'] + '\', ' + str(prop['validation']['max_length']) + ')';
+                                 onblur      python:'validate_text(this, 2, \'' + prop['validation']['illegal_chars'] + '\', \'' + prop['validation']['reserved_words'] + '\', ' + str(prop['validation']['min_length']) + ', ' + str(prop['validation']['max_length']) + ')'"/>
+
+          <input tal:condition="python:prop_type == 'int'"
+                 tal:attributes="name   p; 
+                                 type   string:text; 
+                                 value  prop/value;
+                                 onblur python:'validate_int(this, 2, ' + str(prop['validation']['min']) + ', ' + str(prop['validation']['max']) + ', ' + str(prop['validation']['step']) + ')'"
+                 onkeypress="return validate_int_keypress(this, event, 2)"/>
+
+
+
+          <span tal:condition="python:prop_type == 'select'">
+           <select tal:define="prop_options prop/value"
+                   tal:attributes="name p">
+            <span tal:omit-tag="" 
+                  tal:repeat="prop_opt prop_options">
+             <option tal:attributes="value prop_opt"/><span tal:replace="prop_opt"/>
+            </span>
+           </select>
+          </span>
+         </td>
+         <td>
+          <span tal:replace="prop_units"/>
+         </td>
+        </tr>
+       </table>
+      </td>
+     </tr>
+    </span>
+   </table>
+  </div>
+
+
+
+
+  <div tal:omit-tag="" metal:define-macro="display-content">
+   <span tal:omit-tag=""
+         tal:define="predefines_test python:'display-content: ' + str(cont) + properties_span_id"/>
+   <span tal:omit-tag="" 
+         tal:define="props cont/props">
+     <div metal:use-macro="here/form-macros/macros/display-props"/>
+   </span>
+  </div>
+
+
+
+  <div tal:omit-tag="" metal:define-macro="content-scripts">
+   <script language="javascript" type="text/javascript">
+    
+    var replace_properties_block__old_select_value = ''
+    function replace_properties_block(parent_id, select_id) {
+       selem = document.getElementById(select_id);
+       child_id = selem.value;
+       selem.value = replace_properties_block__old_select_value;
+       singleVisibleSpan(parent_id, child_id);
+    }
+    
+    function change_content(select_content_id, content_span_id) {
+       content_id = document.getElementById(select_content_id).value;
+       singleVisibleSpan(content_span_id, content_id);
+    }
+    
+    function reset_bd_form(form, select_content_id, content_span_id) {
+       if (reset_form(form)) {
+          change_content(select_content_id, content_span_id);
+          return true;
+       }
+       return false;
+    }
+    
+   </script>
+  </div>
+
+
+
+<div tal:omit-tag="" metal:define-macro="form-scripts">
+ <style>
+   input                  { background-image: none; }
+   input.validation_error { border: medium double red; background-color: orange; }
+   input.selected         { border: thin solid orange; }
+   input.form_button      { background-color: #dee7ec; }
+ </style>
+ 
+ <script language="javascript" type="text/javascript">
+
+
+// validations
+
+function validate_text(elem, timeout, illegal_chars, reserved_words, min_length, max_length)
+{
+   var value = elem.value;
+   
+   for (var i=0; i<value.length; i++) {
+      if (illegal_chars.indexOf(value[i]) != -1) {
+         return;
+         elem.className = 'validation_error';
+         display_warning(elem, timeout, 'Illegal characters are: \'' + illegal_chars + '\'');
+         return;
+      }
+   }
+   
+   var res_list = reserved_words.split(';');
+   for (var i=0; i<res_list.length; i++) {
+      if (value == res_list[i] && value != '') {
+         return;
+         elem.className = 'validation_error';
+         display_warning(elem, timeout, 'Reserved words are: ' + res_list);
+         return;
+      }
+   }
+   
+   if (value.length < min_length) {
+      return;
+      elem.className = 'validation_error';
+      display_warning(elem, timeout, 'Minimum length is ' + min_length);
+      return;
+   }
+   
+   if (value.length > max_length) {
+      return;
+      elem.className = 'validation_error';
+      display_warning(elem, timeout, 'Maximum length is ' + max_length);
+      return;
+   }
+   
+   elem.className = '';
+}
+
+
+function validate_int(elem, timeout, min, max, step)
+{
+   var value = elem.value;
+   
+   for (var i=0; i<value.length; i++) {
+      if ('0123456789'.indexOf(value[i]) == -1) {
+         return;
+         elem.className = 'validation_error';
+         display_warning(elem, timeout, 'Only whole numbers are allowed');
+         return;
+      }
+   }
+   
+   value = ((value - 0) / step) * step;
+   
+   if (value < min) {
+      return;
+      elem.className = 'validation_error';
+      display_warning(elem, timeout, 'Minimum allowed value is ' + min);
+      return;
+   }
+   
+   if (value > max) {
+      return;
+      elem.className = 'validation_error';
+      display_warning(elem, timeout, 'Maximum allowed value is ' + max);
+      return;
+   }
+   
+   elem.className = '';
+}
+
+
+
+function validate_text_keypress(elem, event, timeout, illegal_chars, max_length)
+{
+   var ev = event;
+   if (!ev) ev = window.event;
+   var key = get_keycode(ev);
+   
+   if (key == 8 || key == 9) return true;
+   else if (ev.which) ;
+   else if (document.selection) ;
+   else return true;
+   
+   var ch = String.fromCharCode(key);
+   
+   if (illegal_chars.indexOf(ch) != -1) {
+//      display_warning(elem, timeout, 'Illegal characters are: \'' + illegal_chars + '\'');
+      return false;
+   }
+   
+   if (elem.value.length + 1 > max_length) {
+//      display_warning(elem, timeout, 'Maximum allowed length is ' + max_length);
+      return false;
+   }
+   
+   return true;
+}
+
+function validate_int_keypress(elem, event, timeout)
+{
+   var ev = event;
+   if (!ev) ev = window.event;
+   var key = get_keycode(ev);
+   
+   if (key == 8 || key == 9) return true;
+   else if (ev.which) ;
+   else if (document.selection) ;
+   else return true;
+   
+   var ch = String.fromCharCode(key);
+   
+   if ('0123456789'.indexOf(ch) == -1) {
+//      display_warning(elem, timeout, 'Only whole numbers are allowed');
+      return false;
+   }
+   
+   return true;
+}
+
+function get_keycode(ev)
+{
+    if (ev.keyCode)
+        return ev.keyCode;
+    else
+        return ev.which;
+}
+
+function display_warning(el, timeout, text)
+{
+    alert(text);
+    return;
+    
+    var geom_obj = getGeom(el);
+    
+    var warning_box = document.getElementById('warning_box');
+    if (!warning_box) {
+       alert(text);
+       return;
+    }
+    
+    warning_box.innerHTML = text;
+    /*
+    warning_box.style.position = 'absolute'
+    warning_box.style.left = geom_obj.x + '';
+    warning_box.style.top  = (geom_obj.y - 65) + '';
+    warning_box.style.display = 'inline';
+    */
+    warning_box.style.visibility = 'visible';
+    setTimeout("remove_warning()", (1000 * timeout));
+}
+
+function remove_warning()
+{
+    var warning_box = document.getElementById('warning_box');
+//    warning_box.style.display = 'none';
+    warning_box.style.visibility = 'hidden';
+}
+
+function getGeom(el)
+{
+   var object   = new Object();
+   
+   object.x     = el.offsetLeft;
+   object.y     = el.offsetTop;
+   var parent    = el.offsetParent;
+   object.width  = el.offsetWidth;
+   object.height = el.offsetHeight;
+   while(parent != null) {
+      object.x += parent.offsetLeft;
+      object.y += parent.offsetTop;
+      parent   = parent.offsetParent;
+   }
+   return object;
+}
+
+function reset_form(form) {
+   if (confirm('Do you really want to reset the form?')) {
+      form.reset();
+      for (i=0; i<form.length; i++)
+          form.elements[i].className = '';
+      return true;
+   }
+   return false;
+}
+    
+
+
+
+
+
+function strip_left(txt) {
+   for (i=0; i<txt.length; i++) {
+      if (txt[i] == " " || txt[i] == "\n")
+         continue;
+      return txt.substr(i);
+   }
+   return txt;
+}
+
+
+// Apply is button, other ones are submits
+
+var tmp_submit_URL = "";
+var tmp_button_id = "";
+var tmp_prompt_msg = "";
+var tmp_form_id = "";
+
+function validate_and_submit_form_callback() {
+  if (xmlHttp_object.readyState == 4) {
+    if (xmlHttp_object.status == 200) {
+        res = xmlHttp_object.responseText;
+        res = strip_left(res);
+        if (res.substr(0, 2) == "OK") {
+           if (confirm(tmp_prompt_msg)) {
+              URL = tmp_submit_URL + 'action_type=Apply';
+              tmp_submit_URL = "";
+              window.location.assign(URL);
+              return;
+           }
+        } else {
+           
+           // get elem_name & msg
+           var ind = res.indexOf(' ');
+           var elem_name = res.substr(0, ind);
+           var err_msg = strip_left(res.substr(ind));
+           
+           form = document.getElementById(tmp_form_id);
+           for (i=0; i<form.length; i++) {
+              elem = form.elements[i];
+              name = elem.name;
+              if (name == elem_name)
+                 elem.className = 'validation_error';
+           }
+           
+           alert(err_msg);
+        }
+    } else {
+        alert("Error retrieving data from server");
+    }
+    if (tmp_button_id != "")
+       document.getElementById(tmp_button_id).disabled = false;
+    tmp_button_id = "";
+  }
+}
+function validate_and_submit_form(validation_URL, form_id, button_id, prompt_msg) {
+   form = document.getElementById(form_id);
+   tmp_prompt_msg = prompt_msg;
+   tmp_form_id = form_id;
+   tmp_submit_URL = form.action + '?';
+   URL = validation_URL + '?';
+   for (i=0; i<form.length; i++) {
+      elem = form.elements[i];
+      name = elem.name;
+      value = elem.value;
+      if (name != 'action_type' && name != '') {
+         if (elem.type == 'checkbox') {
+            if (elem.checked)
+               value = 'on';
+            else
+               value = 'off';
+         }
+         URL += name + '=' + value + '&';
+         tmp_submit_URL += name + '=' + value + '&';
+      }
+   }
+   URL += 'action_type=Validate';
+   initiate_async_get(URL, validate_and_submit_form_callback);
+   tmp_button_id = button_id;
+   if (tmp_button_id != "")
+      document.getElementById(tmp_button_id).disabled = true;
+}
+
+    
+ </script>
+</div>
+
+
+<div tal:omit-tag="" metal:define-macro="single-visible-span">
+<!--
+   @media screen, print {
+    span.visible     { visibility: visible; }
+    span.invisible   { visibility: hidden; }
+    div.visible      { display: block; }
+    div.invisible    { height: 0px; width: 0px; overflow: hidden; }
+   }
+-->
+ <style type="text/css">
+   @media screen, print {
+    span.visible     { display: block; }
+    span.invisible   { display: none; }
+    div.visible      { display: block; }
+    div.invisible    { display: none; }
+   }
+ </style>
+ <script language="javascript" type="text/javascript">
+  function singleVisibleSpan(parent_id, child_id) {
+    parent = document.getElementById(parent_id);
+    for (var i=0; i < parent.childNodes.length; i++) {
+      var item = parent.childNodes[i];
+      if (item.nodeName == 'SPAN' || item.nodeName == 'span' || item.nodeName == 'DIV' || item.nodeName == 'div') {
+        if (item.id == child_id)
+          item.className = 'visible';
+        else if (item.className == 'visible')
+          item.className = 'invisible';
+      }
+    }
+  }
+ </script>
+</div>
+
+  <div metal:define-macro="display-BD">
+   <div metal:use-macro="here/form-macros/macros/forms-css"/>
+   <span tal:omit-tag=""
+         tal:define="predefines_test python:'display-BD: ' + str(bd_data) + storagename + properties_span_id"/>
+   <span tal:omit-tag="" 
+         tal:define="mapper                     string:;
+                     conts                      python:bd_data['contents'];
+                     prefix                     prefix|bd_data/path;
+                     prefix                     python:prefix + '_';
+                     bd_form_id                 python:prefix + 'bd_form';
+                     select_content_id          python:prefix + 'select_content_id';
+                     apply_button_id            python:prefix + 'apply_button_id';
+                     content_span_id            python:prefix + 'content_span_id'">
+    <form tal:attributes="id      bd_form_id;
+                          method  string:get">
+     <input tal:attributes="type  string:hidden; 
+                            name  string:pagetype; 
+                            value string:commit_changes"/>
+     <input tal:condition="not: bd_data/new" 
+            tal:attributes="type  string:hidden; 
+                            name  string:object_type;
+                            value string:bd"/>
+     <input tal:condition="bd_data/new" 
+            tal:attributes="type  string:hidden; 
+                            name  string:object_type;
+                            value string:bd_template"/>
+     <input tal:attributes="type  string:hidden;
+                            name  string:mapper_id;
+                            value bd_data/mapper_id"/>
+     <input tal:attributes="type  string:hidden; 
+                            name  string:mapper_type; 
+                            value bd_data/mapper_type"/>
+     <input tal:attributes="type  string:hidden; 
+                            name  string:bd_path; 
+                            value bd_data/path"/>
+     <input tal:attributes="type  string:hidden; 
+                            name  string:storagename; 
+                            value storagename"/>
+     <table class="form">
+      <caption>
+       <div align="left">
+        <h2>
+         <span tal:omit-tag=""
+               tal:condition="not: bd_data/new">
+          <span tal:replace="bd_data/pretty_type"/> '<span tal:replace="bd_data/pretty_name"/>' - <span tal:replace="bd_data/path"/>
+         </span>
+         <span tal:condition="bd_data/new" 
+               tal:replace="bd_data/pretty_type"/>
+        </h2>
+       </div>
+      </caption>
+      <tr>
+       <th>
+        <div align="left">
+         
+        </div>
+       </th>
+       <th>
+        <div align="left">
+         <span tal:replace="bd_data/pretty_type"/> Properties 
+        </div>
+       </th>
+       <th>
+        <div align="left">
+        <table tal:condition="conts">
+         <tr>
+          <td>
+           Content<span tal:condition="python:len(conts) == 1"
+                        tal:replace="string::"/>
+          </td>
+          <td>
+           <select tal:define="funct python:'change_content(\'' + select_content_id + '\', \'' + content_span_id + '\')'"
+                   tal:condition="python:len(conts) > 1" 
+                   tal:attributes="id       select_content_id; 
+                                   name     string:content_id; 
+                                   onchange funct">
+            <span tal:omit-tag="" 
+                  tal:repeat="cont conts">
+             <option tal:attributes="value cont/id"/><span tal:replace="cont/name"/>
+            </span>
+           </select>
+           <span tal:define="cont python:conts[0]"
+                 tal:condition="python:len(conts) == 1">
+            <input tal:attributes="id    select_content_id; 
+                                   type  string:hidden; 
+                                   name  string:content_id; 
+                                   value cont/id"/>
+            <span tal:replace="cont/name"/>
+           </span>
+          </td>
+         </tr>
+        </table>
+        </div>
+       </th>
+      </tr>
+      <tr>
+       <td>
+        <table>
+         <tr>
+          <td align="center">
+           <img tal:attributes="src bd_data/icon" 
+                style="width: 60px;"/>
+          </td>
+         </tr>
+         <tr>
+          <td align="center">
+           <table>
+            <span tal:omit-tag="" 
+                  tal:define="actions bd_data/actions" 
+                  tal:repeat="action actions">
+             <tr>
+              <td tal:define="act_name  action/name; 
+                              act_msg   action/msg; 
+                              act_link  action/link"
+                  align="center">
+               <span tal:condition="act_link">
+                <input tal:define="act_link    python:act_link + '&storagename=' + storagename; 
+                                   funct       python:'window.location.assign(\'' + act_link + '\')'"
+                       tal:attributes="type    string:button; 
+                                       name    string:action_type; 
+                                       value   act_name; 
+                                       onclick funct"
+                       class="form_button"/>
+               </span>
+               <span tal:condition="not: act_link">
+                <input tal:condition="act_msg" 
+                       tal:attributes="type    string:submit; 
+                                       name    string:action_type; 
+                                       value   act_name;
+                                       onclick python:'return confirm(\'' + act_msg + '\')'"
+                       class="form_button"/>
+                <input tal:condition="not: act_msg" 
+                       tal:attributes="type   string:submit; 
+                                       name   string:action_type; 
+                                       value  act_name"
+                       class="form_button"/>
+               </span>
+              </td>
+             </tr>
+            </span>
+           </table>
+          </td>
+         </tr>
+        </table>
+       </td>
+       <td>
+        <span tal:omit-tag="" 
+              tal:define="props bd_data/props">
+         <div metal:use-macro="here/form-macros/macros/display-props"/>
+        </span>
+       </td>
+       <td tal:condition="conts">
+        <span tal:attributes="id content_span_id">
+         <span tal:define="cont python:conts[0]"
+               tal:attributes="class string:visible;
+                               id cont/id">
+          <div metal:use-macro="here/form-macros/macros/display-content"/>
+         </span>
+         <span tal:omit-tag=""
+               tal:repeat="cont python:conts[1:]">
+          <span tal:attributes="class string:invisible;
+                                id cont/id">
+           <div metal:use-macro="here/form-macros/macros/display-content"/>
+          </span>
+         </span>
+        </span>
+       </td>
+      </tr>
+      <tr>
+       <td>
+        
+       </td>
+       <td>
+        
+       </td>
+       <td>
+        <div align="right"
+             tal:define="validate_url  context/validate_html/absolute_url">
+         <input tal:attributes="type    string:button; 
+                                name    string:action_type; 
+                                value   string:Reset; 
+                                onclick python:'return reset_bd_form(this.form, \'' + select_content_id + '\', \'' + content_span_id + '\')'"
+                class="form_button"/>
+         <input tal:condition="bd_data/new" 
+                tal:define="prompt_msg  python:'Do you really want to create ' + bd_data['pretty_type'] + '?'" 
+                tal:attributes="id      apply_button_id;
+                                type    string:button; 
+                                name    string:action_type; 
+                                value   string:Create; 
+                                onclick python:'return validate_and_submit_form(\'' + validate_url + '\', \'' + bd_form_id + '\', \'' + apply_button_id + '\', \'' + prompt_msg + '\')'"
+                class="form_button"/>
+         <input tal:condition="not: bd_data/new" 
+                tal:define="prompt_msg  python:'Do you really want to apply changes to ' + bd_data['pretty_type'] + ' \\\'' + bd_data['pretty_name'] + '\\\'?'" 
+                tal:attributes="id      apply_button_id; 
+                                type    string:button; 
+                                name    string:action_type; 
+                                value   string:Apply; 
+                                onclick python:'return validate_and_submit_form(\'' + validate_url + '\', \'' + bd_form_id + '\', \'' + apply_button_id + '\', \'' + prompt_msg + '\')'"
+                class="form_button"/>
+        </div>
+       </td>
+      </tr>
+     </table>
+    </form>
+   </span>
+  </div>
+
+
+
+
+  <div metal:define-macro="display-mapper">
+   <div metal:use-macro="here/form-macros/macros/forms-css"/>
+   <span tal:omit-tag=""
+         tal:define="predefines_test python:'display-mapper: ' + str(mapper) + storagename + properties_span_id"/>
+   <form tal:define="prefix                     prefix|mapper/mapper_id;
+                     prefix                     python:prefix + '_';
+                     mapper_form_id             python:prefix + 'mapper_form_id';
+                     apply_button_id            python:prefix + 'apply_button_id'"
+         tal:attributes="id     mapper_form_id;
+                         method string:get">
+    <input tal:attributes="type  string:hidden; 
+                           name  string:pagetype; 
+                           value string:commit_changes"/>
+    <input tal:attributes="type  string:hidden; 
+                           name  string:object_type; 
+                           value string:mapper"/>
+    <input tal:attributes="type  string:hidden; 
+                           name  string:mapper_id; 
+                           value mapper/mapper_id"/>
+    <input tal:attributes="type  string:hidden; 
+                           name  string:mapper_type; 
+                           value mapper/mapper_type"/>
+    <input tal:attributes="type  string:hidden; 
+                           name  string:storagename; 
+                           value storagename"/>
+    <table class="form">
+     <caption>
+      <div align="left">
+       <h2>
+        <span tal:replace="mapper/pretty_type"/> '<span tal:replace="mapper/pretty_name"/>'
+       </h2>
+      </div>
+     </caption>
+     <tr>
+      <th>
+       <div align="left">
+        
+       </div>
+      </th>
+      <th>
+       <div align="left">
+        <span tal:replace="mapper/pretty_type"/> Properties
+       </div>
+      <th>
+     </tr>
+     <tr>
+      <td>
+       <table>
+        <tr>
+         <td align="center">
+          <img tal:attributes="src mapper/icon" 
+               style="width: 60px;"/>
+         </td>
+        </tr>
+        <tr>
+         <td align="center">
+          <table>
+           <span tal:omit-tag="" 
+                 tal:define="actions mapper/actions" 
+                 tal:repeat="action actions">
+            <tr>
+             <td tal:define="act_name  action/name; 
+                             act_msg   action/msg; 
+                             act_link  action/link"
+                 align="center">
+              <span tal:condition="act_link">
+               <input tal:define="act_link    python:act_link + '&storagename=' + storagename; 
+                                  funct       python:'window.location.assign(\'' + act_link + '\')'"
+                      tal:attributes="type    string:button; 
+                                      name    string:action_type; 
+                                      value   act_name; 
+                                      onclick funct"
+                      class="form_button"/>
+              </span>
+              <span tal:condition="not: act_link">
+               <input tal:condition="act_msg" 
+                      tal:attributes="type    string:submit; 
+                                      name    string:action_type; 
+                                      value   act_name; 
+                                      onclick python:'return confirm(\'' + act_msg + '\')'"
+                      class="form_button"/>
+               <input tal:condition="not: act_msg" 
+                      tal:attributes="type   string:submit; 
+                                      name   string:action_type; 
+                                      value  act_name"
+                      class="form_button"/>
+              </span>
+             </td>
+            </tr>
+           </span>
+          </table>
+         </td>
+        </tr>
+       </table>
+      </td>
+      <td>
+       <span tal:omit-tag="" 
+             tal:define="props mapper/props">
+        <div metal:use-macro="here/form-macros/macros/display-props"/>
+       </span>
+      </td>
+     </tr>
+     <tr>
+      <td>
+       
+      </td>
+      <td>
+       <div align="right">
+        <input type="button"
+               name="action_type"
+               value="Reset"
+               onclick="return reset_form(this.form)"
+               class="form_button"/>
+        <input tal:define="prompt_msg    python:'Do you really want to apply changes to ' + mapper['pretty_type'] + ' \\\'' + mapper['pretty_name'] + '\\\'?';
+                           validate_url  context/validate_html/absolute_url" 
+               tal:attributes="id      apply_button_id; 
+                               type    string:button; 
+                               name    string:action_type; 
+                               value   string:Apply; 
+                               onclick python:'return validate_and_submit_form(\'' + validate_url + '\', \'' + mapper_form_id + '\', \'' + apply_button_id + '\', \'' + prompt_msg + '\')'"
+               class="form_button"/>
+       </div>
+      </td>
+     </tr>
+    </table>
+   </form>
+  </div>
+
+
+
+
+  </body>
+</html>
/cvs/cluster/conga/luci/storage/icon_bd_LV.png,v  -->  standard output
revision 1.1
Binary files /cvs/cluster/conga/luci/storage/icon_bd_LV.png and - differ
/cvs/cluster/conga/luci/storage/icon_bd_LV_snapshot.png,v  -->  standard output
revision 1.1
Binary files /cvs/cluster/conga/luci/storage/icon_bd_LV_snapshot.png and - differ
/cvs/cluster/conga/luci/storage/icon_bd_crypto.png,v  -->  standard output
revision 1.1
Binary files /cvs/cluster/conga/luci/storage/icon_bd_crypto.png and - differ
/cvs/cluster/conga/luci/storage/icon_bd_ide.png,v  -->  standard output
revision 1.1
Binary files /cvs/cluster/conga/luci/storage/icon_bd_ide.png and - differ
/cvs/cluster/conga/luci/storage/icon_bd_multipath.png,v  -->  standard output
revision 1.1
Binary files /cvs/cluster/conga/luci/storage/icon_bd_multipath.png and - differ
/cvs/cluster/conga/luci/storage/icon_bd_net.png,v  -->  standard output
revision 1.1
Binary files /cvs/cluster/conga/luci/storage/icon_bd_net.png and - differ
/cvs/cluster/conga/luci/storage/icon_bd_partition.png,v  -->  standard output
revision 1.1
Binary files /cvs/cluster/conga/luci/storage/icon_bd_partition.png and - differ
/cvs/cluster/conga/luci/storage/icon_bd_raid.png,v  -->  standard output
revision 1.1
Binary files /cvs/cluster/conga/luci/storage/icon_bd_raid.png and - differ
/cvs/cluster/conga/luci/storage/icon_bd_scsi.png,v  -->  standard output
revision 1.1
Binary files /cvs/cluster/conga/luci/storage/icon_bd_scsi.png and - differ
/cvs/cluster/conga/luci/storage/icon_mapper_PT.png,v  -->  standard output
revision 1.1
Binary files /cvs/cluster/conga/luci/storage/icon_mapper_PT.png and - differ
/cvs/cluster/conga/luci/storage/icon_mapper_VG.png,v  -->  standard output
revision 1.1
Binary files /cvs/cluster/conga/luci/storage/icon_mapper_VG.png and - differ
/cvs/cluster/conga/luci/storage/icon_mapper_crypto.png,v  -->  standard output
revision 1.1
Binary files /cvs/cluster/conga/luci/storage/icon_mapper_crypto.png and - differ
/cvs/cluster/conga/luci/storage/icon_mapper_multipath.png,v  -->  standard output
revision 1.1
Binary files /cvs/cluster/conga/luci/storage/icon_mapper_multipath.png and - differ
/cvs/cluster/conga/luci/storage/icon_mapper_raid.png,v  -->  standard output
revision 1.1
Binary files /cvs/cluster/conga/luci/storage/icon_mapper_raid.png and - differ
/cvs/cluster/conga/luci/storage/index_html,v  -->  standard output
revision 1.1
--- conga/luci/storage/index_html
+++ -	2006-06-30 17:00:11.754278000 +0000
@@ -0,0 +1,296 @@
+<metal:page define-macro="master"><metal:doctype define-slot="doctype"><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"></metal:doctype>
+<metal:block define-slot="top_slot" />
+<metal:block use-macro="here/global_defines/macros/defines" />
+
+<html xmlns="http://www.w3.org/1999/xhtml"
+      xml:lang="en"
+      lang="en"
+      tal:attributes="lang language;
+                      xml:lang language">
+
+  <head metal:use-macro="here/header/macros/html_header">
+
+
+                    
+  
+
+    <metal:fillbase fill-slot="base">
+      <metal:baseslot define-slot="base">
+        <base href="" tal:attributes="href here/renderBase" />
+      </metal:baseslot>
+    </metal:fillbase>
+
+    <metal:headslot fill-slot="head_slot"
+                    tal:define="lang language;
+                                charset site_properties/default_charset|string:utf-8">
+
+      <metal:cache use-macro="here/global_cache_settings/macros/cacheheaders">
+        Get the global cache headers located in global_cache_settings.
+      </metal:cache>
+
+      <metal:headslot define-slot="head_slot" />
+      <tal:comment replace="nothing"> A slot where you can insert elements in the header from a template </tal:comment>
+    </metal:headslot>
+
+    <metal:cssslot fill-slot="css_slot">
+      <tal:comment replace="nothing"> A slot where you can insert CSS in the header from a template </tal:comment>
+    
+  <style type="text/css"><!-- @import url(./clusterportlet.css); --></style>
+      <metal:cssslot define-slot="css_slot" />
+    </metal:cssslot>
+
+    <metal:javascriptslot fill-slot="javascript_head_slot">
+      <tal:comment replace="nothing"> A slot where you can insert javascript in the header from a template </tal:comment>
+      <metal:javascriptslot define-slot="javascript_head_slot">
+        
+
+
+
+
+
+<!--  async helper functions -->
+<script language="javascript" type="text/javascript">
+
+var xmlHttp_object = false;
+
+function initiate_async_get(url, funct) {
+  xmlHttp_object = false;
+
+  /*@cc_on @*/
+  /*@if (@_jscript_version >= 5)
+  try {
+    xmlHttp_object = new ActiveXObject("Msxml2.XMLHTTP");
+  } catch (e) {
+    try {
+      xmlHttp_object = new ActiveXObject("Microsoft.XMLHTTP");
+    } catch (e2) {
+      xmlHttp_object = false;
+    }
+  }
+  @end @*/
+
+  if (!xmlHttp_object && typeof XMLHttpRequest != 'undefined') {
+    xmlHttp_object = new XMLHttpRequest();
+  }
+
+  if (xmlHttp_object) {
+    xmlHttp_object.open("GET", url, true);
+    xmlHttp_object.onreadystatechange = funct;
+    xmlHttp_object.send(null);
+  } else {
+    alert("Unable to initiate async GET");
+  }
+}
+
+
+
+var span_to_replace = "";
+var replace_span_button_to_disable_id = "";
+
+function replace_span_content_callback() {
+  if (xmlHttp_object.readyState == 4) {
+    if (xmlHttp_object.status == 200) {
+        var response = xmlHttp_object.responseText;
+        document.getElementById(span_to_replace).innerHTML = response;
+    } else {
+        alert("Error retrieving data from server");
+    }
+    if (replace_span_button_to_disable_id != "")
+        document.getElementById(replace_span_button_to_disable_id).disabled = false;
+    replace_span_button_to_disable_id = '';
+  }
+}
+function replace_span_content(span_id, url, button_to_disable_id) {
+  span_to_replace = span_id;
+  replace_span_button_to_disable_id = button_to_disable_id;
+  initiate_async_get(url, replace_span_content_callback);
+  if (replace_span_button_to_disable_id != "")
+     document.getElementById(replace_span_button_to_disable_id).disabled = true;
+}
+
+</script>
+
+
+
+
+
+
+
+
+      </metal:javascriptslot>
+    </metal:javascriptslot>
+
+
+
+
+  </head>
+
+  <body tal:attributes="class here/getSectionFromURL;
+                        dir python:test(isRTL, 'rtl', 'ltr')">
+    <div id="visual-portal-wrapper">
+
+      <div id="portal-top" i18n:domain="plone">
+
+        <div id="portal-header">
+          <a class="hiddenStructure"
+             accesskey="2"
+             tal:attributes="href string:${request/ACTUAL_URL}#documentContent"
+             i18n:translate="label_skiptocontent">Skip to content.</a>
+
+          <a class="hiddenStructure"
+             accesskey="6"
+             tal:attributes="href string:${request/ACTUAL_URL}#portlet-navigation-tree"
+             i18n:translate="label_skiptonavigation">Skip to navigation</a>
+<!--
+             <div metal:use-macro="here/global_siteactions/macros/site_actions">
+               Site-wide actions (Contact, Sitemap, Help, Style Switcher etc)
+             </div>
+-->
+<!--
+             <div metal:use-macro="here/global_searchbox/macros/quick_search">
+               The quicksearch box, normally placed at the top right
+             </div>
+-->
+             <a metal:use-macro="here/main_logo/macros/main_portal_logo">
+               The portal logo, linked to the portal root
+             </a>
+<!--
+             <div metal:use-macro="here/global_skinswitcher/macros/skin_tabs">
+               The skin switcher tabs. Based on which role you have, you
+               get a selection of skins that you can switch between.
+             </div>
+-->
+             <div metal:use-macro="here/main_sections/macros/portal_tabs">
+               The global sections tabs. (Welcome, News etc)
+             </div>
+          </div>
+
+          <div metal:use-macro="here/main_personalbar/macros/personal_bar">
+             The personal bar. (log in, logout etc...)
+           </div>
+<!--
+           <div metal:use-macro="here/main_pathbar/macros/path_bar">
+             The breadcrumb navigation ("you are here")
+           </div>
+      </div>
+-->
+      <div class="visualClear"><!-- --></div>
+
+      <tal:comment replace="nothing">
+      The wrapper table. It contains the three columns. There's a table-less
+      alternative in the plone_tableless skin layer that you can use if you
+      prefer layouts that don't use tables.
+      </tal:comment> 
+      <span tal:omit-tag="" 
+            tal:define="global pagetype request/pagetype|nothing; 
+                        global storagename request/storagename|nothing"/>
+      <span tal:omit-tag=""
+            tal:condition="not: pagetype">
+       <span tal:omit-tag=""
+             tal:define="global pagetype python:'0'"/>
+      </span>
+      <span tal:omit-tag="" 
+            tal:define="stosystemss context/systems/storage/objectItems;
+                        global allowed_systems python:here.allowed_systems(user, stosystemss);
+                        global access_to_host_allowed python:here.access_to_host_allowed(storagename, allowed_systems)"/>
+      <span tal:omit-tag="" 
+            tal:define="global ricci          python:here.get_ricci_communicator(storagename, allowed_systems);
+                        global storage_report nothing"/>
+      <span tal:omit-tag=""
+            tal:condition="storagename"
+            tal:define="report_cached python:here.is_storage_report_cached(request.SESSION, storagename)">
+       <span tal:omit-tag=""
+             tal:condition="report_cached">
+        <span tal:omit-tag=""
+              tal:define="global storage_report python:here.get_storage_report(ricci, request.SESSION)"/>
+       </span>
+      </span>
+      
+      <table id="portal-columns">
+        <tbody>
+          <tr>
+            <tal:comment replace="nothing"> Start of the left column </tal:comment>
+            <td id="portal-column-one"
+                metal:define-slot="column_one_slot"
+                tal:condition="sl">
+              <div class="visualPadding">
+                <metal:portlets define-slot="portlets_one_slot">
+                  <metal:leftportlets use-macro="here/clu_portlet_fetcher/macros/left_column">
+                    This instruction gets the portlets (boxes) for the left column.
+                  </metal:leftportlets>
+                </metal:portlets>
+                 
+              </div>
+            </td>
+            <tal:comment replace="nothing"> End of the left column </tal:comment>
+
+            <tal:comment replace="nothing"> Start of main content block </tal:comment>
+            <td id="portal-column-content">
+              <metal:block define-slot="content">
+                <div id="content" metal:define-macro="content">
+                  <div class="documentContent" id="region-content">
+                    <a name="documentContent"></a>
+                    <metal:bodytext metal:define-slot="main" tal:content="nothing">
+                      Page body text
+                    </metal:bodytext>
+                    <span tal:omit-tag="" tal:condition="not: storagename">
+                      <h1>Choose a storage system to administer</h1>
+                    </span>
+                    <span tal:omit-tag="" tal:condition="storagename">
+                      <h1 tal:content="storagename"></h1>
+                    </span>
+                  </div>
+                </div>
+              </metal:block>
+              <metal:main-form-content use-macro="here/form-chooser/macros/main-form">
+                <h1>Future Site of Forms</h1>
+              </metal:main-form-content>
+            </td>
+            <tal:comment replace="nothing"> End of main content block </tal:comment>
+
+<!--
+            <tal:comment replace="nothing"> Start of right column </tal:comment>
+            <td id="portal-column-two"
+                metal:define-slot="column_two_slot"
+                tal:condition="sr">
+              <div class="visualPadding">
+                <metal:portlets define-slot="portlets_two_slot">
+                  <metal:rightportlets use-macro="here/portlets_fetcher/macros/right_column">
+                    This instruction gets the portlets (boxes) for the right column.
+                  </metal:rightportlets>
+                </metal:portlets>
+                 
+              </div>
+            </td>
+            <tal:comment replace="nothing"> End of the right column </tal:comment>
+-->
+          </tr>
+        </tbody>
+      </table>
+      <tal:comment replace="nothing"> end column wrapper </tal:comment>
+
+      <div class="visualClear"><!-- --></div>
+
+
+      <hr class="netscape4" />
+
+      <metal:block i18n:domain="plone">
+
+        <metal:footer use-macro="here/main_footer/macros/portal_footer">
+          Footer
+        </metal:footer>
+
+        <metal:colophon use-macro="here/colophon/macros/colophon">
+          The colophon area - contains details about the production of
+          the site. Typically "powered by" buttons, standards, tools used.
+        </metal:colophon>
+      </metal:block>
+
+    </div>
+
+
+
+
+</body>
+</html>
+</metal:page>
/cvs/cluster/conga/luci/storage/main_footer,v  -->  standard output
revision 1.1
--- conga/luci/storage/main_footer
+++ -	2006-06-30 17:00:11.833370000 +0000
@@ -0,0 +1,37 @@
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<body>
+<div id="portal-footer" metal:define-macro="portal_footer">
+
+<p>
+    <span i18n:translate="description_copyright" tal:omit-tag="">
+    The 
+    <span>
+        <a href="http://redhat.com">Conga™ Cluster and Storage Management System</a>
+    </span>
+    is Copyright
+    <acronym title="Copyright" i18n:name="copyright" i18n:attributes="title title_copyright;">©</acronym>
+    2000-<span i18n:name="current_year" 
+               tal:define="now modules/DateTime/DateTime" 
+               tal:content="now/year" />
+    by 
+    <span>
+        <a href="http://redhat.com/Conga">Red Hat, Luci, Ricci, </a>
+    </span>
+    et al.
+    </span>
+</p>
+
+<p>
+
+
+    <span i18n:translate="description_license">
+    Distributed under the 
+        <span i18n:name="license">
+            <a href="http://creativecommons.org/licenses/GPL/2.0/" i18n:translate="label_gnu_gpl_licence">GNU GPL license</a>
+        </span>.
+    </span>
+</p>
+
+</div>
+</body>
+</html>
\ No newline at end of file
/cvs/cluster/conga/luci/storage/main_logo,v  -->  standard output
revision 1.1
--- conga/luci/storage/main_logo
+++ -	2006-06-30 17:00:11.911094000 +0000
@@ -0,0 +1,15 @@
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"
+      i18n:domain="plone">
+
+<body>
+
+<!-- THE PORTAL LOGO DEFINITION -->
+<h1 id="main-portal-logo" metal:define-macro="main_portal_logo">
+    <a href="/" >
+        Luci
+    </a>
+</h1>
+
+
+</body>
+</html>
/cvs/cluster/conga/luci/storage/main_pathbar,v  -->  standard output
revision 1.1
--- conga/luci/storage/main_pathbar
+++ -	2006-06-30 17:00:11.989317000 +0000
@@ -0,0 +1,40 @@
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"
+      i18n:domain="plone">
+
+<body>
+
+<!-- THE PATHBAR (breadcrumbs) DEFINITION -->
+<div metal:define-macro="path_bar"
+     id="portal-breadcrumbs"
+     tal:define="breadcrumbs python:putils.createBreadCrumbs(here);
+                     portal_url portal_url|utool">
+
+    <span id="breadcrumbs-you-are-here" i18n:translate="you_are_here">You 
+are here:</span>
+    <a i18n:translate="tabs_home" tal:attributes="href python:portal_url">Home</a>
+    <span tal:condition="breadcrumbs" class="breadcrumbSeparator">
+        <tal:ltr condition="not: isRTL">→</tal:ltr> 
+        <tal:rtl condition="isRTL">←</tal:rtl> 
+    </span>
+    <span tal:repeat="crumb breadcrumbs"
+          tal:attributes="dir python:test(isRTL, 'rtl', 'ltr')">
+        <tal:last tal:define="is_last repeat/crumb/end">
+            <a href="#"
+               tal:omit-tag="not: crumb/absolute_url"
+               tal:condition="python:not is_last"
+               tal:attributes="href crumb/absolute_url"
+               tal:content="crumb/Title">
+                crumb
+            </a>
+            <span class="breadcrumbSeparator" tal:condition="not: is_last"> 
+                <tal:ltr condition="not: isRTL">→</tal:ltr> 
+                <tal:rtl condition="isRTL">←</tal:rtl> 
+            </span>
+            <span tal:condition="is_last"
+                  tal:content="crumb/Title">crumb</span>
+         </tal:last>
+    </span>
+
+</div>
+</body>
+</html>
/cvs/cluster/conga/luci/storage/main_personalbar,v  -->  standard output
revision 1.1
--- conga/luci/storage/main_personalbar
+++ -	2006-06-30 17:00:12.067083000 +0000
@@ -0,0 +1,44 @@
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"
+      i18n:domain="plone">
+
+<body>
+
+<!-- THE PERSONAL BAR DEFINITION -->
+
+<div metal:define-macro="personal_bar"
+      tal:define="display_actions python:user_actions[:-1]+global_actions+user_actions[-1:];
+                  getIconFor nocall:putils/getIconFor;"
+      tal:omit-tag="">
+
+<h5 class="hiddenStructure" i18n:translate="heading_personal_tools">Personal tools</h5>
+
+<ul id="portal-personaltools">
+    <li class="portalUser" 
+        tal:condition="not: isAnon"><a 
+        id="user-name"
+        tal:omit-tag="not: mtool/getHomeFolder"
+        tal:attributes="href string:${mtool/getHomeUrl}">
+        <span class="visualCaseSensitive"
+              tal:replace="user/getUserName">
+             John
+        </span>
+    </a></li>
+
+    <tal:actions tal:repeat="action python:here.getOrderedUserActions(keyed_actions=keyed_actions)">
+        <li tal:define="icon python:getIconFor(action['category'], action['id'], None);
+                        class_name string:actionicon-${action/category}-${action/id};
+                        class_name python:test(icon, class_name, nothing);"
+            tal:attributes="class class_name">
+            <a href=""
+               tal:attributes="href action/url;
+                               class python:test(icon, 'visualIconPadding', nothing);">
+               <tal:actionname i18n:translate="" tal:content="action/name">dummy</tal:actionname>
+            </a>
+        </li>
+    </tal:actions>
+
+</ul>
+</div>
+
+</body>
+</html>
/cvs/cluster/conga/luci/storage/main_sections,v  -->  standard output
revision 1.1
--- conga/luci/storage/main_sections
+++ -	2006-06-30 17:00:12.147204000 +0000
@@ -0,0 +1,27 @@
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"
+      i18n:domain="plone">
+
+<body>
+
+<!-- THE SECTION TABS DEFINITION -->
+<div metal:define-macro="portal_tabs"
+     tal:omit-tag=""
+     tal:define="tabs python:here.getTabs(request)">
+
+    <h5 class="hiddenStructure" i18n:translate="heading_sections">Sections</h5>
+
+    <ul id="portal-globalnav">
+       <tal:tabs tal:repeat="tab tabs">
+        <li tal:attributes="id string:portaltab-${tab/Title};
+                            class python:test(tab['isSelected'], 'selected', 'plain');">
+            <a href="" 
+               tal:content="tab/Title"
+               tal:attributes="href tab/Taburl;
+                               title tab/Description|nothing">
+            Tab Name
+            </a></li></tal:tabs>
+    </ul>
+</div>
+
+</body>
+</html>
/cvs/cluster/conga/luci/storage/mappings_macros,v  -->  standard output
revision 1.1
--- conga/luci/storage/mappings_macros
+++ -	2006-06-30 17:00:12.226430000 +0000
@@ -0,0 +1,133 @@
+<html>
+  <head>
+    <title tal:content="template/title">The title</title>
+  </head>
+  <body>
+    
+    <h2><span tal:replace="here/title_or_id">content title or id</span>
+        <span tal:condition="template/title"
+              tal:replace="template/title">optional template title</span></h2>
+
+    This is Page Template <em tal:content="template/id">template id</em>.
+  </body>
+ 
+
+ 
+ 
+
+
+
+
+  <div metal:define-macro="draw-base-cyl"
+       tal:define="cap   python:cyl['color'] + '_cap_40.png'">
+          
+    <div tal:omit-tag=""
+         tal:define="cyls       cyl/cyls;
+                     tmp        python:cyls.reverse()"
+         tal:repeat="subcyl cyls">
+     <div tal:define="beg        subcyl/beg;
+                      end        subcyl/end;
+                      id         subcyl/id;
+                      size       python:end - beg;
+                      right_end  python:subcyl['color'] + '_right_end_40.png';
+                      bar        python:subcyl['color'] + '_bar_40.png'"
+           tal:attributes="class   string:visible;
+                           id      id;
+                           style   python:here.add_commas('position:absolute', here.add_commas('left: ' + str(beg), 'top: 0'))">
+      <img tal:attributes="src     right_end;
+                           height  string:40;
+                           width   string:10;
+                           style   python:here.add_commas('position:absolute', here.add_commas('left: ' + str(size), 'top: 0'))"/>
+      <img tal:attributes="src     bar;
+                           height  string:40;
+                           width   python:str(size);
+                           style   python:here.add_commas('position:absolute', here.add_commas('left: ' + str(0), 'top: 0'))"/>
+     </div>
+    </div>
+    
+    <img tal:define="one_tmp_assignment  python:here.add_commas('position:absolute', here.add_commas('left: -' + str(curve_width), 'top: 0'))"
+         tal:attributes="src     cap;
+                         height  string:40;
+                         width   string:20;
+                         style   one_tmp_assignment"/>
+    
+  </div>
+
+
+
+  <div metal:define-macro="draw-highlights">
+    
+    <div tal:omit-tag=""
+         tal:repeat="high highs">
+     <div tal:define="beg  high/beg;
+                      end  high/end;
+                      size python:end - beg;
+                      id   high/id"
+           tal:attributes="class   string:invisible;
+                           id      id;
+                           style   python:here.add_commas('position:absolute', here.add_commas('left: ' + str(beg), 'top: 0'))">
+      <span tal:omit-tag=""
+            tal:condition="python:high['type'] == 'select'">
+       <div metal:use-macro="here/mappings_macros/macros/draw-select"/>
+      </span>
+      <span tal:omit-tag=""
+            tal:condition="python:high['type'] == 'snapshot'">
+       <div metal:use-macro="here/mappings_macros/macros/draw-snapshot"/>
+      </span>
+      <span tal:omit-tag=""
+            tal:condition="python:high['type'] == 'snapshot-origin'">
+       <div metal:use-macro="here/mappings_macros/macros/draw-snapshot-origin"/>
+      </span>
+     </div>
+    </div>
+    
+  </div>
+
+
+  <div metal:define-macro="draw-select">
+     <span tal:omit-tag=""
+           tal:condition="python:size > 0 and size < curve_width">
+      <span tal:repeat="off python:range(size)">
+       <img tal:attributes="src     string:selection_1px_40.png;
+                            height  string:40;
+                            style   python:here.add_commas('position:absolute', here.add_commas('left: ' + str(off), 'top: 0'))"/>
+      </span>
+     </span>
+     <span tal:omit-tag=""
+           tal:condition="python:size >= curve_width">
+      <img tal:attributes="src     string:selection_left_end_40.png;
+                           height  string:40;
+                           width   string:10;
+                           style   python:here.add_commas('position:absolute', here.add_commas('left: ' + str(0), 'top: 0'))"/>
+      <img tal:attributes="src     string:selection_bar_40.png;
+                           height  string:40;
+                           width   python:str(size - curve_width);
+                           style   python:here.add_commas('position:absolute', here.add_commas('left: ' + str(curve_width), 'top: 0'))"/>
+      <img tal:attributes="src     string:selection_right_end_40.png;
+                           height  string:40;
+                           width   string:10;
+                           style   python:here.add_commas('position:absolute', here.add_commas('left: ' + str(size), 'top: 0'))"/>
+     </span>
+  </div>
+
+  <div metal:define-macro="draw-snapshot">
+    <div style="height:40"></div>
+    <div tal:attributes="style  python:here.add_commas('position:absolute', 'left: ' + str(size/2-12))">
+     <img src="snapshot.gif" style="width: 25px; height: 20px;"/>
+    </div>
+  </div>
+
+  <div metal:define-macro="draw-snapshot-origin">
+<!--   <div style="position: absolute; top: -3">
+    <div style="border-top: medium dotted red; border-bottom: medium dotted red"> -->
+   <div>
+    <div style="border-bottom: medium dotted #0000FF">
+     <div tal:attributes="style python:here.add_commas('height: 40', 'width: ' + str(size))"></div>
+    </div>
+   </div>
+  </div>
+
+
+
+
+</html>
/cvs/cluster/conga/luci/storage/mappings_provider,v  -->  standard output
revision 1.1
--- conga/luci/storage/mappings_provider
+++ -	2006-06-30 17:00:12.305904000 +0000
@@ -0,0 +1,227 @@
+<html>
+
+<span tal:omit-tag="" 
+      tal:define="global pagetype request/pagetype|nothing; 
+                  global storagename request/storagename|nothing"/>
+<span tal:omit-tag=""
+      tal:condition="not: pagetype">
+ <span tal:omit-tag=""
+       tal:define="global pagetype python:'0'"/>
+</span>
+<span tal:omit-tag="" 
+      tal:define="stosystemss context/systems/storage/objectItems;
+                  global allowed_systems python:here.allowed_systems(user, stosystemss);
+                  global access_to_host_allowed python:here.access_to_host_allowed(storagename, allowed_systems)"/>
+<span tal:omit-tag="" 
+      tal:define="global ricci python:here.get_ricci_communicator(storagename, allowed_systems);
+                  global storage_report python:here.get_storage_report(ricci, request.SESSION)"/>
+
+<span tal:omit-tag=""
+      tal:define="global cyl_width    python:600;
+                  global X_offset     python:30;
+                  global Y_offset     python:30;
+                  global curve_width  python:10;
+                  global mapper       python:here.get_mapper_data(storage_report, request['mapper_id']);
+                  global mapp_info    python:here.get_mappings_info(mapper, cyl_width)"/>
+
+<head>
+   <title tal:content="mapper/pretty_name">The title</title>
+   
+   <script>
+      
+      function ellipse(y) {
+         if (y == 0)
+            return 2;
+         
+         if (y == 1)
+            return 3;
+         
+         if (y == 2)
+            return 4;
+         
+         if (y == 3)
+            return 5;
+         
+         if (y == 4)
+            return 5;
+         
+         if (y == 5)
+            return 6;
+         
+         if (y == 6)
+            return 6;
+         
+         if (y == 7)
+            return 7;
+         
+         if (y == 8)
+            return 7;
+         
+         if (y == 9)
+            return 7;
+         
+         if (y == 10)
+            return 8;
+         
+         if (y == 11)
+            return 8;
+         
+         if (y == 12)
+            return 8;
+         
+         if (y == 13)
+            return 8;
+         
+         if (y > 26)
+            return ellipse(40 - y);
+         
+         else
+            return 9;
+      }
+      
+      var properties_span_id = '';
+      var current_selection  = '';
+      
+      function select_subcyl(id, h_data) {
+         var old_selection = current_selection;
+         unselect_cyl(old_selection, h_data);
+         if (id == old_selection)
+            current_selection = h_data[0][0];
+         else
+            current_selection = id;
+         display_props(h_data);
+      }
+      function unselect_cyl(id, h_data) {
+         for (var i=0; i<h_data.length; i++) {
+            var t_id = h_data[i][0];
+            if (t_id == id) {
+               var list = h_data[i][1];
+               for (var j=0; j<list.length; j++) {
+                  var el = document.getElementById(list[j]);
+                  el.className = 'invisible';
+               }
+            }
+         }
+         current_selection = '';
+      }
+      function display_props(h_data) {
+         for (var i=0; i<h_data.length; i++) {
+            var id = h_data[i][0];
+            if (id == current_selection) {
+               var list = h_data[i][1];
+               for (var j=0; j<list.length; j++) {
+                  var el = document.getElementById(list[j]);
+                  el.className = 'visible';
+               }
+            }
+         }
+         parent = top.document.getElementById(properties_span_id);
+         for (var i=0; i < parent.childNodes.length; i++) {
+            var item = parent.childNodes[i];
+            if (item.nodeName == 'SPAN' || item.nodeName == 'span' || item.nodeName == 'DIV' || item.nodeName == 'div') {
+               if (item.id == current_selection)
+                  item.className = 'visible';
+               else if (item.className == 'visible')
+                  item.className = 'invisible';
+            }
+         }
+      }
+      
+      
+      
+      function cyl_click(X, Y, c_data, h_data) {
+         if (Y < 0 || Y > 40)
+            return;
+         var x = X - ellipse(Y);
+         var y = Y;
+         for (var i=0; i<c_data.length; i++) {
+            var elem = c_data[i];
+            var id = elem[0];
+            var beg  = elem[1][0];
+            var end  = elem[1][1];
+            if (x > beg && x < end)
+               select_subcyl(id, h_data);
+         }
+      }
+      
+   </script>
+
+   <style>
+      
+      div.visible    { visibility: visible; }
+      div.invisible  { visibility: hidden; }
+      
+   </style>
+
+
+</head>
+
+<body tal:define="onload_c   python:'properties_span_id = \'' + mapper['mapper_id'] + '_properties_span_id\'';
+                  onload_c   python:here.add_commas(onload_c, 'current_selection = \'' + mapp_info['mapper']['mapper_id'] + '\'');
+                  onload_c   python:here.add_commas(onload_c, 'display_props(' + mapp_info['js'] + ')')"
+      tal:attributes="onload onload_c">
+    
+    
+
+
+
+<span>
+   
+   <!-- upper cylinder -->
+   <div tal:define="cyl       mapp_info/upper_cyl;
+                    X_offset  python:X_offset + cyl['offset']"
+        tal:condition="cyl/cyls"
+        tal:attributes="style python:here.add_commas('position:absolute', here.add_commas('left: ' + str(X_offset), 'top: ' + str(Y_offset)))">
+    
+    <div tal:define="one_temp_assignment  python:here.add_commas('position:absolute', here.add_commas('left: ' + str(curve_width), 'top: 0'))"
+         tal:attributes="onmousedown  python:'cyl_click(event.clientX-' + str(curve_width) + '-' + str(X_offset) + ', event.clientY-' + str(Y_offset) + ', ' + cyl['js'] + ', ' + mapp_info['js'] + ')';
+                         style        python:here.add_commas('cursor: pointer', one_temp_assignment);
+                         id           string:upper_cylinder">
+     
+     <!-- base -->
+     <div metal:use-macro="here/mappings_macros/macros/draw-base-cyl"/>
+     
+     <!-- highlights -->
+     <span tal:omit-tag=""
+           tal:define="highs cyl/highs">
+      <div metal:use-macro="here/mappings_macros/macros/draw-highlights"/>
+     </span>
+     
+     
+    </div>
+   </div>
+ 
+
+   <!-- lower cylinder -->
+   <div tal:define="cyl             mapp_info/lower_cyl;
+                    lower_Y_offset  python:Y_offset + 80;
+                    X_offset        python:X_offset + cyl['offset']"
+        tal:condition="cyl/cyls"
+        tal:attributes="style python:here.add_commas('position:absolute', here.add_commas('left: ' + str(X_offset), 'top: ' + str(lower_Y_offset)))">
+    
+    <div tal:define="one_temp_assignment  python:here.add_commas('position:absolute', here.add_commas('left: ' + str(curve_width), 'top: 0'))"
+         tal:attributes="onmousedown  python:'cyl_click(event.clientX-' + str(curve_width) + '-' + str(X_offset) + ', event.clientY-' + str(lower_Y_offset) + ', ' + cyl['js'] + ', ' + mapp_info['js'] + ')'; 
+                         style        python:here.add_commas('cursor: pointer', one_temp_assignment);
+                         id           string:lower_cylinder">
+     
+     <!-- base -->
+     <div metal:use-macro="here/mappings_macros/macros/draw-base-cyl"/>
+     
+     <!-- highlights -->
+     <span tal:omit-tag=""
+           tal:define="highs cyl/highs">
+      <div metal:use-macro="here/mappings_macros/macros/draw-highlights"/>
+     </span>
+     
+     
+    </div>
+   </div>
+ 
+
+</span>
+
+
+
+
+  </body>
+</html>
/cvs/cluster/conga/luci/storage/portlet_cluconfig,v  -->  standard output
revision 1.1
--- conga/luci/storage/portlet_cluconfig
+++ -	2006-06-30 17:00:12.386487000 +0000
@@ -0,0 +1,60 @@
+<html xmlns:tal="http://xml.zope.org/namespaces/tal"
+      xmlns:metal="http://xml.zope.org/namespaces/metal">
+
+<body>
+
+
+<div metal:define-macro="stochooseportlet"   
+       tal:omit-tag=""
+       tal:define="global data python:here.createStorageChooser(request, stosystems)">
+ <dl class="portlet" id="portlet-cluconfig-tree">
+    <dt class="portletHeader">
+        <a href="#">
+          storage
+        </a>
+    </dt>
+    <dd class="portletItemSingle">
+        <ul class="portletCluConfigTree cluConfigTreeLevel0">
+            <tal:clucfgtree define=" level python:1;
+                                     children python:data.get('children',[]);
+                                     show_children python:True;
+                                     isNaviTree python:False;">
+                <metal:main metal:use-macro="here/portlet_cluconfig_macro/macros/cluconfig_main" />
+            </tal:clucfgtree>
+        </ul>
+    </dd>
+ </dl>
+</div>
+
+
+<div metal:define-macro="stoconfigportlet"
+       tal:omit-tag=""
+       tal:define="global data python:here.createStorageConfigTree(request, storage_report)">
+ <dl class="portlet" id="portlet-cluconfig-tree">
+    <dt class="portletHeader">
+<!--
+        <a href="#" tal:attributes="href python:here.getClusterURL(request, modelb)">
+          <div tal:omit-tag="" tal:content="python: here.getClusterName(modelb)" /> 
+        </a>
+-->
+        <a href="#" tal:attributes="href python:here.getStorageURL(request, storagename)">
+          <div tal:omit-tag="" tal:content="storagename" /> 
+        </a>
+    </dt>
+    <dd class="portletItemSingle">
+        <ul class="portletCluConfigTree cluConfigTreeLevel0">
+
+            <tal:clucfgtree define=" level python:1;
+                                     children python:data.get('children',[]);
+                                     show_children python:True;
+                                     isNaviTree python:False;">
+                <metal:main metal:use-macro="here/portlet_cluconfig_macro/macros/cluconfig_main" />
+            </tal:clucfgtree>
+        </ul>
+    </dd>
+ </dl>
+</div>
+
+
+</body>
+</html>
/cvs/cluster/conga/luci/storage/portlet_cluconfig_macro,v  -->  standard output
revision 1.1
--- conga/luci/storage/portlet_cluconfig_macro
+++ -	2006-06-30 17:00:12.469267000 +0000
@@ -0,0 +1,41 @@
+<html>
+<body>
+<metal:main define-macro="cluconfig_main">
+<tal:cfgitem repeat="item children">
+<li class="cluConfigTreeItem visualNoMarker"
+    tal:define="parent_shows_children show_children|nothing;
+                children item/children|nothing;
+                cur_item item/currentItem;"
+    tal:condition="python: (cur_item or parent_shows_children or children)">
+
+   <tal:level define="item_type_class python: 'type-' + item['cfg_type'];"> 
+    <div tal:attributes="class item_type_class">
+        <a tal:condition="cur_item"
+           tal:attributes="href item/absolute_url;
+                           title item/Description|nothing;
+                           class string: cluConfigTreeCurrentItem visualIconPadding"
+            tal:content="item/Title|nothing">
+            Selected Item Title</a>
+        <tal:children condition="python: parent_shows_children or children">
+        <a tal:condition="not: cur_item"
+           tal:attributes="href item/absolute_url;
+                           title item/Description|nothing;
+                           class string: visualIconPadding;"
+            tal:content="item/Title|nothing">
+            Unselected Item Title</a>
+        </tal:children>
+    </div>
+
+    <ul tal:attributes="class python:'cluConfigTree cluConfigTreeLevel'+str(level)"
+        tal:define="show_children item/show_children| python:True;
+                    level python:level+1;"
+        tal:condition="python: (show_children or isNaviTree) and children">
+        <metal:recurse use-macro="here/portlet_cluconfig_macro/macros/cluconfig_main"/>
+    </ul>
+    </tal:level>
+</li>
+</tal:cfgitem>
+</metal:main>
+</body>
+</html>
+
/cvs/cluster/conga/luci/storage/red_bar_40.png,v  -->  standard output
revision 1.1
Binary files /cvs/cluster/conga/luci/storage/red_bar_40.png and - differ
/cvs/cluster/conga/luci/storage/red_cap_40.png,v  -->  standard output
revision 1.1
Binary files /cvs/cluster/conga/luci/storage/red_cap_40.png and - differ
/cvs/cluster/conga/luci/storage/red_right_end_40.png,v  -->  standard output
revision 1.1
Binary files /cvs/cluster/conga/luci/storage/red_right_end_40.png and - differ
/cvs/cluster/conga/luci/storage/selection_1px_40.png,v  -->  standard output
revision 1.1
Binary files /cvs/cluster/conga/luci/storage/selection_1px_40.png and - differ
/cvs/cluster/conga/luci/storage/selection_bar_40.png,v  -->  standard output
revision 1.1
Binary files /cvs/cluster/conga/luci/storage/selection_bar_40.png and - differ
/cvs/cluster/conga/luci/storage/selection_left_end_40.png,v  -->  standard output
revision 1.1
Binary files /cvs/cluster/conga/luci/storage/selection_left_end_40.png and - differ
/cvs/cluster/conga/luci/storage/selection_right_end_40.png,v  -->  standard output
revision 1.1
Binary files /cvs/cluster/conga/luci/storage/selection_right_end_40.png and - differ
/cvs/cluster/conga/luci/storage/snapshot.gif,v  -->  standard output
revision 1.1
Binary files /cvs/cluster/conga/luci/storage/snapshot.gif and - differ
/cvs/cluster/conga/luci/storage/tree_bullet.gif,v  -->  standard output
revision 1.1
Binary files /cvs/cluster/conga/luci/storage/tree_bullet.gif and - differ
/cvs/cluster/conga/luci/storage/tree_closed.gif,v  -->  standard output
revision 1.1
Binary files /cvs/cluster/conga/luci/storage/tree_closed.gif and - differ
/cvs/cluster/conga/luci/storage/tree_opened.gif,v  -->  standard output
revision 1.1
Binary files /cvs/cluster/conga/luci/storage/tree_opened.gif and - differ
/cvs/cluster/conga/luci/storage/tree_transparent.gif,v  -->  standard output
revision 1.1
Binary files /cvs/cluster/conga/luci/storage/tree_transparent.gif and - differ
/cvs/cluster/conga/luci/storage/validate_html,v  -->  standard output
revision 1.1
--- conga/luci/storage/validate_html
+++ -	2006-06-30 17:00:13.817189000 +0000
@@ -0,0 +1,35 @@
+<span tal:omit-tag="" 
+      tal:define="global pagetype request/pagetype|nothing; 
+                  global storagename request/storagename|nothing"/>
+<span tal:omit-tag="" 
+      tal:define="stosystemss context/systems/storage/objectItems; 
+                  global allowed_systems python:here.allowed_systems(user, stosystemss); 
+                  global access_to_host_allowed python:here.access_to_host_allowed(storagename, allowed_systems)"/>
+<span tal:omit-tag="" 
+      tal:define="global ricci python:here.get_ricci_communicator(storagename, allowed_systems); 
+                  global storage_report python:here.get_storage_report(ricci, request.SESSION)"/>
+
+<span tal:omit-tag="" 
+      tal:define="global action_type request/action_type|nothing"/>
+
+
+<span tal:omit-tag=""
+      tal:condition="not: access_to_host_allowed">
+ widget_name You are not authorized to modify <span tal:replace="storagename"/>!!!
+</span>
+
+<span tal:omit-tag=""
+      tal:condition="access_to_host_allowed">
+ <span tal:omit-tag=""
+       tal:condition="python:action_type == 'Validate'"
+       tal:content="python:here.validate(storage_report, request)">
+  Validation result:
+   OK if validated
+   message if not validated
+ </span>
+ 
+ <span tal:omit-tag="" 
+       tal:condition="python:action_type != 'Validate'">
+  This form is to be used for validation only
+ </span>
+</span>




More information about the Cluster-devel mailing list