diff --git a/.classpath b/.classpath
new file mode 100644
index 0000000..4f3c16e
--- /dev/null
+++ b/.classpath
@@ -0,0 +1,36 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/.project b/.project
new file mode 100644
index 0000000..8c43a1c
--- /dev/null
+++ b/.project
@@ -0,0 +1,59 @@
+
+
+ vre-deploy
+ vre-deploy project
+
+
+
+
+ org.eclipse.wst.jsdt.core.javascriptValidator
+
+
+
+
+ org.eclipse.wst.common.project.facet.core.builder
+
+
+
+
+ org.eclipse.jdt.core.javabuilder
+
+
+
+
+ org.eclipse.wst.validation.validationbuilder
+
+
+
+
+ org.maven.ide.eclipse.maven2Builder
+
+
+
+
+ com.google.gdt.eclipse.core.webAppProjectValidator
+
+
+
+
+ com.google.gwt.eclipse.core.gwtProjectValidator
+
+
+
+
+ org.eclipse.m2e.core.maven2Builder
+
+
+
+
+
+ org.eclipse.m2e.core.maven2Nature
+ org.eclipse.jem.workbench.JavaEMFNature
+ org.eclipse.wst.common.modulecore.ModuleCoreNature
+ org.maven.ide.eclipse.maven2Nature
+ org.eclipse.jdt.core.javanature
+ org.eclipse.wst.common.project.facet.core.nature
+ org.eclipse.wst.jsdt.core.jsNature
+ com.google.gwt.eclipse.core.gwtNature
+
+
diff --git a/.settings/.jsdtscope b/.settings/.jsdtscope
new file mode 100644
index 0000000..ba3c245
--- /dev/null
+++ b/.settings/.jsdtscope
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/.settings/com.google.appengine.eclipse.core.prefs b/.settings/com.google.appengine.eclipse.core.prefs
new file mode 100644
index 0000000..a60576c
--- /dev/null
+++ b/.settings/com.google.appengine.eclipse.core.prefs
@@ -0,0 +1,3 @@
+#Thu Jun 16 10:18:26 CEST 2011
+eclipse.preferences.version=1
+filesCopiedToWebInfLib=
diff --git a/.settings/com.google.gdt.eclipse.core.prefs b/.settings/com.google.gdt.eclipse.core.prefs
new file mode 100644
index 0000000..1c85126
--- /dev/null
+++ b/.settings/com.google.gdt.eclipse.core.prefs
@@ -0,0 +1,5 @@
+eclipse.preferences.version=1
+jarsExcludedFromWebInfLib=
+lastWarOutDir=/Users/massi/Documents/workspace/vre-deploy/target/vre-deploy-3.0.0-SNAPSHOT
+warSrcDir=src/main/webapp
+warSrcDirIsOutput=false
diff --git a/.settings/com.google.gwt.eclipse.core.prefs b/.settings/com.google.gwt.eclipse.core.prefs
new file mode 100644
index 0000000..c803c44
--- /dev/null
+++ b/.settings/com.google.gwt.eclipse.core.prefs
@@ -0,0 +1,5 @@
+#Thu Jun 16 11:14:17 CEST 2011
+eclipse.preferences.version=1
+entryPointModules=
+filesCopiedToWebInfLib=gwt-servlet.jar
+gwtCompileSettings=PGd3dC1jb21waWxlLXNldHRpbmdzPjxsb2ctbGV2ZWw+SU5GTzwvbG9nLWxldmVsPjxvdXRwdXQtc3R5bGU+T0JGVVNDQVRFRDwvb3V0cHV0LXN0eWxlPjxleHRyYS1hcmdzPjwhW0NEQVRBWy13YXIgc3JjL21haW4vd2ViYXBwXV0+PC9leHRyYS1hcmdzPjx2bS1hcmdzPjwhW0NEQVRBWy1YbXg1MTJtXV0+PC92bS1hcmdzPjxlbnRyeS1wb2ludC1tb2R1bGU+Y29tLmNvbXBhbnkuU29tZU1vZHVsZTwvZW50cnktcG9pbnQtbW9kdWxlPjwvZ3d0LWNvbXBpbGUtc2V0dGluZ3M+
diff --git a/.settings/org.eclipse.core.resources.prefs b/.settings/org.eclipse.core.resources.prefs
new file mode 100644
index 0000000..e8e1348
--- /dev/null
+++ b/.settings/org.eclipse.core.resources.prefs
@@ -0,0 +1,7 @@
+#Tue Jun 25 15:13:42 CEST 2013
+eclipse.preferences.version=1
+encoding//src/main/java=UTF-8
+encoding//src/main/resources=UTF-8
+encoding//src/test/java=UTF-8
+encoding//src/test/resources=UTF-8
+encoding/=UTF-8
diff --git a/.settings/org.eclipse.jdt.core.prefs b/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..be6acaa
--- /dev/null
+++ b/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,9 @@
+#Tue Jun 25 15:18:53 CEST 2013
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6
+org.eclipse.jdt.core.compiler.compliance=1.6
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning
+org.eclipse.jdt.core.compiler.source=1.6
diff --git a/.settings/org.eclipse.m2e.core.prefs b/.settings/org.eclipse.m2e.core.prefs
new file mode 100644
index 0000000..b985b1c
--- /dev/null
+++ b/.settings/org.eclipse.m2e.core.prefs
@@ -0,0 +1,5 @@
+#Tue Jun 25 15:13:41 CEST 2013
+activeProfiles=
+eclipse.preferences.version=1
+resolveWorkspaceProjects=true
+version=1
diff --git a/.settings/org.eclipse.wst.common.component b/.settings/org.eclipse.wst.common.component
new file mode 100644
index 0000000..d3c898c
--- /dev/null
+++ b/.settings/org.eclipse.wst.common.component
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/.settings/org.eclipse.wst.common.project.facet.core.xml b/.settings/org.eclipse.wst.common.project.facet.core.xml
new file mode 100644
index 0000000..7895606
--- /dev/null
+++ b/.settings/org.eclipse.wst.common.project.facet.core.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
diff --git a/.settings/org.eclipse.wst.jsdt.ui.superType.container b/.settings/org.eclipse.wst.jsdt.ui.superType.container
new file mode 100644
index 0000000..3bd5d0a
--- /dev/null
+++ b/.settings/org.eclipse.wst.jsdt.ui.superType.container
@@ -0,0 +1 @@
+org.eclipse.wst.jsdt.launching.baseBrowserLibrary
\ No newline at end of file
diff --git a/.settings/org.eclipse.wst.validation.prefs b/.settings/org.eclipse.wst.validation.prefs
new file mode 100644
index 0000000..04cad8c
--- /dev/null
+++ b/.settings/org.eclipse.wst.validation.prefs
@@ -0,0 +1,2 @@
+disabled=06target
+eclipse.preferences.version=1
diff --git a/.settings/org.maven.ide.eclipse.prefs b/.settings/org.maven.ide.eclipse.prefs
new file mode 100644
index 0000000..c74c58e
--- /dev/null
+++ b/.settings/org.maven.ide.eclipse.prefs
@@ -0,0 +1,9 @@
+#Thu Sep 02 10:42:12 CEST 2010
+activeProfiles=
+eclipse.preferences.version=1
+fullBuildGoals=process-test-resources
+includeModules=false
+resolveWorkspaceProjects=true
+resourceFilterGoals=process-resources resources\:testResources
+skipCompilerPlugin=true
+version=1
diff --git a/VredeployerTest-dev.launch b/VredeployerTest-dev.launch
new file mode 100644
index 0000000..24ae422
--- /dev/null
+++ b/VredeployerTest-dev.launch
@@ -0,0 +1,22 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/VredeployerTest-prod.launch b/VredeployerTest-prod.launch
new file mode 100644
index 0000000..fb99729
--- /dev/null
+++ b/VredeployerTest-prod.launch
@@ -0,0 +1,22 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pom.xml b/pom.xml
new file mode 100644
index 0000000..7012ae4
--- /dev/null
+++ b/pom.xml
@@ -0,0 +1,231 @@
+
+
+
+ 4.0.0
+
+ maven-parent
+ org.gcube.tools
+ 1.0.0
+
+
+ org.gcube.portlets.admin
+ vre-deploy
+ war
+ 3.0.0-SNAPSHOT
+ gCube VRE Deploy Wizard Portlet
+
+ gCube VRE Deploy Wizard Portlet.
+
+
+ scm:svn:http://svn.d4science.research-infrastructures.eu/gcube/trunk/portlets/admin/${project.artifactId}
+ scm:https://svn.d4science.research-infrastructures.eu/gcube/trunk/portlets/admin/${project.artifactId}
+ http://svn.d4science.research-infrastructures.eu/gcube/trunk/portlets/admin/${project.artifactId}
+
+
+
+ 2.5.1
+ distro
+
+ 1.6
+ 1.6
+ ${project.build.directory}/${project.build.finalName}
+
+ UTF-8
+ UTF-8
+
+
+
+
+ org.gcube.distribution
+ maven-portal-bom
+ LATEST
+ pom
+ import
+
+
+
+
+
+
+ xerces
+ xercesImpl
+ 2.9.1
+ provided
+
+
+ com.google.gwt
+ gwt-user
+ provided
+
+
+ org.gcube.applicationsupportlayer
+ aslcore
+ provided
+
+
+ org.gcube.applicationsupportlayer
+ aslvre
+ [5.0.0-SNAPSHOT, 6.0.0-SNAPSHOT)
+
+
+ org.gcube.portlets.user
+ gcube-widgets
+ provided
+
+
+ org.gcube.portal
+ custom-portal-handler
+ provided
+
+
+ org.gcube.core
+ common-scope-maps
+ [1.0.0-SNAPSHOT, 2.0.0-SNAPSHOT)
+
+
+ org.gcube.vremanagement
+ vremodeler-client-library
+ [1.0.0-SNAPSHOT, 2.0.0-SNAPSHOT)
+ provided
+
+
+
+ com.sencha.gxt
+ gxt
+ 2.2.5
+ provided
+
+
+ org.gcube.dvos
+ usermanagement-core
+ provided
+
+
+ com.liferay.portal
+ portal-service
+ 6.0.6
+ provided
+
+
+ javax.portlet
+ portlet-api
+ provided
+
+
+ log4j
+ log4j
+
+
+ org.slf4j
+ slf4j-log4j12
+
+
+ org.slf4j
+ slf4j-api
+
+
+
+
+
+ ${webappDirectory}/WEB-INF/classes
+
+
+
+
+ org.codehaus.mojo
+ gwt-maven-plugin
+ ${gwtVersion}
+
+
+
+ compile
+
+
+
+
+
+
+ VREDefinition.html
+ ${webappDirectory}
+
+
+
+
+ org.apache.maven.plugins
+ maven-war-plugin
+ 2.1.1
+
+
+ compile
+
+ exploded
+
+
+
+
+ ${webappDirectory}
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+ 2.3.2
+
+ 1.6
+ 1.6
+
+
+
+
+ org.apache.maven.plugins
+ maven-assembly-plugin
+ 2.2
+
+
+ ${distroDirectory}/descriptor.xml
+
+
+
+
+ servicearchive
+ install
+
+ single
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-resources-plugin
+ 2.5
+
+
+ copy-profile
+ install
+
+ copy-resources
+
+
+ target
+
+
+ ${distroDirectory}
+ true
+
+ profile.xml
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/main/java/org/gcube/portlets/admin/vredeployer/client/VREDeployerConstants.java b/src/main/java/org/gcube/portlets/admin/vredeployer/client/VREDeployerConstants.java
new file mode 100644
index 0000000..d8b408c
--- /dev/null
+++ b/src/main/java/org/gcube/portlets/admin/vredeployer/client/VREDeployerConstants.java
@@ -0,0 +1,12 @@
+package org.gcube.portlets.admin.vredeployer.client;
+
+
+import org.gcube.portlets.admin.vredeployer.client.icons.VreIcons;
+
+import com.google.gwt.core.client.GWT;
+
+public class VREDeployerConstants {
+ public static final VreIcons ICONS = GWT.create(VreIcons.class);
+
+ public static final String LOADING_TEXT = "Loading data, please wait..";
+}
diff --git a/src/main/java/org/gcube/portlets/admin/vredeployer/client/Vredeployer.java b/src/main/java/org/gcube/portlets/admin/vredeployer/client/Vredeployer.java
new file mode 100644
index 0000000..61098b8
--- /dev/null
+++ b/src/main/java/org/gcube/portlets/admin/vredeployer/client/Vredeployer.java
@@ -0,0 +1,84 @@
+package org.gcube.portlets.admin.vredeployer.client;
+
+import org.gcube.portlets.admin.vredeployer.client.control.Controller;
+import org.gcube.portlets.admin.vredeployer.client.model.Model;
+import org.gcube.portlets.admin.vredeployer.client.view.panels.MainContainer;
+import org.gcube.portlets.user.gcubewidgets.client.GCubePanel;
+
+import com.google.gwt.core.client.EntryPoint;
+import com.google.gwt.event.logical.shared.ResizeEvent;
+import com.google.gwt.event.logical.shared.ResizeHandler;
+import com.google.gwt.user.client.Window;
+import com.google.gwt.user.client.ui.RootPanel;
+
+/**
+ * Entry point classes define onModuleLoad()
.
+ */
+public class Vredeployer implements EntryPoint {
+ /**
+ *
+ */
+ public static final String CONTAINER_DIV = "DeployerDIV";
+
+ private MainContainer mainContainer;
+ private Controller controller;
+ private Model model;
+
+ /**
+ * This is the entry point method.
+ */
+ public void onModuleLoad() {
+ GCubePanel gcubePanel = new GCubePanel("VRE Deployer","https://gcube.wiki.gcube-system.org/gcube/index.php/VRE_Administration#VRE_Approval");
+
+ controller = new Controller(this);
+ mainContainer = new MainContainer(controller);
+ mainContainer.getWestPanel().setDefaultSelected();
+ model = new Model(mainContainer);
+
+ gcubePanel.add(mainContainer);
+ RootPanel.get(CONTAINER_DIV).add(gcubePanel);
+
+ //enable the portlet if there isa VRE to approve
+ model.checkApproveModeEnabled();
+
+ Window.addResizeHandler(new ResizeHandler() {
+
+ public void onResize(ResizeEvent event) {
+ updateSize();
+
+ }
+ });
+ updateSize();
+ }
+ /**
+ * updateSize
+ */
+ public void updateSize() {
+ RootPanel workspace = RootPanel.get(CONTAINER_DIV);
+ int topBorder = workspace.getAbsoluteTop();
+ int leftBorder = workspace.getAbsoluteLeft();
+ int rightScrollBar = 17;
+ int rootHeight = Window.getClientHeight() - topBorder - 4;
+ int rootWidth = Window.getClientWidth() - 2* leftBorder - rightScrollBar;
+ mainContainer.setHeight(rootHeight-30);
+ mainContainer.setWidth(rootWidth);
+
+ }
+ /**
+ *
+ * @return the main container
+ */
+ public MainContainer getMainContainer() {
+ return mainContainer;
+ }
+
+ /**
+ *
+ * @return
+ */
+ public Model getModel() {
+ return model;
+ }
+
+}
+
diff --git a/src/main/java/org/gcube/portlets/admin/vredeployer/client/VredeployerService.java b/src/main/java/org/gcube/portlets/admin/vredeployer/client/VredeployerService.java
new file mode 100644
index 0000000..b6ef38f
--- /dev/null
+++ b/src/main/java/org/gcube/portlets/admin/vredeployer/client/VredeployerService.java
@@ -0,0 +1,45 @@
+package org.gcube.portlets.admin.vredeployer.client;
+
+import java.util.List;
+
+import org.gcube.portlets.admin.vredeployer.client.model.VREFunctionalityModel;
+import org.gcube.portlets.admin.vredeployer.shared.GHNProfile;
+import org.gcube.portlets.admin.vredeployer.shared.VREDeployerStatusType;
+import org.gcube.portlets.admin.vredeployer.shared.VREDescrBean;
+import org.gcube.portlets.admin.vredeployer.shared.deployreport.ClientDeployReport;
+
+import com.google.gwt.user.client.rpc.RemoteService;
+import com.google.gwt.user.client.rpc.RemoteServiceRelativePath;
+
+/**
+ *
+ * @author massi
+ *
+ */
+@RemoteServiceRelativePath("VREDeployerServiceImpl")
+public interface VredeployerService extends RemoteService {
+
+ VREDescrBean getVRE() throws NullPointerException;
+
+ VREDeployerStatusType isApprovingModeEnabled();
+
+ int isCloudSelected();
+
+ VREFunctionalityModel getFunctionality();
+
+ List getAvailableGHNs();
+
+ boolean setGHNsSelected(String[] selectedGHNIds);
+
+ boolean setCloudDeploy(int virtualMachines);
+
+ int getCloudVMSelected();
+
+ boolean deployVRE();
+
+ ClientDeployReport checkCreateVRE();
+
+ String getHTMLReport();
+
+ void getGHNPerFunctionality(String funcId);
+}
diff --git a/src/main/java/org/gcube/portlets/admin/vredeployer/client/VredeployerServiceAsync.java b/src/main/java/org/gcube/portlets/admin/vredeployer/client/VredeployerServiceAsync.java
new file mode 100644
index 0000000..12a4947
--- /dev/null
+++ b/src/main/java/org/gcube/portlets/admin/vredeployer/client/VredeployerServiceAsync.java
@@ -0,0 +1,42 @@
+package org.gcube.portlets.admin.vredeployer.client;
+
+import java.util.List;
+
+import org.gcube.portlets.admin.vredeployer.client.model.VREFunctionalityModel;
+import org.gcube.portlets.admin.vredeployer.shared.GHNProfile;
+import org.gcube.portlets.admin.vredeployer.shared.VREDeployerStatusType;
+import org.gcube.portlets.admin.vredeployer.shared.VREDescrBean;
+import org.gcube.portlets.admin.vredeployer.shared.deployreport.ClientDeployReport;
+
+import com.google.gwt.user.client.rpc.AsyncCallback;
+
+/*
+ *
+ */
+public interface VredeployerServiceAsync {
+
+ void getVRE(AsyncCallback callback);
+
+ void isApprovingModeEnabled(AsyncCallback callback);
+
+ void getAvailableGHNs(AsyncCallback> callback);
+
+ void setGHNsSelected(String[] selectedGHNIds, AsyncCallback callback);
+
+ void isCloudSelected(AsyncCallback callback);
+
+ void setCloudDeploy(int virtualMachines, AsyncCallback callback);
+
+ void getCloudVMSelected(AsyncCallback callback);
+
+ void checkCreateVRE(AsyncCallback callback);
+
+ void deployVRE(AsyncCallback callback);
+
+ void getHTMLReport(AsyncCallback callback);
+
+ void getFunctionality(AsyncCallback callback);
+
+ void getGHNPerFunctionality(String funcId, AsyncCallback callback);
+
+}
diff --git a/src/main/java/org/gcube/portlets/admin/vredeployer/client/charts/CloudChart.java b/src/main/java/org/gcube/portlets/admin/vredeployer/client/charts/CloudChart.java
new file mode 100644
index 0000000..70ddf42
--- /dev/null
+++ b/src/main/java/org/gcube/portlets/admin/vredeployer/client/charts/CloudChart.java
@@ -0,0 +1,129 @@
+package org.gcube.portlets.admin.vredeployer.client.charts;
+
+import java.util.List;
+
+import org.gcube.portlets.admin.vredeployer.shared.deployreport.DeployStatus;
+
+import com.extjs.gxt.charts.client.Chart;
+import com.extjs.gxt.charts.client.model.ChartModel;
+import com.extjs.gxt.charts.client.model.axis.XAxis;
+import com.extjs.gxt.charts.client.model.axis.YAxis;
+import com.extjs.gxt.charts.client.model.charts.BarChart;
+import com.extjs.gxt.charts.client.model.charts.FilledBarChart;
+import com.extjs.gxt.charts.client.model.charts.BarChart.Bar;
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.user.client.Random;
+
+public class CloudChart implements SimpleChartModel {
+
+ private Chart chart;
+
+ public CloudChart() {
+ super();
+ String url = GWT.getModuleBaseURL() + "../";
+ url += "gxt/chart/open-flash-chart.swf";
+ chart = new Chart(url);
+ chart.setBorders(true);
+ }
+
+ /**
+ *
+ * @return
+ */
+ public Chart getChart() {
+ return chart;
+ }
+
+ /**
+ *
+ */
+ public ChartModel getChartModel(DeployStatus cloudStatus, List singleMachines) {
+ ChartModel cm = new ChartModel("current status: " + cloudStatus, "font-size: 14px; font-family: Verdana; text-align: center;");
+ cm.setBackgroundColour("#FFFFFF");
+ cm.setDecimalSeparatorComma(true);
+
+ int n = singleMachines.size();
+
+ XAxis xa = new XAxis();
+ xa.setLabels(getAscisseValues(singleMachines));
+ xa.getLabels().setColour("#009900");
+ xa.setGridColour("#eeffee");
+ xa.setColour("#009900");
+ cm.setXAxis(xa);
+
+
+ YAxis ya = new YAxis();
+ ya.setRange(0, 100);
+ ya.setSteps(10);
+ ya.setGridColour("#eeffee");
+ ya.setColour("#009900");
+ ya.setOffset(true);
+ cm.setYAxisLabelStyle(10, "#009900");
+ cm.setYAxis(ya);
+
+
+ BarChart bchart = new BarChart();
+
+
+ for (DeployStatus deployStatus : singleMachines) {
+ //bchart.addValues(Random.nextInt(5000) + 10000);
+ switch (deployStatus) {
+ case FAIL:
+ Bar fail = new Bar(30, "#D91717");
+ fail.setTooltip("failure");
+ bchart.addBars(fail);
+ break;
+ case FINISH:
+ Bar finish = new Bar(100, "#63AC1C");
+ finish.setTooltip("completed");
+ bchart.addBars(finish);
+ break;
+ case PENDING:
+ Bar pending = new Bar(10, "#FE8537");
+ pending.setTooltip("pending");
+ bchart.addBars(pending);
+ break;
+ case RUN:
+ Bar running = new Bar(50, "#63AC1C");
+ running.setTooltip("running");
+ bchart.addBars(running);
+ ;
+ break;
+ case SKIP:
+ Bar skip = new Bar(10, "#CCCCCC");
+ skip.setTooltip("skip");
+ bchart.addBars(skip);
+
+ break;
+ case WAIT:
+ Bar waiting = new Bar(25, "#FE8537");
+ waiting.setTooltip("waiting");
+ bchart.addBars(waiting);
+ //bchart.setTooltip("waiting");
+ break;
+ default:
+ break;
+ }
+ //bchart.setTooltip("#val#%");
+ }
+
+ cm.addChartConfig(bchart);
+ return cm;
+ }
+
+
+ /**
+ *
+ * @param n
+ * @return
+ */
+ public static String[] getAscisseValues(List singleMachines) {
+ int n = singleMachines.size();
+ String[] machines = new String[n];
+ for (int c = 0; c < n; c++)
+ machines[c] = "node" + (c+1);
+ return machines;
+ }
+
+
+}
diff --git a/src/main/java/org/gcube/portlets/admin/vredeployer/client/charts/FunctionalityChart.java b/src/main/java/org/gcube/portlets/admin/vredeployer/client/charts/FunctionalityChart.java
new file mode 100644
index 0000000..aa72be9
--- /dev/null
+++ b/src/main/java/org/gcube/portlets/admin/vredeployer/client/charts/FunctionalityChart.java
@@ -0,0 +1,281 @@
+package org.gcube.portlets.admin.vredeployer.client.charts;
+
+import java.util.HashMap;
+import java.util.LinkedList;
+import java.util.List;
+
+import org.gcube.portlets.admin.vredeployer.shared.deployreport.ClientFunctionalityDeployReport;
+import org.gcube.portlets.admin.vredeployer.shared.deployreport.ClientFunctionalityReport;
+import org.gcube.portlets.admin.vredeployer.shared.deployreport.ClientServiceReport;
+import org.gcube.portlets.admin.vredeployer.shared.deployreport.DeployStatus;
+
+import com.extjs.gxt.charts.client.Chart;
+import com.extjs.gxt.charts.client.model.ChartModel;
+import com.extjs.gxt.charts.client.model.axis.XAxis;
+import com.extjs.gxt.charts.client.model.axis.YAxis;
+import com.extjs.gxt.charts.client.model.charts.BarChart;
+import com.extjs.gxt.charts.client.model.charts.BarChart.Bar;
+import com.google.gwt.core.client.GWT;
+
+
+public class FunctionalityChart {
+
+ private Chart chart;
+
+ public FunctionalityChart() {
+ super();
+ String url = GWT.getModuleBaseURL() + "../";
+ url += "gxt/chart/open-flash-chart.swf";
+ chart = new Chart(url);
+ chart.setBorders(true);
+ }
+
+ /**
+ *
+ * @return
+ */
+ public Chart getChart() {
+ return chart;
+ }
+
+ /**
+ *
+ */
+ public ChartModel getChartModel(ClientFunctionalityDeployReport report) {
+ ChartModel cm = new ChartModel("current status: " + report.getStatus(), "font-size: 14px; font-family: Verdana; text-align: center;");
+ cm.setBackgroundColour("#FFFFFF");
+ cm.setDecimalSeparatorComma(true);
+
+ HashMap> funTable;
+ if (report.getFunTable() != null)
+ funTable = report.getFunTable();
+ else
+ funTable = new HashMap>();
+
+ int n = report.getFunTable().size();
+
+ XAxis xa = new XAxis();
+ xa.setLabels(getAscisseValues(funTable));
+ xa.getLabels().setColour("#009900");
+ xa.setGridColour("#eeffee");
+ xa.setColour("#009900");
+ cm.setXAxis(xa);
+
+
+ YAxis ya = new YAxis();
+ ya.setRange(0, 100);
+ ya.setSteps(10);
+ ya.setGridColour("#eeffee");
+ ya.setColour("#009900");
+ ya.setOffset(true);
+ cm.setYAxisLabelStyle(10, "#009900");
+ cm.setYAxis(ya);
+
+
+ BarChart bchart = new BarChart();
+
+
+ for (ClientFunctionalityReport func : funTable.keySet()) {
+ DeployStatus deployStatus = func.getStatus();
+ //bchart.addValues(Random.nextInt(5000) + 10000);
+ switch (deployStatus) {
+ case FAIL:
+ Bar fail = new Bar(30, "#D91717");
+ fail.setTooltip("failure");
+ bchart.addBars(fail);
+ break;
+ case FINISH:
+ Bar finish = new Bar(100, "#63AC1C");
+ finish.setTooltip("completed " + func.getName());
+ bchart.addBars(finish);
+ break;
+ case PENDING:
+ Bar pending = new Bar(10, "#FE8537");
+ pending.setTooltip("pending");
+ bchart.addBars(pending);
+ break;
+ case RUN:
+ Bar running = new Bar(50, "#63AC1C");
+ running.setTooltip("running " + func.getName());
+ bchart.addBars(running);
+ ;
+ break;
+ case SKIP:
+ Bar skip = new Bar(10, "#CCCCCC");
+ skip.setTooltip("skip");
+ bchart.addBars(skip);
+
+ break;
+ case WAIT:
+ Bar waiting = new Bar(25, "#FE8537");
+ waiting.setTooltip("waiting " + func.getName());
+ bchart.addBars(waiting);
+ //bchart.setTooltip("waiting");
+ break;
+ default:
+ break;
+ }
+ //bchart.setTooltip("#val#%");
+ }
+
+ cm.addChartConfig(bchart);
+ return cm;
+ }
+
+
+
+ /**
+ *
+ * @param n
+ * @return
+ */
+ public static List getAscisseValues(HashMap> funTable) {
+ funTable.keySet();
+ List func = new LinkedList();
+ int i = 0;
+ for (ClientFunctionalityReport fun : funTable.keySet()) {
+ func.add("f"+i);
+ i++;
+ }
+
+ return func;
+ }
+
+}
+
+
+//
+// HashMap> funTable;
+// if (report.getFunTable() != null)
+// funTable = report.getFunTable();
+// else
+// funTable = new HashMap>();
+//
+// int n = report.getFunTable().size();
+// GWT.log("SIZE TABLE" + n);
+//
+// ChartModel cm = new ChartModel("current status: " + report.getStatus(), "font-size: 14px; font-family: Verdana; text-align: center;");
+// cm.setBackgroundColour("#FFFFFF");
+//
+// XAxis xa = new XAxis();
+// xa.setRange(0, getMaxServicesNumber(funTable)*10 + 30);
+// xa.getLabels().setColour("#009900");
+// xa.addLabels("");
+// xa.setColour("#009900");
+// xa.setSteps(10);
+//
+// // xa.setRange(0, 100);
+// cm.setXAxis(xa);
+// xa.setGridColour("#eeffee");
+//
+// YAxis ya = new YAxis();
+// ya.setColour("#009900");
+// //ya.addLabels(getAscisseValues(funTable));
+// ya.setGridColour("#eeffee");
+// ya.setOffset(true);
+// cm.setYAxis(ya);
+//
+//
+// HorizontalBarChart bchart = new HorizontalBarChart();
+// /**
+// *
+// */
+// for (MyBarData data: getBars(funTable)) {
+// bchart.addBars(new HorizontalBarChart.Bar(data.value, data.color));
+// }
+// cm.addChartConfig(bchart);
+// return cm;
+// }
+//
+// /**
+// *
+// * @param table
+// * @return
+// */
+// private int getMaxServicesNumber(HashMap> table) {
+// //calculate the max of services for each functionality
+// int max = 0;
+// for (ClientFunctionalityReport func : table.keySet()) {
+// int toCompare = table.get(func).size();
+// if (toCompare > max)
+// max = toCompare;
+// }
+// return max;
+// }
+//
+// /**
+// *
+// * @return
+// */
+// private List getBars(HashMap> table) {
+//
+// List toReturn = new LinkedList();
+//
+// //a bar for each functionality
+// for (ClientFunctionalityReport func : table.keySet()) {
+// toReturn.add(new MyBarData( table.get(func).size()*10, getColor(func.getStatus()) ) );
+// }
+// return toReturn;
+// }
+//
+// /**
+// *
+// * @author massi
+// *
+// */
+// private class MyBarData {
+// public double value;
+// public String color;
+// /**
+// *
+// * @param value
+// * @param color
+// */
+// public MyBarData(double value, String color) {
+// super();
+// this.value = value;
+// this.color = color;
+// }
+//
+// }
+// /**
+// *
+// * @param status
+// * @return
+// */
+// private String getColor(DeployStatus status) {
+// switch (status) {
+// case FAIL:
+// return "#D91717";
+// case FINISH:
+// return "#63AC1C";
+// case PENDING:
+// return "#FE8537";
+// case RUN:
+// return "#63AC1C";
+// case SKIP:
+// return "#CCCCCC";
+// case WAIT:
+// return "#FE8537";
+// default:
+// return "#000000";
+// }
+// }
+//
+// /**
+// *
+// * @param n
+// * @return
+// */
+// public static List getAscisseValues(HashMap> funTable) {
+// funTable.keySet();
+// List machines = new LinkedList();
+// int i = 0;
+// for (ClientFunctionalityReport fun : funTable.keySet()) {
+// machines.add(fun.getName());
+// i++;
+// }
+// GWT.log("size func" + machines.size());
+// return machines;
+// }
+
diff --git a/src/main/java/org/gcube/portlets/admin/vredeployer/client/charts/GeneralChartModel.java b/src/main/java/org/gcube/portlets/admin/vredeployer/client/charts/GeneralChartModel.java
new file mode 100644
index 0000000..12eb91a
--- /dev/null
+++ b/src/main/java/org/gcube/portlets/admin/vredeployer/client/charts/GeneralChartModel.java
@@ -0,0 +1,46 @@
+package org.gcube.portlets.admin.vredeployer.client.charts;
+
+import com.extjs.gxt.ui.client.data.BaseModelData;
+
+public class GeneralChartModel extends BaseModelData {
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ protected GeneralChartModel() {
+
+ }
+
+ public GeneralChartModel(String name, String path,SimpleChartModel example) {
+ setName(name);
+ setPath(path);
+ setExample(example);
+ }
+
+ public void setName(String name) {
+ set("name", name);
+ }
+
+ public void setPath(String path) {
+ set("path", path);
+ }
+
+ public void setExample(SimpleChartModel example) {
+ set("example", example);
+ }
+
+ public String getName() {
+ return get("name");
+ }
+
+ public String getPath() {
+ return get("path");
+ }
+
+ public SimpleChartModel getExample() {
+ return get("example");
+ }
+}
+
diff --git a/src/main/java/org/gcube/portlets/admin/vredeployer/client/charts/SimpleChartModel.java b/src/main/java/org/gcube/portlets/admin/vredeployer/client/charts/SimpleChartModel.java
new file mode 100644
index 0000000..0441b0e
--- /dev/null
+++ b/src/main/java/org/gcube/portlets/admin/vredeployer/client/charts/SimpleChartModel.java
@@ -0,0 +1,13 @@
+package org.gcube.portlets.admin.vredeployer.client.charts;
+
+import java.util.List;
+
+import org.gcube.portlets.admin.vredeployer.shared.deployreport.DeployStatus;
+
+import com.extjs.gxt.charts.client.model.ChartModel;
+
+
+public interface SimpleChartModel {
+
+ public ChartModel getChartModel(DeployStatus cloudStatus, List singleMachines);
+}
diff --git a/src/main/java/org/gcube/portlets/admin/vredeployer/client/constants/ImagesConstants.java b/src/main/java/org/gcube/portlets/admin/vredeployer/client/constants/ImagesConstants.java
new file mode 100644
index 0000000..ec06c13
--- /dev/null
+++ b/src/main/java/org/gcube/portlets/admin/vredeployer/client/constants/ImagesConstants.java
@@ -0,0 +1,19 @@
+package org.gcube.portlets.admin.vredeployer.client.constants;
+
+import com.google.gwt.core.client.GWT;
+
+public class ImagesConstants {
+ public static final String INFO_IMAGE = GWT.getModuleBaseURL() + "../images/information.png";
+ public static final String CONTENT_IMAGE = GWT.getModuleBaseURL() + "../images/content.png";
+ public static final String COLLECTIONS_IMAGE = GWT.getModuleBaseURL() + "../images/collections.png";
+ public static final String METADATA_IMAGE = GWT.getModuleBaseURL() + "../images/metadata.gif";
+
+ public static final String FUNC_IMAGE = GWT.getModuleBaseURL() + "../images/functionality.png";
+ public static final String ARCH_IMAGE = GWT.getModuleBaseURL() + "../images/architecture.png";
+
+ public static final String CLOUD_ICON = GWT.getModuleBaseURL() + "../images/cloud.png";
+ public static final String CLOUD_IMAGE = GWT.getModuleBaseURL() + "../images/cloud-gcube.png";
+
+
+
+}
diff --git a/src/main/java/org/gcube/portlets/admin/vredeployer/client/control/Controller.java b/src/main/java/org/gcube/portlets/admin/vredeployer/client/control/Controller.java
new file mode 100644
index 0000000..385ee9c
--- /dev/null
+++ b/src/main/java/org/gcube/portlets/admin/vredeployer/client/control/Controller.java
@@ -0,0 +1,122 @@
+package org.gcube.portlets.admin.vredeployer.client.control;
+
+import org.gcube.portlets.admin.vredeployer.client.VREDeployerConstants;
+import org.gcube.portlets.admin.vredeployer.client.Vredeployer;
+import org.gcube.portlets.admin.vredeployer.client.model.AtomicTreeNode;
+import org.gcube.portlets.admin.vredeployer.client.view.panels.CenterPanel;
+import org.gcube.portlets.admin.vredeployer.shared.GHNBean;
+
+import com.extjs.gxt.ui.client.widget.ContentPanel;
+import com.google.gwt.core.client.GWT;
+
+public class Controller {
+
+ private Vredeployer vreDeployer;
+
+ public Controller(final Vredeployer vreDeployer) {
+ this.vreDeployer = vreDeployer;
+ }
+
+ public void treeItemClicked(AtomicTreeNode selectedModel) {
+ CenterPanel cp = vreDeployer.getMainContainer().getCenterPanel();
+ switch (selectedModel.getType()) {
+ case INFO:
+ cp.setHeading("VRE Overall Information");
+ cp.setIconStyle("images/icons/information.png");
+ cp.emptyPanel();
+ showLoading();
+ vreDeployer.getModel().getVREInitialInfo();
+ vreDeployer.getMainContainer().getEastPanel().collapse();
+ vreDeployer.getMainContainer().showEastPanel(false);
+ break;
+ case FUNCTIONALITY:
+ cp.setHeading("VRE Selected Functionality");
+ cp.setIconStyle("images/icons/functionality.png");
+ cp.emptyPanel();
+ showLoading();
+ vreDeployer.getModel().getFunctionality();
+ vreDeployer.getMainContainer().showEastPanel(true);
+ break;
+ case ARCHITECTURE:
+ cp.setHeading("Select nodes to deploy VRE Services");
+ cp.setIconStyle("images/icons/architecture.png");
+ cp.emptyPanel();
+ showLoading();
+ showEastPanelLoading();
+ vreDeployer.getModel().getAvailableGhnList();
+ vreDeployer.getModel().checkCloudSelected();
+ vreDeployer.getMainContainer().showEastPanel(true);
+ break;
+ case REPORT:
+ cp.setHeading("Finalize");
+ cp.setIconStyle("images/icons/play.png");
+ cp.emptyPanel();
+ vreDeployer.getMainContainer().getCenterPanel().mask("Step Architecture Missing, define nodes first", "");
+ vreDeployer.getMainContainer().getEastPanel().hide();
+ vreDeployer.getModel().getSummary();
+ break;
+
+ default:
+ break;
+ }
+ }
+
+ /**
+ *
+ */
+ private void showLoading() {
+ vreDeployer.getMainContainer().getCenterPanel().mask(VREDeployerConstants.LOADING_TEXT, "loading-indicator");
+ }
+
+ /**
+ *
+ */
+ private void showEastPanelLoading() {
+ vreDeployer.getMainContainer().getEastPanel().setIconStyle("images/icons/cloud.png");
+ vreDeployer.getMainContainer().getEastPanel().mask("Checking cloud availability please wait...", "loading-indicator");
+ }
+
+ /**
+ *
+ */
+ public void setDefaultTreeItemSelected() {
+ CenterPanel cp = vreDeployer.getMainContainer().getCenterPanel();
+ cp.setHeading("VRE Overall Information");
+ cp.setIconStyle("images/icons/information.png");
+ }
+
+ /**
+ *
+ * @param toShow
+ */
+ public void setEastPanelContent(ContentPanel toShow) {
+ vreDeployer.getMainContainer().getEastPanel().removeAll();
+ vreDeployer.getMainContainer().getEastPanel().add(toShow);
+ vreDeployer.getMainContainer().getEastPanel().layout();
+ }
+
+ /**
+ *
+ * @param selectedGHNIds
+ * @param idCandidateGHN
+ */
+ public void setGHNsSelected(GHNBean[] selectedGHNIds) {
+ vreDeployer.getModel().setGHNsSelected(selectedGHNIds);
+ }
+
+ public void maskCenterPanel(boolean mask) {
+ if (mask)
+ vreDeployer.getMainContainer().getCenterPanel().mask();
+ else
+ vreDeployer.getMainContainer().getCenterPanel().unmask();
+ }
+
+ public void setCloudSelected(boolean selected, int vMachines) {
+ vreDeployer.getModel().setCloudSelected(selected, vMachines);
+ }
+
+ public void createVreButtonClicked() {
+ vreDeployer.getModel().startVREDeploymentStatus();
+ }
+
+}
diff --git a/src/main/java/org/gcube/portlets/admin/vredeployer/client/icons/VreIcons.java b/src/main/java/org/gcube/portlets/admin/vredeployer/client/icons/VreIcons.java
new file mode 100755
index 0000000..93882f4
--- /dev/null
+++ b/src/main/java/org/gcube/portlets/admin/vredeployer/client/icons/VreIcons.java
@@ -0,0 +1,18 @@
+package org.gcube.portlets.admin.vredeployer.client.icons;
+
+import com.google.gwt.user.client.ui.AbstractImagePrototype;
+import com.google.gwt.user.client.ui.ImageBundle;
+@SuppressWarnings("deprecation")
+public interface VreIcons extends ImageBundle {
+
+ @Resource("runninginstance.png")
+ AbstractImagePrototype runninginstance();
+
+ @Resource("serverinfo.png")
+ AbstractImagePrototype serverinfo();
+
+ @Resource("infopanel.png")
+ AbstractImagePrototype inforpanel();
+
+
+}
diff --git a/src/main/java/org/gcube/portlets/admin/vredeployer/client/icons/infopanel.png b/src/main/java/org/gcube/portlets/admin/vredeployer/client/icons/infopanel.png
new file mode 100755
index 0000000..12cd1ae
Binary files /dev/null and b/src/main/java/org/gcube/portlets/admin/vredeployer/client/icons/infopanel.png differ
diff --git a/src/main/java/org/gcube/portlets/admin/vredeployer/client/icons/runninginstance.png b/src/main/java/org/gcube/portlets/admin/vredeployer/client/icons/runninginstance.png
new file mode 100755
index 0000000..3262767
Binary files /dev/null and b/src/main/java/org/gcube/portlets/admin/vredeployer/client/icons/runninginstance.png differ
diff --git a/src/main/java/org/gcube/portlets/admin/vredeployer/client/icons/serverinfo.png b/src/main/java/org/gcube/portlets/admin/vredeployer/client/icons/serverinfo.png
new file mode 100755
index 0000000..540c8e2
Binary files /dev/null and b/src/main/java/org/gcube/portlets/admin/vredeployer/client/icons/serverinfo.png differ
diff --git a/src/main/java/org/gcube/portlets/admin/vredeployer/client/model/AtomicTreeNode.java b/src/main/java/org/gcube/portlets/admin/vredeployer/client/model/AtomicTreeNode.java
new file mode 100644
index 0000000..d0a38ad
--- /dev/null
+++ b/src/main/java/org/gcube/portlets/admin/vredeployer/client/model/AtomicTreeNode.java
@@ -0,0 +1,99 @@
+package org.gcube.portlets.admin.vredeployer.client.model;
+
+import com.extjs.gxt.ui.client.data.BaseTreeModel;
+
+/**
+ * @author Massimiliano Assante (ISTI-CNR)
+ *
+ */
+public class AtomicTreeNode extends BaseTreeModel {
+ private static final long serialVersionUID = 5094327834701967591L;
+ private static int ID = 0;
+
+ private NodeType type;
+
+
+ /**
+ * @deprecated fr serialization only
+ */
+ public AtomicTreeNode() {
+ set("id", ID++);
+ }
+
+ public AtomicTreeNode(final String node) {
+ this(node, null);
+ }
+
+ /**
+ * The node is used as original node of the element useful to retrieve it from the IS.
+ * The name is instead used for pretty printing (aliasing).
+ * @param node the corresponding IS node
+ * @param name if null the node will be used instead
+ */
+ public AtomicTreeNode(final String node, final String name) {
+ set("id", ID++);
+ set("node", node);
+ if (name == null) {
+ set("name", node);
+ } else {
+ set("name", name);
+ }
+ }
+
+ public AtomicTreeNode(final String node, final String name, final String icon, NodeType type) {
+ this(node, name);
+ set("icon", icon);
+ this.type = type;
+ }
+
+ public AtomicTreeNode(final String node, final String name, final AtomicTreeNode[] children) {
+ this(node, name);
+ for (int i = 0; i < children.length; i++) {
+ add(children[i]);
+ }
+ }
+
+ public AtomicTreeNode(final String node, final String name, final String icon, final AtomicTreeNode[] children) {
+ this(node, name, children);
+ set("icon", icon);
+ }
+
+ public AtomicTreeNode(final String node, final String name, final String icon, final int sortIdx, final AtomicTreeNode[] children) {
+ this(node, name, icon, children);
+ set("sortIdx", sortIdx);
+ }
+
+ public final Integer getId() {
+ return (Integer) get("id");
+ }
+
+ public final String getName() {
+ return (String) get("name");
+ }
+
+ public final String getNode() {
+ return (String) get("node");
+ }
+
+ public final String getLabel() {
+ return (String) get("label");
+ }
+
+ public final String toString() {
+ return getName();
+ }
+
+ public final String getSubType() {
+ if (this.isLeaf() && this.getParent() != null) {
+ return this.getNode();
+ }
+ return null;
+ }
+ /**
+ *
+ * @return
+ */
+ public NodeType getType() {
+ return type;
+ }
+}
diff --git a/src/main/java/org/gcube/portlets/admin/vredeployer/client/model/Model.java b/src/main/java/org/gcube/portlets/admin/vredeployer/client/model/Model.java
new file mode 100644
index 0000000..3da4d96
--- /dev/null
+++ b/src/main/java/org/gcube/portlets/admin/vredeployer/client/model/Model.java
@@ -0,0 +1,277 @@
+package org.gcube.portlets.admin.vredeployer.client.model;
+
+import java.util.List;
+
+import org.gcube.portlets.admin.vredeployer.client.VredeployerService;
+import org.gcube.portlets.admin.vredeployer.client.VredeployerServiceAsync;
+import org.gcube.portlets.admin.vredeployer.client.view.panels.MainContainer;
+import org.gcube.portlets.admin.vredeployer.shared.GHNBean;
+import org.gcube.portlets.admin.vredeployer.shared.GHNProfile;
+import org.gcube.portlets.admin.vredeployer.shared.VREDeployerStatusType;
+import org.gcube.portlets.admin.vredeployer.shared.VREDescrBean;
+
+import com.extjs.gxt.ui.client.widget.Info;
+import com.extjs.gxt.ui.client.widget.MessageBox;
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.user.client.rpc.AsyncCallback;
+
+
+public class Model {
+
+
+ private VREDescrBean vreDesc;
+
+ private GHNBean[] selectedGHNs;
+ private boolean isCloudSelected = false;
+ private boolean isCloudAvailable = true;
+
+
+
+ /**
+ * Create a remote service proxy to talk to the server-side Greeting service.
+ */
+ private final VredeployerServiceAsync deployerService = GWT.create(VredeployerService.class);
+ ;
+ private MainContainer mainContainer;
+
+ public Model(MainContainer mainContainer) {
+ super();
+ this.mainContainer = mainContainer;
+ }
+
+ /**
+ *
+ */
+ public void checkApproveModeEnabled() {
+ deployerService.isApprovingModeEnabled(new AsyncCallback() {
+ public void onSuccess(VREDeployerStatusType result) {
+ if (result == VREDeployerStatusType.APPROVE) {
+ getVREInitialInfo();
+ }
+ else if (result == VREDeployerStatusType.NON_APPROVE) {
+ mainContainer.getWestPanel().disable();
+ mainContainer.getCenterPanel().unmask();
+ mainContainer.getCenterPanel().addText("Approve mode was not enabled");
+ mainContainer.getCenterPanel().layout();
+ }
+ else if (result == VREDeployerStatusType.DEPLOYING) {
+ mainContainer.getWestPanel().disable();
+ mainContainer.getCenterPanel().unmask();
+ mainContainer.getCenterPanel().showReport();
+ }
+
+ }
+
+ public void onFailure(Throwable caught) {
+ mainContainer.getWestPanel().disable();
+ mainContainer.getCenterPanel().unmask();
+ mainContainer.getCenterPanel().addText("There was an error on server: " + caught.getMessage());
+ mainContainer.getCenterPanel().layout();
+ }
+ });
+ }
+
+ /**
+ * load the initial info for the VRE
+ */
+ public void getVREInitialInfo() {
+ deployerService.getVRE(new AsyncCallback() {
+
+ public void onFailure(Throwable caught) {
+ applyActionsOnException(caught);
+ }
+
+ public void onSuccess(VREDescrBean vremodel) {
+ vreDesc = vremodel;
+ mainContainer.getCenterPanel().showVreDescription(vremodel);
+ mainContainer.getCenterPanel().layout();
+ mainContainer.getCenterPanel().unmask();
+ }
+ });
+ }
+
+
+
+ /**
+ *
+ */
+ public void getFunctionality() {
+ deployerService.getFunctionality(new AsyncCallback() {
+ public void onFailure(Throwable caught) {
+ applyActionsOnException(caught);
+ }
+ public void onSuccess(VREFunctionalityModel root) {
+ if (root!= null) {
+ mainContainer.getCenterPanel().showFunctionality(root);
+ mainContainer.getCenterPanel().layout();
+ mainContainer.getCenterPanel().unmask();
+ } else
+ applyActionsOnException("");
+ }
+ });
+ }
+
+ /**
+ *
+ */
+ public void getAvailableGhnList() {
+ deployerService.getAvailableGHNs(new AsyncCallback>() {
+
+ public void onFailure(Throwable caught) {
+ applyActionsOnException(caught);
+ }
+
+ public void onSuccess(List result) {
+ mainContainer.getCenterPanel().showGHNList(result);
+ mainContainer.getCenterPanel().layout();
+ if (! isCloudSelected)
+ mainContainer.getCenterPanel().unmask();
+
+ }
+ });
+ }
+
+ /**
+ *
+ * @param selectedGHNIds
+ * @param idCandidateGHN
+ * @return
+ */
+ public void setGHNsSelected(GHNBean[] selectedGHNs) {
+ this.selectedGHNs = selectedGHNs;
+ isCloudSelected = false;
+ String[] selectedIds = new String[selectedGHNs.length];
+ for (int i = 0; i < selectedGHNs.length; i++) {
+ selectedIds[i] = selectedGHNs[i].getId();
+ }
+
+ deployerService.setGHNsSelected(selectedIds, new AsyncCallback() {
+ public void onSuccess(Boolean result) {
+ Info.display("Saving Operation", "The ghn selection was saved successfully");
+ }
+
+ public void onFailure(Throwable caught) {
+ MessageBox.alert("Error", "Error while saving ghn list: " + caught.getMessage(), null);
+ }
+ });
+ }
+
+
+ /**
+ *
+ */
+ public void checkCloudSelected() {
+ deployerService.isCloudSelected(new AsyncCallback() {
+
+ public void onFailure(Throwable caught) {
+ mainContainer.getEastPanel().addText("There was an error on server: " + caught.getMessage());
+ mainContainer.getEastPanel().unmask();
+ mainContainer.getEastPanel().layout();
+ }
+
+ public void onSuccess(Integer result) {
+ if (result != -1) {
+ isCloudSelected = true;
+ mainContainer.getEastPanel().showCloudPanel(true, result);
+ }
+ else {
+ isCloudSelected = false;
+ mainContainer.getEastPanel().showCloudPanel(false, -1);
+ }
+ }
+ });
+ }
+
+ /**
+ *
+ */
+ public void getSummary() {
+ mainContainer.getCenterPanel().showFinalize(vreDesc, selectedGHNs, isCloudSelected());
+ mainContainer.getCenterPanel().layout();
+ }
+
+ /**
+ * take care of showing ens user the error cause and remove the mask
+ * @param caught
+ */
+ private void applyActionsOnException(Throwable caught) {
+ mainContainer.getCenterPanel().addText("There was an error on server: " + caught.getMessage());
+ mainContainer.getCenterPanel().layout();
+ mainContainer.getCenterPanel().unmask();
+ }
+
+ /**
+ * take care of showing ens user the error cause and remove the mask
+ * @param caught
+ */
+ private void applyActionsOnException(String message) {
+ mainContainer.getCenterPanel().addText("There was an error on server, please try again ina ashort while.");
+ mainContainer.getCenterPanel().layout();
+ mainContainer.getCenterPanel().unmask();
+ }
+
+
+ /**
+ * @return -
+ */
+ public boolean isCloudSelected() {
+ return isCloudSelected;
+ }
+
+ /**
+ *
+ * @param isCloudSelected .
+ * @param virtualMachines .
+ */
+ public void setCloudSelected(boolean isCloudSelected, int virtualMachines) {
+ this.isCloudSelected = isCloudSelected;
+
+ mainContainer.getEastPanel().mask("Applying settings, please hold", "loading-indicator");
+
+ deployerService.setCloudDeploy(virtualMachines, new AsyncCallback() {
+ public void onSuccess(Boolean result) {
+ mainContainer.getEastPanel().unmask();
+ Info.display("Saving Operation", "The Cloud selection was saved successfully");
+ }
+ public void onFailure(Throwable caught) {
+ mainContainer.getEastPanel().unmask();
+ }
+ });
+ }
+
+ /**
+ *
+ * @return -
+ */
+ public VREDescrBean getVreDesc() {
+ return vreDesc;
+ }
+
+ /**
+ *
+ * @return -
+ */
+ public GHNBean[] getSelectedGHNs() {
+ return selectedGHNs;
+ }
+
+ /**
+ *
+ */
+ public void startVREDeploymentStatus() {
+ mainContainer.getCenterPanel().mask("VRE Deploying, please hold", "loading-indicator");
+ deployerService.deployVRE(new AsyncCallback() {
+ public void onFailure(Throwable caught) {
+ applyActionsOnException(caught);
+ }
+
+ public void onSuccess(Boolean result) {
+ mainContainer.getCenterPanel().unmask();
+ mainContainer.getCenterPanel().showReport();
+
+ }
+ });
+
+ }
+
+}
diff --git a/src/main/java/org/gcube/portlets/admin/vredeployer/client/model/NodeType.java b/src/main/java/org/gcube/portlets/admin/vredeployer/client/model/NodeType.java
new file mode 100644
index 0000000..3219cca
--- /dev/null
+++ b/src/main/java/org/gcube/portlets/admin/vredeployer/client/model/NodeType.java
@@ -0,0 +1,32 @@
+package org.gcube.portlets.admin.vredeployer.client.model;
+
+public enum NodeType {
+ /**
+ * INFO
+ */
+ INFO,
+ /**
+ * CONTENT
+ */
+ CONTENT,
+ /**
+ * COLLECTION
+ */
+ COLLECTION,
+ /**
+ * METADATA
+ */
+ METADATA,
+ /**
+ * FUNCTIONALITY
+ */
+ FUNCTIONALITY,
+ /**
+ * REPORT
+ */
+ REPORT,
+ /**
+ * ARCHITECTURE
+ */
+ ARCHITECTURE;
+}
diff --git a/src/main/java/org/gcube/portlets/admin/vredeployer/client/model/VREFunctionalityModel.java b/src/main/java/org/gcube/portlets/admin/vredeployer/client/model/VREFunctionalityModel.java
new file mode 100644
index 0000000..482d3ec
--- /dev/null
+++ b/src/main/java/org/gcube/portlets/admin/vredeployer/client/model/VREFunctionalityModel.java
@@ -0,0 +1,65 @@
+package org.gcube.portlets.admin.vredeployer.client.model;
+
+
+import com.extjs.gxt.ui.client.data.BaseTreeModel;
+
+@SuppressWarnings("serial")
+public class VREFunctionalityModel extends BaseTreeModel{
+
+
+ public VREFunctionalityModel() {
+
+ }
+ /**
+ * @param node
+ * @param description
+ * @param icon
+ */
+ public VREFunctionalityModel(String id, String node, String description, String icon, boolean isSelected) {
+ set("id",id);
+ set("node", node);
+ set("name", node);
+ set("description", description);
+ set("icon", icon);
+ set("isSelected", isSelected);
+ }
+
+ /**
+ *
+ * @param children
+ */
+ public void addChildren(VREFunctionalityModel[] children) {
+ for (int i = 0; i < children.length; i++) {
+ add(children[i]);
+ }
+ }
+
+ public String getId() {
+ return (String) get("id");
+ }
+
+ public String getName() {
+ return (String) get("name");
+ }
+
+ public String getNode() {
+ return (String) get("node");
+ }
+
+ public String getDescription() {
+ return (String) get("description");
+ }
+
+ public String toString() {
+ return getName();
+ }
+
+ public boolean isSelected() {
+ return ((Boolean) get("isSelected")).booleanValue();
+ }
+
+ public void setSelected(boolean selected) {
+ set("isSelected", selected);
+ }
+
+}
diff --git a/src/main/java/org/gcube/portlets/admin/vredeployer/client/util/CheckTimer.java b/src/main/java/org/gcube/portlets/admin/vredeployer/client/util/CheckTimer.java
new file mode 100644
index 0000000..1498ebd
--- /dev/null
+++ b/src/main/java/org/gcube/portlets/admin/vredeployer/client/util/CheckTimer.java
@@ -0,0 +1,99 @@
+
+package org.gcube.portlets.admin.vredeployer.client.util;
+
+import org.gcube.portlets.admin.vredeployer.client.VredeployerService;
+import org.gcube.portlets.admin.vredeployer.client.VredeployerServiceAsync;
+import org.gcube.portlets.admin.vredeployer.client.view.panels.builders.CloudDeployStatus;
+import org.gcube.portlets.admin.vredeployer.client.view.panels.builders.OverallDeployStatus;
+import org.gcube.portlets.admin.vredeployer.client.view.panels.builders.ResourcesDeployStatus;
+import org.gcube.portlets.admin.vredeployer.client.view.panels.builders.ServicesDeployStatus;
+import org.gcube.portlets.admin.vredeployer.shared.deployreport.ClientDeployReport;
+import org.gcube.portlets.admin.vredeployer.shared.deployreport.DeployStatus;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.user.client.Timer;
+import com.google.gwt.user.client.rpc.AsyncCallback;
+
+/**
+ * @author desperados
+ *
+ */
+public class CheckTimer {
+ /**
+ * delay in msec
+ */
+ public static int DELAY = 8000; // 5 sec
+
+ CloudDeployStatus cloudPanel;
+ ServicesDeployStatus resourceManagerPanel;
+ ResourcesDeployStatus resourceAndFuncPanel;
+ OverallDeployStatus overallPanel;
+
+
+ /**
+ * Create a remote service proxy to talk to the server-side Greeting service.
+ */
+ private final VredeployerServiceAsync deployerService = GWT.create(VredeployerService.class);
+ /**
+ * Constructor
+ * @param VREName VRE Name
+ */
+ public CheckTimer(
+ CloudDeployStatus cloudPanel,
+ ServicesDeployStatus resourceManagerPanel,
+ ResourcesDeployStatus resourceAndFuncPanel,
+ OverallDeployStatus overPanel) {
+
+ this.cloudPanel = cloudPanel;
+ this.resourceManagerPanel = resourceManagerPanel;
+ this.resourceAndFuncPanel = resourceAndFuncPanel;
+ this.overallPanel = overPanel;
+ }
+
+ private Timer t = new Timer(){
+ public void run(){
+ deployerService.checkCreateVRE(timeCallback);
+ }
+
+ };
+
+ /**
+ *
+ */
+ AsyncCallback timeCallback = new AsyncCallback(){
+
+ public void onSuccess(ClientDeployReport report) {
+
+ GWT.log("timeCallback");
+ //**** Updating Panels ****//
+ cloudPanel.updateReport(report.getCloudReport());
+ resourceManagerPanel.updateReport(report.getResourceManagerReport());
+ resourceAndFuncPanel.updateReport(report.getFunctionalityReport(), report.getResourcesReport());
+ overallPanel.updateReport(report);
+ if (report.getGlobalsStatus() == DeployStatus.FAIL || (report.getGlobalsStatus() == DeployStatus.FINISH) )
+ cancelScheduling() ;
+
+ }
+
+ public void onFailure(Throwable caught) {
+ GWT.log("timeCallback fails");
+ }
+
+ };
+
+
+ /**
+ * @param delayMillis delay
+ */
+ public void scheduleTimer(int seconds){
+ t.scheduleRepeating(seconds*1000);
+ }
+
+ /**
+ * Cancel scheduling
+ */
+ public void cancelScheduling() {
+ t.cancel();
+ }
+
+}
diff --git a/src/main/java/org/gcube/portlets/admin/vredeployer/client/util/DelayedOperation.java b/src/main/java/org/gcube/portlets/admin/vredeployer/client/util/DelayedOperation.java
new file mode 100644
index 0000000..93eeec7
--- /dev/null
+++ b/src/main/java/org/gcube/portlets/admin/vredeployer/client/util/DelayedOperation.java
@@ -0,0 +1,28 @@
+package org.gcube.portlets.admin.vredeployer.client.util;
+
+import com.google.gwt.user.client.Timer;
+
+public abstract class DelayedOperation {
+ public final void start(final int delayMills) {
+ Timer t = new Timer() {
+ @Override
+ public void run() {
+ doJob();
+ }
+ };
+ t.schedule(delayMills);
+ }
+
+ public final void loop(final int delayMills) {
+ Timer t = new Timer() {
+ @Override
+ public void run() {
+ doJob();
+ this.schedule(delayMills);
+ }
+ };
+ t.schedule(delayMills);
+ }
+
+ public abstract void doJob();
+}
diff --git a/src/main/java/org/gcube/portlets/admin/vredeployer/client/view/panels/CenterPanel.java b/src/main/java/org/gcube/portlets/admin/vredeployer/client/view/panels/CenterPanel.java
new file mode 100644
index 0000000..1987a9c
--- /dev/null
+++ b/src/main/java/org/gcube/portlets/admin/vredeployer/client/view/panels/CenterPanel.java
@@ -0,0 +1,366 @@
+package org.gcube.portlets.admin.vredeployer.client.view.panels;
+
+import java.util.List;
+
+import org.gcube.portlets.admin.vredeployer.client.VredeployerService;
+import org.gcube.portlets.admin.vredeployer.client.VredeployerServiceAsync;
+import org.gcube.portlets.admin.vredeployer.client.constants.ImagesConstants;
+import org.gcube.portlets.admin.vredeployer.client.control.Controller;
+import org.gcube.portlets.admin.vredeployer.client.model.VREFunctionalityModel;
+import org.gcube.portlets.admin.vredeployer.client.util.CheckTimer;
+import org.gcube.portlets.admin.vredeployer.client.view.panels.builders.CloudDeployStatus;
+import org.gcube.portlets.admin.vredeployer.client.view.panels.builders.GhnGrid;
+import org.gcube.portlets.admin.vredeployer.client.view.panels.builders.OverallDeployStatus;
+import org.gcube.portlets.admin.vredeployer.client.view.panels.builders.ResourcesDeployStatus;
+import org.gcube.portlets.admin.vredeployer.client.view.panels.builders.ServicesDeployStatus;
+import org.gcube.portlets.admin.vredeployer.shared.GHNBean;
+import org.gcube.portlets.admin.vredeployer.shared.GHNProfile;
+import org.gcube.portlets.admin.vredeployer.shared.VREDescrBean;
+
+import com.extjs.gxt.ui.client.Style.HorizontalAlignment;
+import com.extjs.gxt.ui.client.Style.Orientation;
+import com.extjs.gxt.ui.client.Style.SelectionMode;
+import com.extjs.gxt.ui.client.data.ModelData;
+import com.extjs.gxt.ui.client.data.ModelIconProvider;
+import com.extjs.gxt.ui.client.event.ButtonEvent;
+import com.extjs.gxt.ui.client.event.Events;
+import com.extjs.gxt.ui.client.event.Listener;
+import com.extjs.gxt.ui.client.event.SelectionListener;
+import com.extjs.gxt.ui.client.event.TreePanelEvent;
+import com.extjs.gxt.ui.client.store.TreeStore;
+import com.extjs.gxt.ui.client.util.IconHelper;
+import com.extjs.gxt.ui.client.util.Margins;
+import com.extjs.gxt.ui.client.widget.ContentPanel;
+import com.extjs.gxt.ui.client.widget.button.Button;
+import com.extjs.gxt.ui.client.widget.form.FieldSet;
+import com.extjs.gxt.ui.client.widget.form.FormPanel;
+import com.extjs.gxt.ui.client.widget.form.TextArea;
+import com.extjs.gxt.ui.client.widget.form.TextField;
+import com.extjs.gxt.ui.client.widget.layout.FitLayout;
+import com.extjs.gxt.ui.client.widget.layout.FlowData;
+import com.extjs.gxt.ui.client.widget.layout.FlowLayout;
+import com.extjs.gxt.ui.client.widget.layout.FormData;
+import com.extjs.gxt.ui.client.widget.layout.FormLayout;
+import com.extjs.gxt.ui.client.widget.layout.RowData;
+import com.extjs.gxt.ui.client.widget.layout.RowLayout;
+import com.extjs.gxt.ui.client.widget.treepanel.TreePanel;
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.user.client.rpc.AsyncCallback;
+import com.google.gwt.user.client.ui.AbstractImagePrototype;
+import com.google.gwt.user.client.ui.CellPanel;
+import com.google.gwt.user.client.ui.HTML;
+import com.google.gwt.user.client.ui.HorizontalPanel;
+
+public class CenterPanel extends ContentPanel {
+ /**
+ * Create a remote service proxy to talk to the server-side Greeting service.
+ */
+ private final VredeployerServiceAsync deployerService = GWT.create(VredeployerService.class);
+ /**
+ *
+ */
+ private Controller controller;
+ /**
+ *
+ */
+ private CheckTimer checkTimer = null;
+
+ private boolean showingSummary = false;
+ /**
+ *
+ * @param c -
+ */
+ public CenterPanel(Controller c) {
+ controller = c;
+ this.setHeading("");
+ this.setFrame(true);
+ this.setBodyStyle("backgroundColor: white;");
+ setButtonAlign(HorizontalAlignment.CENTER);
+ this.mask("Loading VRE definition for Approval", "loading-indicator");
+ }
+
+
+ /**
+ *
+ */
+ public void emptyPanel() {
+ this.removeAll();
+ }
+
+ /**
+ * view for description vre step
+ * @param vDesc
+ */
+ @SuppressWarnings("deprecation")
+ public void showVreDescription(VREDescrBean vDesc) {
+
+ FormData formData = new FormData("-20");
+
+ FormPanel form = new FormPanel();
+ form.setHeaderVisible(false);
+ form.setFrame(false);
+ form.setWidth("100%");
+ form.setLayout(new FlowLayout());
+
+ FieldSet fieldSet = new FieldSet();
+ fieldSet.setHeading("VRE Information");
+ //fieldSet.setCheckboxToggle(true);
+
+ FormLayout layout = new FormLayout();
+ layout.setLabelWidth(100);
+ fieldSet.setLayout(layout);
+
+ TextField vrename = new TextField();
+ vrename.setFieldLabel("Name");
+ vrename.setValue(vDesc.getName());
+ fieldSet.add(vrename, formData);
+
+ TextField vredesigner = new TextField();
+ vredesigner.setFieldLabel("Designer");
+ vredesigner.setValue(vDesc.getDesigner());
+ fieldSet.add(vredesigner, formData);
+
+ TextField vremanager = new TextField();
+ vremanager.setFieldLabel("Manager");
+ vremanager.setValue(vDesc.getManager());
+ fieldSet.add(vremanager, formData);
+
+ TextArea description = new TextArea();
+ description.setFieldLabel("Description");
+ description.setValue(vDesc.getDescription());
+ fieldSet.add(description, formData);
+
+ form.add(fieldSet);
+ form.setReadOnly(true);
+
+ fieldSet = new FieldSet();
+ fieldSet.setHeading("Life time");
+ fieldSet.setCollapsible(true);
+
+ layout = new FormLayout();
+ layout.setLabelWidth(100);
+ fieldSet.setLayout(layout);
+
+ TextField from = new TextField();
+ from.setFieldLabel("From");
+ from.setValue(vDesc.getStartTime().toGMTString());
+ fieldSet.add(from, formData);
+
+ TextField to = new TextField();
+ to.setFieldLabel("To");
+ to.setValue(vDesc.getEndTime().toGMTString());
+ fieldSet.add(to, formData);
+
+ form.add(fieldSet);
+ // form.setButtonAlign(HorizontalAlignment.CENTER);
+ // form.addButton(new Button("Save"));
+ // form.addButton(new Button("Cancel"));
+
+ this.add(form);
+ }
+
+
+ /**
+ * view for the functionality step
+ * @param root
+ */
+ public void showFunctionality(VREFunctionalityModel root) {
+ GWT.log("root func: " + root.getChildCount());
+ TreePanel tree;
+ TreeStore store = new TreeStore();
+ // The root node will not be shown
+ store.add(root.getChildren(), true);
+ tree = new TreePanel(store);
+ tree.setWidth(300);
+ tree.setDisplayProperty("name");
+ add(tree);
+ // Handles the selection
+ tree.getSelectionModel().setSelectionMode(SelectionMode.SINGLE);
+ // The icon decorator
+ tree.setIconProvider(
+ new ModelIconProvider() {
+ public AbstractImagePrototype getIcon(final ModelData model) {
+ if (model.get("node") != null && model.get("icon") != null) {
+ return IconHelper.createStyle((String) model.get("icon"));
+ }
+ return IconHelper.createStyle("defaultleaf-icon");
+ }
+ });
+ setLayout(new FitLayout());
+ tree.expandAll();
+ tree.setAutoExpand(true);
+
+ controller.setEastPanelContent(getInitFuncInfo());
+
+ tree.addListener(Events.OnClick, new Listener>() {
+
+ public void handleEvent(TreePanelEvent be) {
+ VREFunctionalityModel sm = (VREFunctionalityModel) be.getItem();
+ if (be.getType() == Events.OnClick) {
+ //do nothing
+ }
+ }
+ });
+ }
+
+ private ContentPanel getInitFuncInfo() {
+ ContentPanel cp = new ContentPanel();
+ cp.setHeaderVisible(false);
+ cp.setBodyBorder(false);
+ String toAdd = "Legend: ";
+ toAdd += "Selected Resource
";
+ toAdd += "Found Service
";
+ toAdd += "Missing Service
";
+ toAdd += "gHN
";
+ cp.add(new HTML(toAdd, true ));
+ cp.setStyleAttribute("margin", "10px");
+ cp.setLayout(new FitLayout());
+ return cp;
+ }
+ /**
+ * view for architecture step
+ * @param vDesc
+ */
+ public void showGHNList(final List ghnodes) {
+
+ GhnGrid ghnGrid = new GhnGrid(controller, ghnodes);
+ add(ghnGrid.getGrid());
+
+ setLayout(new FitLayout());
+ }
+
+
+ /**
+ * view for finalize step
+ * @param vDesc
+ */
+ public void showFinalize(VREDescrBean desc, GHNBean[] ghns, boolean isCloudSelected) {
+
+ ContentPanel cp = new ContentPanel(new FitLayout());
+ cp.setHeaderVisible(false);
+ String toShow = "";
+ if ( (ghns == null && (! isCloudSelected) ) ) {
+ toShow = "Step Architecture Selection is Missing ";
+ }
+ else {
+ unmask();
+ toShow = "" + desc.getName() + " is ready to be deployed. ";
+ toShow += " selected nodes:";
+
+ if (isCloudSelected) {
+ toShow += "
";
+ } else {
+ toShow += "
";
+
+ for (int i = 0; i < ghns.length; i++) {
+ if (ghns[i].isSelected())
+ toShow += " - "+ ghns[i].getHost()+ " (" + ghns[i].getCountry() + ") " ;
+ }
+ toShow += "
";
+ }
+ toShow += " click create button to start the creation process";
+
+ cp.add(new HTML(toShow, true));
+ cp.addButton(new Button("Create", new SelectionListener() {
+ @Override
+ public void componentSelected(ButtonEvent ce) {
+ controller.createVreButtonClicked();
+ }
+ }));
+ }
+ cp.setStyleAttribute("margin", "10px");
+ cp.add(new HTML(toShow, true));
+ add(cp);
+ setLayout(new FitLayout());
+ showingSummary = true;
+
+ }
+
+ /**
+ * view for finalize step
+ * @param vDesc
+ */
+ public void showReport() {
+ if (showingSummary) {
+ removeAll();
+ layout();
+ showingSummary = false;
+ }
+ this.remove(this.getHeader(), true);
+ ContentPanel panel = new ContentPanel();
+ panel.setLayout(new RowLayout(Orientation.VERTICAL));
+ //panel.setSize(400, 300);
+ panel.setFrame(false);
+ panel.setCollapsible(false);
+ panel.setHeaderVisible(false);
+
+
+ CloudDeployStatus cloudPanel = new CloudDeployStatus();
+ ServicesDeployStatus resourceManagerPanel = new ServicesDeployStatus();
+
+
+ CellPanel cellp = new HorizontalPanel();
+ cellp.setWidth("100%");
+
+ ContentPanel p1 = cloudPanel.getCloudDeployStatusPanel();
+ ContentPanel p2 = resourceManagerPanel.getServicesDeployStatusPanel();
+
+ cellp.add(p1);
+ cellp.add(p2);
+
+ cellp.setCellWidth(p1, "50%");
+ cellp.setCellWidth(p2, "50%");
+ cellp.setSpacing(5);
+
+ //two rows
+
+ panel.add(cellp, new RowData(1, -1, new Margins()));
+
+ CellPanel cellp2 = new HorizontalPanel();
+ cellp2.setWidth("100%");
+ ResourcesDeployStatus resourceAndFuncPanel = new ResourcesDeployStatus();
+ OverallDeployStatus overPanel = new OverallDeployStatus();
+
+ ContentPanel p3 = resourceAndFuncPanel.getResourcesDeployStatusPanel();
+ ContentPanel p4 = overPanel.getOverallDeployStatusPanel();
+
+
+ cellp2.add(p3);
+ cellp2.add(p4);
+
+ cellp2.setCellWidth(p3, "50%");
+ cellp2.setCellWidth(p4, "50%");
+ cellp2.setSpacing(5);
+
+
+ panel.add(cellp, new RowData(1, -1, new Margins()));
+ panel.add(cellp2, new RowData(1, -1, new Margins()));
+
+ //two rows
+ Button button = new Button("See textual report", new SelectionListener() {
+ @Override
+ public void componentSelected(ButtonEvent ce) {
+ mask("Retrieving Textual Report", "loading-indicator");
+ openTextualReport();
+ }
+ });
+
+ add(panel, new FlowData(0));
+ add(button, new FlowData(0));
+
+
+
+ layout();
+
+ /**
+ * starts the timer
+ */
+ CheckTimer reportTimer = new CheckTimer(cloudPanel, resourceManagerPanel, resourceAndFuncPanel, overPanel);
+ reportTimer.scheduleTimer(10);
+ }
+
+
+ private void openTextualReport() {
+ new ReportPanel(this);
+ }
+}
diff --git a/src/main/java/org/gcube/portlets/admin/vredeployer/client/view/panels/EastPanel.java b/src/main/java/org/gcube/portlets/admin/vredeployer/client/view/panels/EastPanel.java
new file mode 100644
index 0000000..6441d56
--- /dev/null
+++ b/src/main/java/org/gcube/portlets/admin/vredeployer/client/view/panels/EastPanel.java
@@ -0,0 +1,168 @@
+package org.gcube.portlets.admin.vredeployer.client.view.panels;
+
+import org.gcube.portlets.admin.vredeployer.client.constants.ImagesConstants;
+import org.gcube.portlets.admin.vredeployer.client.control.Controller;
+
+import com.extjs.gxt.ui.client.Style.HorizontalAlignment;
+import com.extjs.gxt.ui.client.Style.Orientation;
+import com.extjs.gxt.ui.client.event.ButtonEvent;
+import com.extjs.gxt.ui.client.event.Events;
+import com.extjs.gxt.ui.client.event.FieldEvent;
+import com.extjs.gxt.ui.client.event.Listener;
+import com.extjs.gxt.ui.client.event.SelectionListener;
+import com.extjs.gxt.ui.client.widget.ContentPanel;
+import com.extjs.gxt.ui.client.widget.HorizontalPanel;
+import com.extjs.gxt.ui.client.widget.Html;
+import com.extjs.gxt.ui.client.widget.LayoutContainer;
+import com.extjs.gxt.ui.client.widget.button.Button;
+import com.extjs.gxt.ui.client.widget.form.CheckBox;
+import com.extjs.gxt.ui.client.widget.form.CheckBoxGroup;
+import com.extjs.gxt.ui.client.widget.form.FieldSet;
+import com.extjs.gxt.ui.client.widget.form.FormPanel;
+import com.extjs.gxt.ui.client.widget.form.SimpleComboBox;
+import com.extjs.gxt.ui.client.widget.form.ComboBox.TriggerAction;
+import com.extjs.gxt.ui.client.widget.layout.FormData;
+import com.extjs.gxt.ui.client.widget.layout.FormLayout;
+import com.extjs.gxt.ui.client.widget.layout.RowData;
+import com.extjs.gxt.ui.client.widget.layout.RowLayout;
+import com.extjs.gxt.ui.client.widget.layout.TableData;
+import com.google.gwt.user.client.Window;
+import com.google.gwt.user.client.ui.Image;
+
+public class EastPanel extends ContentPanel {
+ /**
+ *
+ */
+ private Controller controller;
+
+ /**
+ * constructor
+ * @param c -
+ */
+ public EastPanel(Controller c) {
+
+ controller = c;
+ setWidth("100%");
+ setHeight("100%");
+ }
+
+ /**
+ *
+ */
+ public void showCloudPanel(boolean selected, int vmSelected) {
+ setHeading("deploy VRE Services on Cloud");
+
+
+ final Button saveButton = new Button("Commit changes");
+ saveButton.setEnabled(false);
+
+ removeAll();
+ unmask();
+ LayoutContainer toShow = new LayoutContainer();
+
+ HorizontalPanel hp = new HorizontalPanel();
+ hp.setWidth("100%");
+ hp.setTableWidth("100%");
+
+ TableData td = new TableData();
+ td.setHorizontalAlign(HorizontalAlignment.CENTER);
+
+ //toShow.setStyleAttribute("margin", "10px");
+ RowLayout rlayout = new RowLayout(Orientation.VERTICAL);
+ toShow.setLayout(rlayout);
+
+ String toAdd = "";
+ toAdd = "Cloud available
";
+
+
+ hp.add(new Html(toAdd), td);
+
+ HorizontalPanel hp2 = new HorizontalPanel();
+ hp2.setWidth("100%");
+ hp2.setTableWidth("100%");
+
+ hp2.add(new Image(ImagesConstants.CLOUD_IMAGE), td);
+
+ toShow.add(hp);
+ toShow.add(hp2);
+
+
+ FormData formData = new FormData("-20");
+
+ FormPanel form = new FormPanel();
+ form.setHeaderVisible(false);
+ form.setBorders(false);
+ form.setBodyBorder(false);
+ form.setFrame(false);
+ form.setWidth("100%");
+
+
+ FieldSet fieldSet = new FieldSet();
+ fieldSet.setHeading("Resources Setup");
+ //fieldSet.setCheckboxToggle(true);
+
+ FormLayout layout = new FormLayout();
+ layout.setLabelWidth(100);
+ fieldSet.setLayout(layout);
+
+
+
+ final CheckBox useCloud = new CheckBox();
+ useCloud.addListener(Events.Change, new Listener() {
+ public void handleEvent(FieldEvent be) {
+ boolean checked = useCloud.getValue();
+ controller.maskCenterPanel(checked);
+ saveButton.setEnabled(checked);
+ }
+ });
+
+
+ controller.maskCenterPanel(selected);
+ useCloud.setValue(selected);
+
+
+ useCloud.setBoxLabel("");
+
+ CheckBoxGroup checkGroup = new CheckBoxGroup();
+ checkGroup.setFieldLabel("Use Cloud");
+ checkGroup.add(useCloud);
+
+ final SimpleComboBox combo = new SimpleComboBox();
+ combo.setFieldLabel("Virtual machines");
+ combo.add("2");
+ combo.add("3");
+ combo.add("4");
+ combo.add("5");
+ combo.add("10");
+ combo.add("20");
+ combo.setTriggerAction(TriggerAction.ALL);
+ combo.setSimpleValue("2");
+ combo.setAllowBlank(false);
+ combo.setEditable(false);
+
+ if (vmSelected != -1) {
+ combo.setSimpleValue(""+vmSelected);
+ }
+
+ fieldSet.add(checkGroup, formData);
+ fieldSet.add(combo, formData);
+ form.add(fieldSet, formData);
+
+ form.addButton(saveButton);
+ saveButton.addSelectionListener(new SelectionListener() {
+ @Override
+ public void componentSelected(ButtonEvent ce) {
+ int vMachines = Integer.parseInt(combo.getSimpleValue());
+ controller.setCloudSelected(true, vMachines);
+
+ }
+ });
+
+ toShow.add(form, new RowData(-1, 165));
+
+
+ add(toShow);
+ layout();
+
+ }
+}
diff --git a/src/main/java/org/gcube/portlets/admin/vredeployer/client/view/panels/MainContainer.java b/src/main/java/org/gcube/portlets/admin/vredeployer/client/view/panels/MainContainer.java
new file mode 100644
index 0000000..af5d8da
--- /dev/null
+++ b/src/main/java/org/gcube/portlets/admin/vredeployer/client/view/panels/MainContainer.java
@@ -0,0 +1,121 @@
+package org.gcube.portlets.admin.vredeployer.client.view.panels;
+
+import org.gcube.portlets.admin.vredeployer.client.VREDeployerConstants;
+import org.gcube.portlets.admin.vredeployer.client.control.Controller;
+
+import com.extjs.gxt.ui.client.Style.LayoutRegion;
+import com.extjs.gxt.ui.client.util.Margins;
+import com.extjs.gxt.ui.client.widget.ContentPanel;
+import com.extjs.gxt.ui.client.widget.LayoutContainer;
+import com.extjs.gxt.ui.client.widget.layout.BorderLayout;
+import com.extjs.gxt.ui.client.widget.layout.BorderLayoutData;
+import com.extjs.gxt.ui.client.widget.layout.FitLayout;
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.user.client.Element;
+import com.google.gwt.user.client.ui.HTML;
+
+
+/**
+ *
+ * @author Massimiliano Assante - ISTI-CNR
+ *
+ */
+public class MainContainer extends LayoutContainer {
+
+ final BorderLayout layout = new BorderLayout();
+
+ private WestPanel west;
+ private CenterPanel center;
+ private EastPanel east;
+ private Controller controller;
+
+ public MainContainer(Controller c) {
+ controller = c;
+ west = new WestPanel(controller);
+ center = new CenterPanel(controller);
+ east = new EastPanel(controller);
+ }
+
+ protected void onRender(Element target, int index) {
+ super.onRender(target, index);
+
+ setLayout(layout);
+ setStyleAttribute("padding", "2px");
+
+
+ BorderLayoutData westData = new BorderLayoutData(LayoutRegion.WEST, 150);
+ westData.setSplit(true);
+ westData.setMargins(new Margins(0, 5, 0, 0));
+ westData.setCollapsible(false);
+
+
+ BorderLayoutData centerData = new BorderLayoutData(LayoutRegion.CENTER);
+ centerData.setSplit(false);
+ centerData.setCollapsible(false);
+ centerData.setMargins(new Margins(0));
+
+ BorderLayoutData eastData = new BorderLayoutData(LayoutRegion.EAST, 350);
+ eastData.setSplit(true);
+ eastData.setCollapsible(true);
+ eastData.setMargins(new Margins(0,0,0,5));
+
+ BorderLayoutData northData = new BorderLayoutData(LayoutRegion.NORTH, 100);
+ northData.setCollapsible(false);
+ northData.setFloatable(true);
+ northData.setHideCollapseTool(false);
+ northData.setSplit(false);
+ northData.setMargins(new Margins(0, 0, 5, 0));
+
+ //add(north, northData);
+ add(west, westData);
+ add(center, centerData);
+ add(east, eastData);
+
+ east.setIcon(VREDeployerConstants.ICONS.inforpanel());
+ }
+
+ @Override
+ protected void onAfterLayout() {
+ super.onAfterLayout();
+ east.collapse();
+ }
+
+ /**
+ *
+ * @return -
+ */
+ public WestPanel getWestPanel() {
+ return west;
+ }
+
+ /**
+ *
+ * @return -
+ */
+ public CenterPanel getCenterPanel() {
+ return center;
+ }
+ /**
+ *
+ * @return -
+ */
+ public EastPanel getEastPanel() {
+ return east;
+ }
+
+
+ /**
+ *
+ * @param show
+ */
+ public void showEastPanel(boolean show) {
+ east.show();
+ if (show && east.isCollapsed()) {
+ layout.expand(LayoutRegion.EAST);
+ }
+ else if (!show && east.isExpanded())
+ layout.collapse(LayoutRegion.EAST);
+
+ }
+}
+
\ No newline at end of file
diff --git a/src/main/java/org/gcube/portlets/admin/vredeployer/client/view/panels/NorthPanel.java b/src/main/java/org/gcube/portlets/admin/vredeployer/client/view/panels/NorthPanel.java
new file mode 100644
index 0000000..97c8907
--- /dev/null
+++ b/src/main/java/org/gcube/portlets/admin/vredeployer/client/view/panels/NorthPanel.java
@@ -0,0 +1,11 @@
+package org.gcube.portlets.admin.vredeployer.client.view.panels;
+
+import com.extjs.gxt.ui.client.widget.ContentPanel;
+
+public class NorthPanel extends ContentPanel {
+
+ public NorthPanel() {
+ setWidth("100%");
+ }
+
+}
diff --git a/src/main/java/org/gcube/portlets/admin/vredeployer/client/view/panels/ReportPanel.java b/src/main/java/org/gcube/portlets/admin/vredeployer/client/view/panels/ReportPanel.java
new file mode 100644
index 0000000..0d307be
--- /dev/null
+++ b/src/main/java/org/gcube/portlets/admin/vredeployer/client/view/panels/ReportPanel.java
@@ -0,0 +1,69 @@
+package org.gcube.portlets.admin.vredeployer.client.view.panels;
+
+
+import org.gcube.portlets.admin.vredeployer.client.VredeployerService;
+import org.gcube.portlets.admin.vredeployer.client.VredeployerServiceAsync;
+
+import com.extjs.gxt.ui.client.event.ButtonEvent;
+import com.extjs.gxt.ui.client.event.SelectionListener;
+import com.extjs.gxt.ui.client.widget.ContentPanel;
+import com.extjs.gxt.ui.client.widget.Html;
+import com.extjs.gxt.ui.client.widget.Info;
+import com.extjs.gxt.ui.client.widget.Window;
+import com.extjs.gxt.ui.client.widget.button.Button;
+import com.extjs.gxt.ui.client.widget.layout.FitLayout;
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.user.client.rpc.AsyncCallback;
+import com.google.gwt.user.client.ui.HTML;
+import com.google.gwt.user.client.ui.ScrollPanel;
+
+public class ReportPanel {
+ private final VredeployerServiceAsync deployerService = GWT.create(VredeployerService.class);
+
+ public ReportPanel(final CenterPanel myPanel) {
+
+ deployerService.getHTMLReport(new AsyncCallback() {
+
+ public void onSuccess(String result) {
+ final Window window = new Window();
+ window.setSize(600, 350);
+ window.setPlain(true);
+ window.setModal(true);
+ window.setBlinkModal(true);
+ window.setHeading("Textual Report");
+
+ ContentPanel cp = new ContentPanel();
+ cp.setHeaderVisible(false);
+
+ ScrollPanel scroller = new ScrollPanel();
+ scroller.setSize("600", "300");
+ scroller.add(new Html(result));
+
+ cp.add(scroller);
+
+ cp.setLayout(new FitLayout());
+
+ window.add(cp);
+ window.setLayout(new FitLayout());
+ window.addButton(new Button("Close", new SelectionListener() {
+ @Override
+ public void componentSelected(ButtonEvent ce) {
+ window.hide();
+ }
+ }));
+
+ cp.layout();
+ myPanel.unmask();
+ window.show();
+ }
+
+ public void onFailure(Throwable caught) {
+ myPanel.unmask();
+ Info.display("Error", "Could not locate textual report");
+
+ }
+ });
+ }
+
+
+}
diff --git a/src/main/java/org/gcube/portlets/admin/vredeployer/client/view/panels/WestPanel.java b/src/main/java/org/gcube/portlets/admin/vredeployer/client/view/panels/WestPanel.java
new file mode 100644
index 0000000..f5b1edc
--- /dev/null
+++ b/src/main/java/org/gcube/portlets/admin/vredeployer/client/view/panels/WestPanel.java
@@ -0,0 +1,92 @@
+package org.gcube.portlets.admin.vredeployer.client.view.panels;
+
+import org.gcube.portlets.admin.vredeployer.client.control.Controller;
+import org.gcube.portlets.admin.vredeployer.client.model.AtomicTreeNode;
+import org.gcube.portlets.admin.vredeployer.client.model.NodeType;
+
+import com.extjs.gxt.ui.client.Style.SelectionMode;
+import com.extjs.gxt.ui.client.data.ModelData;
+import com.extjs.gxt.ui.client.data.ModelIconProvider;
+import com.extjs.gxt.ui.client.event.Events;
+import com.extjs.gxt.ui.client.event.Listener;
+import com.extjs.gxt.ui.client.event.TreePanelEvent;
+import com.extjs.gxt.ui.client.store.TreeStore;
+import com.extjs.gxt.ui.client.util.IconHelper;
+import com.extjs.gxt.ui.client.widget.ContentPanel;
+import com.extjs.gxt.ui.client.widget.treepanel.TreePanel;
+import com.google.gwt.user.client.ui.AbstractImagePrototype;
+
+
+public class WestPanel extends ContentPanel {
+
+ private Controller controller;
+ private TreePanel tree;
+
+ final AtomicTreeNode info = new AtomicTreeNode("Info", "Info", "info-icon", NodeType.INFO);
+ final AtomicTreeNode func = new AtomicTreeNode("Functionality", "Functionality", "functionality-icon",NodeType.FUNCTIONALITY);
+ final AtomicTreeNode arch = new AtomicTreeNode("Architecture", "Architecture", "architecture-icon",NodeType.ARCHITECTURE);
+ final AtomicTreeNode finalize = new AtomicTreeNode("Finalize", "Finalize", "play-icon",NodeType.REPORT);
+
+ public WestPanel(Controller c) {
+
+ controller = c;
+
+ AtomicTreeNode root = new AtomicTreeNode("root");
+
+ root.add(info);
+ //root.add(metadata);
+ root.add(func);
+ root.add(arch);
+ root.add(finalize);
+
+
+
+ TreeStore store = new TreeStore();
+ // The root node will not be shown
+ store.add(root.getChildren(), true);
+ tree = new TreePanel(store);
+ tree.setWidth(300);
+ tree.setDisplayProperty("name");
+
+ add(tree);
+
+
+ // The icon decorator
+ tree.setIconProvider(
+ new ModelIconProvider() {
+ public AbstractImagePrototype getIcon(final ModelData model) {
+ if (model.get("node") != null && model.get("icon") != null) {
+ return IconHelper.createStyle((String) model.get("icon"));
+ }
+ return IconHelper.createStyle("defaultleaf-icon");
+ }
+ });
+
+ // Handles the selection
+ tree.getSelectionModel().setSelectionMode(SelectionMode.SINGLE);
+
+ tree.addListener(Events.OnClick, new Listener>() {
+
+ public void handleEvent(TreePanelEvent be) {
+ if (be.getType() == Events.OnClick) {
+ AtomicTreeNode selectedModel = (AtomicTreeNode) be.getItem();
+ controller.treeItemClicked(selectedModel);
+ }
+ }
+ });
+
+
+ }
+
+ /**
+ *
+ */
+ public void setDefaultSelected() {
+ tree.getSelectionModel().select(true, info);
+ controller.setDefaultTreeItemSelected();
+ }
+
+ public void disable() {
+ removeAll();
+ }
+}
diff --git a/src/main/java/org/gcube/portlets/admin/vredeployer/client/view/panels/builders/CloudDeployStatus.java b/src/main/java/org/gcube/portlets/admin/vredeployer/client/view/panels/builders/CloudDeployStatus.java
new file mode 100644
index 0000000..da86e9f
--- /dev/null
+++ b/src/main/java/org/gcube/portlets/admin/vredeployer/client/view/panels/builders/CloudDeployStatus.java
@@ -0,0 +1,94 @@
+package org.gcube.portlets.admin.vredeployer.client.view.panels.builders;
+
+import java.util.List;
+
+import org.gcube.portlets.admin.vredeployer.client.charts.CloudChart;
+import org.gcube.portlets.admin.vredeployer.client.util.DelayedOperation;
+import org.gcube.portlets.admin.vredeployer.shared.deployreport.ClientCloudReport;
+import org.gcube.portlets.admin.vredeployer.shared.deployreport.DeployStatus;
+
+import com.extjs.gxt.charts.client.Chart;
+import com.extjs.gxt.ui.client.widget.ContentPanel;
+import com.extjs.gxt.ui.client.widget.Html;
+import com.extjs.gxt.ui.client.widget.layout.FitLayout;
+
+/**
+ *
+ * @author massi
+ *
+ */
+public class CloudDeployStatus {
+
+ private ContentPanel cp;
+ boolean chartAdded = false;
+ CloudChart cloudChart;
+ Chart myChart;
+
+ public CloudDeployStatus() {
+ cp = new ContentPanel(new FitLayout());
+ }
+
+ /**
+ *
+ */
+ public void createReport() {
+ cp.removeAll();
+ cloudChart = new CloudChart();
+
+ }
+
+ public void updateReport(ClientCloudReport report) {
+ cp.unmask();
+ final DeployStatus cloudStatus = report.getStatus();
+ if (cloudStatus == DeployStatus.SKIP) {
+ cp.setHeading("Cloud machines setup was skipped");
+ cp.add(new Html("Cloud deploy was not selected for this VRE"));
+ cp.layout();
+ }
+ else {
+ final List singleMachines = report.getItemsStatuses();
+ if (! chartAdded) {
+ createReport();
+ chartAdded = true;
+ myChart = cloudChart.getChart();
+ myChart.setChartModel(cloudChart.getChartModel(cloudStatus, singleMachines));
+ cp.add(myChart);
+
+ cp.layout();
+ }
+ else {
+ if (report.getStatus() != DeployStatus.FINISH) {
+ cp.mask("Retrieving data", "loading-indicator");
+ DelayedOperation delay = new DelayedOperation() {
+ @Override
+ public void doJob() {
+ cp.unmask();
+ myChart.setChartModel(cloudChart.getChartModel(cloudStatus, singleMachines));
+ myChart.refresh();
+ }
+ };
+ delay.start(1500);
+ }
+ else {
+ cp.unmask();
+ myChart.setChartModel(cloudChart.getChartModel(cloudStatus, singleMachines));
+ myChart.refresh();
+ }
+
+ }
+ }
+ }
+ /**
+ *
+ * @return
+ */
+ public ContentPanel getCloudDeployStatusPanel() {
+ cp.setHeaderVisible(true);
+ cp.setHeading("Cloud machines setup");
+ cp.setHeight(250);
+ cp.setBorders(true);
+ cp.mask("Retrieving data", "loading-indicator");
+
+ return cp;
+ }
+}
diff --git a/src/main/java/org/gcube/portlets/admin/vredeployer/client/view/panels/builders/GhnGrid.java b/src/main/java/org/gcube/portlets/admin/vredeployer/client/view/panels/builders/GhnGrid.java
new file mode 100644
index 0000000..d72c474
--- /dev/null
+++ b/src/main/java/org/gcube/portlets/admin/vredeployer/client/view/panels/builders/GhnGrid.java
@@ -0,0 +1,252 @@
+package org.gcube.portlets.admin.vredeployer.client.view.panels.builders;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.gcube.portlets.admin.vredeployer.client.control.Controller;
+import org.gcube.portlets.admin.vredeployer.shared.GHNBean;
+import org.gcube.portlets.admin.vredeployer.shared.GHNProfile;
+import org.gcube.portlets.admin.vredeployer.shared.RunningInstance;
+
+import com.extjs.gxt.ui.client.Style.HorizontalAlignment;
+import com.extjs.gxt.ui.client.Style.SortDir;
+import com.extjs.gxt.ui.client.data.ModelData;
+import com.extjs.gxt.ui.client.event.ButtonEvent;
+import com.extjs.gxt.ui.client.event.GridEvent;
+import com.extjs.gxt.ui.client.event.SelectionListener;
+import com.extjs.gxt.ui.client.store.ListStore;
+import com.extjs.gxt.ui.client.widget.ContentPanel;
+import com.extjs.gxt.ui.client.widget.MessageBox;
+import com.extjs.gxt.ui.client.widget.button.Button;
+import com.extjs.gxt.ui.client.widget.form.CheckBox;
+import com.extjs.gxt.ui.client.widget.grid.CellEditor;
+import com.extjs.gxt.ui.client.widget.grid.CheckColumnConfig;
+import com.extjs.gxt.ui.client.widget.grid.ColumnConfig;
+import com.extjs.gxt.ui.client.widget.grid.ColumnModel;
+import com.extjs.gxt.ui.client.widget.grid.Grid;
+import com.extjs.gxt.ui.client.widget.layout.FitLayout;
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.user.client.ui.HTML;
+/**
+ *
+ * @author massi
+ *
+ */
+public class GhnGrid {
+
+ private List myGHNList;
+ private Controller controller;
+
+ public GhnGrid(Controller controller, List list) {
+ myGHNList = list;
+ this.controller = controller;
+ }
+
+ public List getGHNList() {
+ return myGHNList;
+ }
+
+ public ContentPanel getGrid() {
+ List toShow = new ArrayList();
+
+ for (GHNProfile p : myGHNList) {
+ toShow.add(new GHNBean(p.getId(), p.getHost(), p.getMemory().getVirtualAvailable(),
+ p.getSite().getDomain(), p.isSelected(), p.getMemory().getLocalAvailableSpace(),
+ p.getSite().getLocation(), p.getSite().getCountry(), p.isSecure()));
+ }
+
+
+ List configs = new ArrayList();
+
+ ColumnConfig column = new ColumnConfig();
+
+ column.setId("id");
+ column.setHeader("ID");
+ column.setWidth(50);
+ column.setHidden(true);
+ configs.add(column);
+
+ column = new ColumnConfig();
+ column.setId("host");
+ column.setHeader("Host name");
+ column.setWidth(150);
+ configs.add(column);
+
+ column = new ColumnConfig();
+ column.setId("domain");
+ column.setHeader("Domain");
+ column.setHidden(true);
+ column.setWidth(150);
+ configs.add(column);
+
+ column = new ColumnConfig();
+ column.setId("memory");
+ column.setHeader("mem avail.");
+ column.setAlignment(HorizontalAlignment.CENTER);
+ column.setWidth(40);
+ configs.add(column);
+
+ column = new ColumnConfig();
+ column.setId("diskspace");
+ column.setHeader("disk avail.");
+ column.setAlignment(HorizontalAlignment.CENTER);
+ column.setHidden(false);
+ column.setWidth(50);
+ configs.add(column);
+
+ column = new ColumnConfig();
+ column.setId("country");
+ column.setHeader("Country");
+ column.setAlignment(HorizontalAlignment.CENTER);
+ column.setHidden(true);
+ column.setWidth(50);
+ configs.add(column);
+
+ column = new ColumnConfig();
+ column.setId("location");
+ column.setHeader("Location");
+ column.setHidden(true);
+ column.setAlignment(HorizontalAlignment.CENTER);
+ column.setWidth(50);
+ configs.add(column);
+
+ column = new ColumnConfig();
+ column.setId("isSecure");
+ column.setHeader("isSecure");
+ column.setAlignment(HorizontalAlignment.CENTER);
+ column.setHidden(true);
+ column.setWidth(40);
+ configs.add(column);
+
+ CheckColumnConfig checkColumn = new CheckColumnConfig("isSelected", "isSelected", 35) {
+ @Override
+ protected void onMouseDown(final GridEvent ge) {
+ super.onMouseDown(ge);
+ GHNBean bean = (GHNBean) ge.getModel();
+ showGHNAdditionalInfo(bean.getId(), myGHNList);
+ }
+ };
+ checkColumn.setHeader("Select");
+ checkColumn.setAlignment(HorizontalAlignment.CENTER);
+
+ CheckBox checkbox = new CheckBox();
+
+ CellEditor checkBoxEditor = new CellEditor(checkbox);
+
+ checkColumn.setEditor(checkBoxEditor);
+ configs.add(checkColumn);
+
+ final ColumnModel cm = new ColumnModel(configs);
+
+ /**
+ * load the grid data
+ */
+ final ListStore store = new ListStore();
+ //store.groupBy("domain");
+ store.sort("isSelectable", SortDir.DESC);
+ store.add(toShow);
+
+ Grid grid = new Grid(store, cm);
+
+ grid.addPlugin(checkColumn);
+ grid.setStyleAttribute("borderTop", "none");
+ grid.setAutoExpandColumn("host");
+ grid.setBorders(true);
+ grid.setStripeRows(true);
+ grid.getView().setForceFit(true);
+
+ ContentPanel gridPanel = new ContentPanel(new FitLayout());
+ gridPanel.setHeaderVisible(false);
+ gridPanel.add(grid);
+
+
+ gridPanel.addButton(new Button("Reset", new SelectionListener() {
+ @Override
+ public void componentSelected(ButtonEvent ce) {
+ store.rejectChanges();
+ }
+ }));
+
+
+
+ gridPanel.addButton(new Button("Commit changes", new SelectionListener() {
+ @Override
+ public void componentSelected(ButtonEvent ce) {
+ List ghns = store.getModels();
+
+ int selectedCounter = 0;
+ for (GHNBean ghn : ghns)
+ if (ghn.isSelected())
+ selectedCounter++;
+
+ if (selectedCounter < 1)
+ MessageBox.alert("Alert", "At least one node must be added for deploying ", null);
+ else {
+ GHNBean[] selectedGHNIds = new GHNBean[selectedCounter];
+ //get the selected ghnID
+ int j = 0;
+ for (int i = 0; i < ghns.size(); i++)
+ if (ghns.get(i).isSelected()) {
+ selectedGHNIds[j] = ghns.get(i);;
+ j++;
+ }
+
+ GWT.log("Storing GHN List");
+ store.commitChanges();
+ controller.setGHNsSelected(selectedGHNIds);
+ }
+
+ }
+ }));
+ return gridPanel;
+ }
+
+ /**
+ *
+ * @param ghnID
+ * @param ghnodes
+ */
+ private void showGHNAdditionalInfo(String ghnID, List ghnodes) {
+ for (GHNProfile ghn : ghnodes) {
+ if (ghn.getId().compareTo(ghnID) == 0) {
+ ContentPanel cp = new ContentPanel();
+ cp.setHeaderVisible(false);
+ cp.setBodyBorder(false);
+ String toAdd = "" + ghn.getHost() + " ";
+
+ toAdd += "Site: ";
+ toAdd += "";
+ toAdd += " - Location: " + ghn.getSite().getLocation() + " " ;
+ toAdd += " - Country: " + ghn.getSite().getCountry() + " " ;
+ toAdd += " - Domain: " + ghn.getSite().getDomain() + " " ;
+
+ toAdd += " ";
+
+ toAdd += "Running Instances: ";
+
+ List ris = ghn.getRunningInstances();
+
+ if (ris != null) {
+ toAdd += "";
+ for (RunningInstance ri : ris) {
+ toAdd += " - "+ ri.getName()+ " (" + ri.getServiceClass() + ") " ;
+ }
+ if (ris.size() == 0)
+ toAdd += " - none " ;
+ toAdd += " ";
+ }
+
+
+ cp.add(new HTML(toAdd, true ));
+ cp.setStyleAttribute("margin", "10px");
+ cp.setLayout(new FitLayout());
+ controller.setEastPanelContent(cp);
+ break;
+ }
+
+ }
+
+
+ }
+}
+
diff --git a/src/main/java/org/gcube/portlets/admin/vredeployer/client/view/panels/builders/OverallDeployStatus.java b/src/main/java/org/gcube/portlets/admin/vredeployer/client/view/panels/builders/OverallDeployStatus.java
new file mode 100644
index 0000000..9199bf7
--- /dev/null
+++ b/src/main/java/org/gcube/portlets/admin/vredeployer/client/view/panels/builders/OverallDeployStatus.java
@@ -0,0 +1,125 @@
+package org.gcube.portlets.admin.vredeployer.client.view.panels.builders;
+
+import org.gcube.portlets.admin.vredeployer.client.util.DelayedOperation;
+import org.gcube.portlets.admin.vredeployer.client.view.panels.ReportPanel;
+import org.gcube.portlets.admin.vredeployer.shared.deployreport.ClientDeployReport;
+import org.gcube.portlets.admin.vredeployer.shared.deployreport.DeployStatus;
+
+import com.extjs.gxt.ui.client.event.ButtonEvent;
+import com.extjs.gxt.ui.client.event.SelectionListener;
+import com.extjs.gxt.ui.client.widget.ContentPanel;
+import com.extjs.gxt.ui.client.widget.ProgressBar;
+import com.extjs.gxt.ui.client.widget.button.Button;
+import com.extjs.gxt.ui.client.widget.layout.CenterLayout;
+import com.extjs.gxt.ui.client.widget.layout.FitLayout;
+import com.extjs.gxt.ui.client.widget.layout.FlowLayout;
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.user.client.Window;
+
+public class OverallDeployStatus {
+ /**
+ *
+ */
+ private ContentPanel cp;
+ boolean barAdded = false;
+ ProgressBar bar;
+ /**
+ *
+ */
+ public OverallDeployStatus() {
+ cp = new ContentPanel(new FitLayout());
+ cp.setLayout(new CenterLayout());
+ }
+
+ private int getStatusDependingOnOtherSteps(ClientDeployReport report) {
+ int cloudStep = 0;
+ if (report.getCloudReport().getStatus() != null) {
+ if (report.getCloudReport().getStatus() == DeployStatus.FINISH || report.getCloudReport().getStatus() == DeployStatus.SKIP)
+ cloudStep = 25;
+ }
+ int resourceManagerStep = 0;
+ if (report.getResourceManagerReport().getStatus() != null) {
+ if (report.getResourceManagerReport().getStatus() == DeployStatus.FINISH)
+ resourceManagerStep = 25;
+ }
+ int funcStep = 0;
+ if (report.getFunctionalityReport().getStatus() != null) {
+ if (report.getFunctionalityReport().getStatus() == DeployStatus.FINISH)
+ funcStep = 25;
+ }
+ int genresStep = 0;
+ if (report.getResourcesReport().getStatus() != null) {
+ if (report.getResourcesReport().getStatus() == DeployStatus.FINISH)
+ genresStep = 25;
+ }
+ return cloudStep + resourceManagerStep + funcStep + genresStep;
+ }
+ /**
+ *
+ * @param funcReport
+ * @param resourcesReport
+ */
+ public void updateReport(ClientDeployReport report) {
+
+ cp.unmask();
+ DeployStatus overallStatus = report.getGlobalsStatus();
+ GWT.log("overallStatus: " + overallStatus);
+ int i = getStatusDependingOnOtherSteps(report);
+ String label = "% Complete";
+
+ if (! barAdded) {
+ createReport();
+ barAdded = true;
+ bar.updateProgress(0, " not started yet");
+ cp.add(bar);
+ bar.setWidth("90%");
+
+ cp.layout();
+ }
+ else {
+ if (report.getGlobalsStatus() != DeployStatus.FINISH || report.getGlobalsStatus() != DeployStatus.FAIL) {
+ cp.mask("Retrieving data", "loading-indicator");
+ DelayedOperation delay = new DelayedOperation() {
+ @Override
+ public void doJob() {
+ cp.unmask();
+ }
+ };
+ delay.start(1500);
+ }
+ bar.setWidth("90%");
+ bar.updateProgress((i/100), (int )i +label);
+ cp.layout();
+ }
+ if (report.getGlobalsStatus() == DeployStatus.FAIL || report.getGlobalsStatus() == DeployStatus.FINISH) {
+ Window.alert("VRE Deploying report completed: " + report.getGlobalsStatus() );
+ bar.setWidth("90%");
+ i = 100;
+ bar.updateProgress((i/100), (int )i +label);
+ cp.layout();
+ }
+ }
+
+ /**
+ *
+ */
+ public void createReport() {
+ cp.removeAll();
+ bar = new ProgressBar();
+
+ }
+
+ /**
+ *
+ * @return
+ */
+ public ContentPanel getOverallDeployStatusPanel() {
+ cp.setHeaderVisible(true);
+ cp.setHeading("Overall deploying status");
+ cp.setHeight(250);
+ cp.setBorders(true);
+ cp.mask("Retrieving data", "loading-indicator");
+
+ return cp;
+ }
+}
diff --git a/src/main/java/org/gcube/portlets/admin/vredeployer/client/view/panels/builders/ResourcesDeployStatus.java b/src/main/java/org/gcube/portlets/admin/vredeployer/client/view/panels/builders/ResourcesDeployStatus.java
new file mode 100644
index 0000000..3f481bb
--- /dev/null
+++ b/src/main/java/org/gcube/portlets/admin/vredeployer/client/view/panels/builders/ResourcesDeployStatus.java
@@ -0,0 +1,106 @@
+package org.gcube.portlets.admin.vredeployer.client.view.panels.builders;
+
+import java.util.List;
+
+import org.gcube.portlets.admin.vredeployer.client.charts.FunctionalityChart;
+import org.gcube.portlets.admin.vredeployer.client.util.DelayedOperation;
+import org.gcube.portlets.admin.vredeployer.shared.deployreport.ClientCloudReport;
+import org.gcube.portlets.admin.vredeployer.shared.deployreport.ClientFunctionalityDeployReport;
+import org.gcube.portlets.admin.vredeployer.shared.deployreport.ClientResourcesDeployReport;
+import org.gcube.portlets.admin.vredeployer.shared.deployreport.DeployStatus;
+
+import com.extjs.gxt.charts.client.Chart;
+import com.extjs.gxt.ui.client.widget.ContentPanel;
+import com.extjs.gxt.ui.client.widget.ProgressBar;
+import com.extjs.gxt.ui.client.widget.layout.FitLayout;
+
+public class ResourcesDeployStatus {
+ private ContentPanel cp;
+ boolean chartAdded = false;
+ FunctionalityChart funcChart;
+ Chart myChart;
+ /**
+ *
+ */
+ public ResourcesDeployStatus() {
+ cp = new ContentPanel(new FitLayout());
+ }
+ /**
+ *
+ * @param funcReport
+ * @param resourcesReport
+ */
+ public void updateReport(final ClientFunctionalityDeployReport funcReport, ClientResourcesDeployReport resourcesReport) {
+ cp.unmask();
+ if (! chartAdded) {
+ createReport();
+ chartAdded = true;
+ myChart = funcChart.getChart();
+ myChart.setChartModel(funcChart.getChartModel(funcReport));
+ cp.add(myChart);
+ cp.layout();
+ }
+ else {
+
+ if (funcReport.getStatus() != DeployStatus.FINISH) {
+ cp.mask("Retrieving data", "loading-indicator");
+ DelayedOperation delay = new DelayedOperation() {
+ @Override
+ public void doJob() {
+ cp.unmask();
+ myChart.setChartModel(funcChart.getChartModel(funcReport));
+ myChart.refresh();
+ }
+ };
+ delay.start(1500);
+ }
+ else {
+ cp.unmask();
+ myChart.setChartModel(funcChart.getChartModel(funcReport));
+ myChart.refresh();
+ }
+ }
+ }
+
+ /**
+ *
+ */
+ public void createReport() {
+ cp.removeAll();
+ funcChart = new FunctionalityChart();
+ }
+ /**
+ *
+ * @param report
+ */
+ public void updateReport(ClientFunctionalityDeployReport report) {
+ cp.unmask();
+ DeployStatus status = report.getStatus();
+
+ if (! chartAdded) {
+ createReport();
+ chartAdded = true;
+ myChart = funcChart.getChart();
+ myChart.setChartModel(funcChart.getChartModel(report));
+ cp.add(myChart);
+ cp.layout();
+ }
+ else {
+ myChart.setChartModel(funcChart.getChartModel(report));
+ myChart.refresh();
+ }
+ }
+ /**
+ *
+ * @return
+ */
+ public ContentPanel getResourcesDeployStatusPanel() {
+ cp.setHeaderVisible(true);
+ cp.setHeading("Functionality deploying");
+ cp.setHeight(250);
+ cp.setBorders(true);
+ cp.mask("Retrieving data", "loading-indicator");
+
+ return cp;
+ }
+}
diff --git a/src/main/java/org/gcube/portlets/admin/vredeployer/client/view/panels/builders/ServicesDeployStatus.java b/src/main/java/org/gcube/portlets/admin/vredeployer/client/view/panels/builders/ServicesDeployStatus.java
new file mode 100644
index 0000000..72c7ae4
--- /dev/null
+++ b/src/main/java/org/gcube/portlets/admin/vredeployer/client/view/panels/builders/ServicesDeployStatus.java
@@ -0,0 +1,107 @@
+package org.gcube.portlets.admin.vredeployer.client.view.panels.builders;
+
+import java.util.List;
+
+import org.gcube.portlets.admin.vredeployer.client.charts.CloudChart;
+import org.gcube.portlets.admin.vredeployer.client.util.DelayedOperation;
+import org.gcube.portlets.admin.vredeployer.shared.deployreport.ClientResourceManagerDeployingReport;
+import org.gcube.portlets.admin.vredeployer.shared.deployreport.DeployStatus;
+
+import com.extjs.gxt.ui.client.widget.ContentPanel;
+import com.extjs.gxt.ui.client.widget.ProgressBar;
+import com.extjs.gxt.ui.client.widget.layout.CenterLayout;
+import com.extjs.gxt.ui.client.widget.layout.FitLayout;
+import com.google.gwt.user.client.Window;
+
+public class ServicesDeployStatus {
+ private ContentPanel cp;
+
+ boolean barAdded = false;
+ ProgressBar bar;
+
+ public ServicesDeployStatus() {
+ cp = new ContentPanel(new FitLayout());
+ cp.setLayout(new CenterLayout());
+ }
+
+ public void updateReport(ClientResourceManagerDeployingReport report) {
+ cp.unmask();
+ DeployStatus managerStatus = report.getStatus();
+ int i = 0;
+ String label = "% Complete";
+ switch (managerStatus) {
+ case FAIL:
+ label = "% Failure, see textual report";
+ i = 0;
+ break;
+ case RUN:
+ i = 50;
+ break;
+ case WAIT:
+ label = "% not started yet";
+ i = 0;
+ break;
+ case FINISH:
+ label = "% Complete";
+ i = 100;
+ break;
+
+ default:
+ break;
+ }
+
+ if (! barAdded) {
+ createReport();
+ barAdded = true;
+ bar.updateProgress(0, " not started yet");
+ cp.add(bar);
+ bar.setWidth("90%");
+ cp.layout();
+ }
+ else {
+ if (report.getStatus() != DeployStatus.FINISH) {
+ cp.mask("Retrieving data", "loading-indicator");
+ DelayedOperation delay = new DelayedOperation() {
+ @Override
+ public void doJob() {
+ cp.unmask();
+ }
+ };
+ delay.start(1500);
+ }
+ bar.setWidth("90%");
+ bar.updateProgress((i/100), (int )i +label);
+ cp.layout();
+ }
+ if (report.getStatus() == DeployStatus.FAIL || report.getStatus() == DeployStatus.FINISH) {
+ bar.setWidth("90%");
+ i = 100;
+ bar.updateProgress((i/100), (int )i +label);
+ cp.layout();
+ }
+
+ }
+
+ /**
+ *
+ */
+ public void createReport() {
+ cp.removeAll();
+ bar = new ProgressBar();
+
+ }
+
+ /**
+ *
+ * @return
+ */
+ public ContentPanel getServicesDeployStatusPanel() {
+ cp.setHeaderVisible(true);
+ cp.setHeading("Services dynamic deploying");
+ cp.setHeight(250);
+ cp.setBorders(true);
+ cp.mask("Retrieving data", "loading-indicator");
+
+ return cp;
+ }
+}
diff --git a/src/main/java/org/gcube/portlets/admin/vredeployer/server/AdditionalFuncInfo.java b/src/main/java/org/gcube/portlets/admin/vredeployer/server/AdditionalFuncInfo.java
new file mode 100644
index 0000000..ded388c
--- /dev/null
+++ b/src/main/java/org/gcube/portlets/admin/vredeployer/server/AdditionalFuncInfo.java
@@ -0,0 +1,64 @@
+package org.gcube.portlets.admin.vredeployer.server;
+
+import org.gcube.vremanagement.vremodel.cl.stubs.types.GHN;
+import org.gcube.vremanagement.vremodel.cl.stubs.types.RunningInstanceMessage;
+
+
+/**
+ * just a wrapper class
+ * @author massi
+ *
+ */
+public class AdditionalFuncInfo {
+ /**
+ *
+ */
+ private GHN[] ghns;
+ /**
+ *
+ */
+ private RunningInstanceMessage[] missingServices;
+ /**
+ *
+ */
+ private RunningInstanceMessage[] foundServices;
+
+ public AdditionalFuncInfo() {
+ this.ghns = new GHN[0];
+ this.missingServices = new RunningInstanceMessage[0];
+ }
+
+ public AdditionalFuncInfo(GHN[] ghns,
+ RunningInstanceMessage[] missingServices,
+ RunningInstanceMessage[] foundServices) {
+ super();
+ this.ghns = ghns;
+ this.missingServices = missingServices;
+ this.foundServices = foundServices;
+ }
+
+ public GHN[] getGhns() {
+ return ghns;
+ }
+
+ public void setGhns(GHN[] ghns) {
+ this.ghns = ghns;
+ }
+
+ public RunningInstanceMessage[] getMissingServices() {
+ return missingServices;
+ }
+
+ public void setMissingServices(RunningInstanceMessage[] missingServices) {
+ this.missingServices = missingServices;
+ }
+
+ public RunningInstanceMessage[] getFoundServices() {
+ return foundServices;
+ }
+
+ public void setFoundServices(RunningInstanceMessage[] foundServices) {
+ this.foundServices = foundServices;
+ }
+
+}
diff --git a/src/main/java/org/gcube/portlets/admin/vredeployer/server/CreatedVRELogEntry.java b/src/main/java/org/gcube/portlets/admin/vredeployer/server/CreatedVRELogEntry.java
new file mode 100644
index 0000000..ff03603
--- /dev/null
+++ b/src/main/java/org/gcube/portlets/admin/vredeployer/server/CreatedVRELogEntry.java
@@ -0,0 +1,30 @@
+package org.gcube.portlets.admin.vredeployer.server;
+
+import org.gcube.application.framework.accesslogger.model.AccessLogEntry;
+
+/**
+ * Represents an access log entry for creating a new Template
+ */
+public class CreatedVRELogEntry extends AccessLogEntry{
+
+ private String name;
+ private String id;
+ private String designer;
+ private String manager;
+
+ public CreatedVRELogEntry(String name, String id, String designer, String manager) {
+ super("Deploy_VRE");
+ this.name = replaceReservedChars(name);
+ this.id = replaceReservedChars(id);
+ this.designer = replaceReservedChars(designer);
+ this.manager = replaceReservedChars(manager);
+
+ }
+
+ @Override
+ public String getLogMessage() {
+ String message = "Name = " + name + "|ID = " + id + "|DESIGNER = " + designer+ "|MANAGER = " + manager;
+ return message;
+ }
+
+}
\ No newline at end of file
diff --git a/src/main/java/org/gcube/portlets/admin/vredeployer/server/VREDeployerServiceImpl.java b/src/main/java/org/gcube/portlets/admin/vredeployer/server/VREDeployerServiceImpl.java
new file mode 100644
index 0000000..0a4183e
--- /dev/null
+++ b/src/main/java/org/gcube/portlets/admin/vredeployer/server/VREDeployerServiceImpl.java
@@ -0,0 +1,1196 @@
+package org.gcube.portlets.admin.vredeployer.server;
+
+import java.io.BufferedReader;
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileReader;
+import java.io.IOException;
+import java.io.StringReader;
+import java.rmi.RemoteException;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Hashtable;
+import java.util.LinkedList;
+import java.util.List;
+
+import javax.servlet.http.HttpSession;
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.parsers.ParserConfigurationException;
+import javax.xml.transform.Transformer;
+import javax.xml.transform.TransformerConfigurationException;
+import javax.xml.transform.TransformerException;
+import javax.xml.transform.TransformerFactory;
+import javax.xml.transform.dom.DOMSource;
+import javax.xml.transform.stream.StreamResult;
+import javax.xml.transform.stream.StreamSource;
+
+import org.gcube.application.framework.core.session.ASLSession;
+import org.gcube.application.framework.core.session.SessionManager;
+import org.gcube.application.framework.vremanagement.vremanagement.impl.VREGeneratorEvo;
+import org.gcube.portal.custom.communitymanager.OrganizationsUtil;
+import org.gcube.portal.custom.communitymanager.PortletsIdManager;
+import org.gcube.portal.custom.communitymanager.ThemesIdManager;
+import org.gcube.portal.custom.communitymanager.components.GCUBELayoutTab;
+import org.gcube.portal.custom.communitymanager.components.GCUBEPortlet;
+import org.gcube.portal.custom.communitymanager.components.GCUBESiteLayout;
+import org.gcube.portal.custom.communitymanager.impl.OrganizationManagerImpl;
+import org.gcube.portal.custom.communitymanager.types.GCUBELayoutType;
+import org.gcube.portal.custom.scopemanager.scopehelper.ScopeHelper;
+import org.gcube.portlets.admin.vredeployer.client.VredeployerService;
+import org.gcube.portlets.admin.vredeployer.client.model.VREFunctionalityModel;
+import org.gcube.portlets.admin.vredeployer.shared.GHNMemory;
+import org.gcube.portlets.admin.vredeployer.shared.GHNProfile;
+import org.gcube.portlets.admin.vredeployer.shared.GHNSite;
+import org.gcube.portlets.admin.vredeployer.shared.ResourceCategory;
+import org.gcube.portlets.admin.vredeployer.shared.ResourceCategoryItem;
+import org.gcube.portlets.admin.vredeployer.shared.RunningInstance;
+import org.gcube.portlets.admin.vredeployer.shared.VREDeployerStatusType;
+import org.gcube.portlets.admin.vredeployer.shared.VREDescrBean;
+import org.gcube.portlets.admin.vredeployer.shared.deployreport.ClientCloudReport;
+import org.gcube.portlets.admin.vredeployer.shared.deployreport.ClientDeployReport;
+import org.gcube.portlets.admin.vredeployer.shared.deployreport.ClientFunctionalityDeployReport;
+import org.gcube.portlets.admin.vredeployer.shared.deployreport.ClientFunctionalityReport;
+import org.gcube.portlets.admin.vredeployer.shared.deployreport.ClientResource;
+import org.gcube.portlets.admin.vredeployer.shared.deployreport.ClientResourceManagerDeployingReport;
+import org.gcube.portlets.admin.vredeployer.shared.deployreport.ClientResourcesDeployReport;
+import org.gcube.portlets.admin.vredeployer.shared.deployreport.ClientServiceReport;
+import org.gcube.portlets.admin.vredeployer.shared.deployreport.DeployStatus;
+import org.gcube.vomanagement.usermanagement.GroupManager;
+import org.gcube.vomanagement.usermanagement.RoleManager;
+import org.gcube.vomanagement.usermanagement.UserManager;
+import org.gcube.vomanagement.usermanagement.exception.UserManagementPortalException;
+import org.gcube.vomanagement.usermanagement.exception.UserManagementSystemException;
+import org.gcube.vomanagement.usermanagement.exception.UserRetrievalFault;
+import org.gcube.vomanagement.usermanagement.impl.liferay.LiferayGroupManager;
+import org.gcube.vomanagement.usermanagement.impl.liferay.LiferayRoleManager;
+import org.gcube.vomanagement.usermanagement.impl.liferay.LiferayUserManager;
+import org.gcube.vomanagement.usermanagement.model.GroupModel;
+import org.gcube.vomanagement.usermanagement.model.UserModel;
+import org.gcube.vremanagement.vremodel.cl.stubs.types.FunctionalityItem;
+import org.gcube.vremanagement.vremodel.cl.stubs.types.GHN;
+import org.gcube.vremanagement.vremodel.cl.stubs.types.GHNsPerFunctionality;
+import org.gcube.vremanagement.vremodel.cl.stubs.types.ResourceDescriptionItem;
+import org.gcube.vremanagement.vremodel.cl.stubs.types.ResourceItem;
+import org.gcube.vremanagement.vremodel.cl.stubs.types.RunningInstanceMessage;
+import org.gcube.vremanagement.vremodel.cl.stubs.types.VREDescription;
+import org.gcube.vremanagement.vremodeler.utils.Utils;
+import org.gcube.vremanagement.vremodeler.utils.reports.DeployReport;
+import org.gcube.vremanagement.vremodeler.utils.reports.FunctionalityReport;
+import org.gcube.vremanagement.vremodeler.utils.reports.GHNonCloudReport;
+import org.gcube.vremanagement.vremodeler.utils.reports.Resource;
+import org.gcube.vremanagement.vremodeler.utils.reports.ServiceReport;
+import org.gcube.vremanagement.vremodeler.utils.reports.Status;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.w3c.dom.Document;
+import org.xml.sax.InputSource;
+import org.xml.sax.SAXException;
+
+import com.google.gwt.user.server.rpc.RemoteServiceServlet;
+import com.liferay.portal.NoSuchRoleException;
+import com.liferay.portal.kernel.exception.PortalException;
+import com.liferay.portal.kernel.exception.SystemException;
+import com.liferay.portal.model.Company;
+import com.liferay.portal.model.Group;
+import com.liferay.portal.model.Role;
+import com.liferay.portal.service.OrganizationLocalServiceUtil;
+import com.liferay.portal.service.RoleLocalServiceUtil;
+
+
+
+/**
+ * The server side implementation of the RPC service.
+ */
+@SuppressWarnings("serial")
+public class VREDeployerServiceImpl extends RemoteServiceServlet implements VredeployerService {
+
+ private static final Logger log = LoggerFactory.getLogger(VREDeployerServiceImpl.class);
+ protected static final String ORGANIZATION_DEFAULT_LOGO = "/org/gcube/portal/custom/communitymanager/resources/default_logo.png";
+ private static final int LIFERAY_REGULAR_ROLE_ID = 1;
+ /**
+ *
+ */
+ private static final String VRE_GENERATOR_ATTRIBUTE = "VREGenerator";
+ private static final String GHN_PER_FUNC_ATTRIBUTE = "GHN_PER_FUNC_ATTRIBUTE";
+
+ private static final String HARD_CODED_VO_NAME = "/gcube/devsec";
+ private static final String APPROVING_VRE = "approvingVRE";
+ public static final String APPROVE_MODE = "approve";
+ public static final String EDIT_MODE = "edit";
+ public static final String REEDIT_TYPE_ATTRIBUTE = "reeditType";
+ public static final String MODE_ATTRIBUTE = "mode";
+ private static final String DESCRIPTION = "DESCRIPTION";
+ private static final String DEPLOYING = "DEPLOYING";
+
+ private static final String DESIGNER = "Designer";
+ private static final String MANAGER = "Manager";
+
+ /**
+ *
+ */
+ private boolean isTesting = true;
+ String customEPR = "1d648460-2d05-11e3-9f6f-a17a856bd44f";
+ /**
+ *
+ * @return
+ */
+ private VREGeneratorEvo getVREGeneratorEvo(ASLSession aslSession){
+ log.info("getVREGeneratorEvo called with scope: " + aslSession.getScopeName());
+ String vreid = (String) aslSession.getAttribute(VRE_GENERATOR_ATTRIBUTE);
+ if(vreid==null){
+ return null;
+ }
+ return new VREGeneratorEvo(aslSession, vreid); //cannot cache VREGeneretor instance;
+ }
+
+ private void setDeployingStatusOn() {
+ getASLSession().setAttribute(DEPLOYING, "ON");
+ }
+
+ private void setDeployingStatusOff() {
+ getASLSession().setAttribute(DEPLOYING, null);
+ }
+
+ private boolean isDeploying() {
+ return getASLSession().getAttribute(DEPLOYING) != null;
+ }
+
+ /**
+ *
+ * @return
+ */
+ private ASLSession getASLSession() {
+ log.info("getVREGeneratorEvo getASLSession() : ");
+ HttpSession session = this.getThreadLocalRequest().getSession();
+ String username = (String) session.getAttribute(ScopeHelper.USERNAME_ATTRIBUTE);
+ if (username == null) {
+ username = "massimiliano.assante";
+ SessionManager.getInstance().getASLSession(session.getId(), username).setScope(HARD_CODED_VO_NAME);
+ SessionManager.getInstance().getASLSession(session.getId(), username).setAttribute(REEDIT_TYPE_ATTRIBUTE, APPROVE_MODE);
+ }
+ else {
+ isTesting = false;
+ }
+ return SessionManager.getInstance().getASLSession(session.getId(), username);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public VREDeployerStatusType isApprovingModeEnabled() {
+ if (isTesting) {
+ setDeployingStatusOff();
+ return VREDeployerStatusType.APPROVE;
+
+ }
+
+ if (isDeploying())
+ return VREDeployerStatusType.DEPLOYING;
+
+ log.debug("--- isApprovingModeEnabled in Log ---");
+
+ ASLSession aslSession = getASLSession();
+ aslSession.setAttribute(MODE_ATTRIBUTE, null);
+
+ String reeditType = (String) aslSession.getAttribute(REEDIT_TYPE_ATTRIBUTE);
+ log.debug("REEDIT_TYPE_ATTRIBUTE = " + reeditType);
+ aslSession.setAttribute(REEDIT_TYPE_ATTRIBUTE, null);
+
+ if ( reeditType != null && reeditType.compareTo(APPROVE_MODE) == 0) {
+ System.out.println(APPROVING_VRE + " = " + true);
+ aslSession.setAttribute(MODE_ATTRIBUTE,APPROVING_VRE);
+ return VREDeployerStatusType.APPROVE;
+ }
+ else{
+ /* This is needed to avoid to log out and log in again to create a new VRE */
+ aslSession.setAttribute(VRE_GENERATOR_ATTRIBUTE, null);
+ }
+ aslSession.setAttribute(REEDIT_TYPE_ATTRIBUTE, null);
+
+ return VREDeployerStatusType.NON_APPROVE;
+ }
+
+
+ /**
+ * return the VRE Overall Information
+ */
+ public VREDescrBean getVRE() throws NullPointerException {
+ VREGeneratorEvo vreGenerator = null;
+ if (isTesting) {
+ vreGenerator = new VREGeneratorEvo(getASLSession(), customEPR);
+ }
+ else {
+ ASLSession aslSession = getASLSession();
+ vreGenerator = getVREGeneratorEvo(aslSession);
+ log.info("VRE EPR: " + vreGenerator.getVREepr());
+ }
+
+ VREDescrBean vreDescBean = null;
+ log.debug("--- Getting VRE Model ---");
+ try {
+ VREDescription sd = vreGenerator.getVREModel();
+ vreDescBean = new VREDescrBean(sd.name(), sd.description(), sd.designer(), sd.manager(), sd.startTime().getTime(), sd.endTime().getTime());
+ getASLSession().setAttribute(DESIGNER, sd.designer());
+ getASLSession().setAttribute(MANAGER, sd.manager());
+ } catch (RemoteException e) {
+ e.printStackTrace();
+ }
+ log.debug("Model: " + vreDescBean.getName());
+ log.debug("--- END Getting VRE Model ---");
+ return vreDescBean;
+
+ }
+
+
+
+ /**
+ * return the name and last name of the user
+ * @param username
+ * @return
+ */
+ private String getFullname(String screenName) {
+ UserManager um = new LiferayUserManager();
+ UserModel user = null;
+ try {
+ user = um.getUserByScreenName(screenName);
+ } catch (UserManagementSystemException e) {
+ e.printStackTrace();
+ } catch (UserRetrievalFault e) {
+ e.printStackTrace();
+ } catch (UserManagementPortalException e) {
+ e.printStackTrace();
+ }
+ return user.getFullname();
+ }
+
+
+
+
+ /**
+ * read the available functionality from the service through ASL extension
+ */
+ @Override
+ public VREFunctionalityModel getFunctionality() {
+
+ VREFunctionalityModel toReturn = new VREFunctionalityModel("","selected functionality", "", "",false);
+
+ HashMap> funCategories = new HashMap>();
+
+ List list = null;
+ VREGeneratorEvo vreGenerator = null;
+ try {
+ if (isTesting)
+ vreGenerator = new VREGeneratorEvo(getASLSession(), customEPR);
+ else {
+ ASLSession aslSession = getASLSession();
+ vreGenerator = getVREGeneratorEvo(aslSession);
+ log.info("VRE EPR: " + vreGenerator.getVREepr());
+ }
+ list = vreGenerator.getFunctionality();
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+
+ if (list == null) {
+ log.warn("FunctionalityList NULL");
+ return null;
+ }
+
+ for (FunctionalityItem fi :list){
+ System.out.println(fi.id()+"-"+fi.name());
+
+ VREFunctionalityModel toAdd = new VREFunctionalityModel(Integer.toString(fi.id()),
+ fi.name(), fi.description(), "",fi.selected());
+
+ if (fi.children() != null) {
+ List children = fi.children();
+ ArrayList newchildrens = new ArrayList();
+ //creating node children
+ for (FunctionalityItem child : children) {
+ System.out.println(child.name() + " is " + child.selected());
+ if (child.selected()) {
+ VREFunctionalityModel subFunc = new VREFunctionalityModel(Integer.toString(child.id()),
+ child.name(), child.description(),
+ "functionality-add-icon",child.selected());
+ newchildrens.add(subFunc);
+
+ ArrayList resourceChildren = new ArrayList();
+ if ( child.selectableResourcesDescription()!=null) {
+ for (ResourceDescriptionItem category: child.selectableResourcesDescription()) {
+ if (category.resources()!=null)
+ for (ResourceItem resource : category.resources())
+ if (resource.selected())
+ resourceChildren.add(new VREFunctionalityModel(resource.id(), resource.name(), resource.description(), "extres-icon", resource.selected()));
+ }
+ //subFunc.addChildren(resourceChildrens.toArray(new VREFunctionalityModel[resourceChildrens.size()]));
+ }
+ AdditionalFuncInfo addInfo = getServicesAndGHNs(subFunc.getId());
+
+ if (addInfo != null) {
+ RunningInstanceMessage[] ris = addInfo.getMissingServices();
+
+ for (int j = 0; j < ris.length; j++) {
+ RunningInstanceMessage ri = ris[j];
+ resourceChildren.add(new VREFunctionalityModel("", ri.serviceName() + " (" + ri.serviceClass()+")", "", "missing-ri", true));
+ }
+ ris = addInfo.getFoundServices();
+ for (int j = 0; j < ris.length; j++) {
+ RunningInstanceMessage ri = ris[j];
+ resourceChildren.add(new VREFunctionalityModel("", ri.serviceName() + " (" + ri.serviceClass()+")", "", "runninginstance-icon", true));
+ }
+
+ GHN[] relGHNs = addInfo.getGhns();
+ for (int j = 0; j < relGHNs.length; j++) {
+ GHN ghn = relGHNs[j];
+ resourceChildren.add(new VREFunctionalityModel("", ghn.host() + " (" + ghn.site().domain()+")", "", "architecture-icon", true));
+ }
+ }
+ else
+ log.error("getServicesAndGHNs per subfunctionality returns NULL");
+ subFunc.addChildren(resourceChildren.toArray(new VREFunctionalityModel[resourceChildren.size()]));
+ }
+ }
+ if (newchildrens.size() > 0) {
+ toAdd.addChildren(newchildrens.toArray(new VREFunctionalityModel[newchildrens.size()]));
+ toReturn.add(toAdd);
+ }
+ }
+ }
+
+ for (String func : funCategories.keySet()) {
+ System.out.println("-"+func);
+ for(ResourceCategory category : funCategories.get(func)) {
+ System.out.println("--"+category.getName());
+ for(ResourceCategoryItem rc: category.getItems()) {
+ System.out.println("----"+rc.getName() + " : " + rc.isSelected());
+ }
+ }
+ }
+ return toReturn;
+ }
+
+ @Override
+ public void getGHNPerFunctionality(String funcId) {
+ VREGeneratorEvo vreGenerator = null;
+ if (isTesting)
+ vreGenerator = new VREGeneratorEvo(getASLSession(), customEPR);
+ else {
+ ASLSession aslSession = getASLSession();
+ vreGenerator = getVREGeneratorEvo(aslSession);
+ }
+ int funcToLookFor = Integer.parseInt(funcId);
+
+ try {
+ GHNsPerFunctionality[] ghnsPerFunc = vreGenerator.getGHNsPerFunctionality();
+ GHNsPerFunctionality toWorkWith = null;
+ for (int i = 0; i < ghnsPerFunc.length; i++)
+ if (funcToLookFor == ghnsPerFunc[i].id()) {
+ toWorkWith = ghnsPerFunc[i];
+ break;
+ }
+ if (toWorkWith == null)
+ return;
+ List services = toWorkWith.foundServices();
+ if (services != null) {
+ for (RunningInstanceMessage se : services) {
+ System.out.println(se.serviceName() + " - " + se.serviceClass());
+ }
+ }
+
+ } catch (RemoteException e) {
+ e.printStackTrace();
+ }
+ }
+
+
+ private void setGHNsPerFunctionalityInSession(GHNsPerFunctionality[] ghnsPerFunc) {
+ getASLSession().setAttribute(GHN_PER_FUNC_ATTRIBUTE, ghnsPerFunc);
+ }
+
+ private GHNsPerFunctionality[] getGHNsPerFunctionalityFromSession() {
+ return (GHNsPerFunctionality[]) getASLSession().getAttribute(GHN_PER_FUNC_ATTRIBUTE);
+ }
+ /**
+ * get the list of running instances associated to a service
+ * @param funcId
+ * @return
+ */
+ private AdditionalFuncInfo getServicesAndGHNs(String funcId) {
+ AdditionalFuncInfo toReturn = new AdditionalFuncInfo();
+ try {
+ GHNsPerFunctionality[] ghnsPerFunc = null;
+
+ if (getGHNsPerFunctionalityFromSession() == null) { //avoid multiple calls to the service
+ VREGeneratorEvo vreGenerator = null;
+ if (isTesting)
+ vreGenerator = new VREGeneratorEvo(getASLSession(), customEPR);
+ else {
+ ASLSession aslSession = getASLSession();
+ vreGenerator = getVREGeneratorEvo(aslSession);
+ }
+ ghnsPerFunc = vreGenerator.getGHNsPerFunctionality();
+ setGHNsPerFunctionalityInSession(ghnsPerFunc);
+ }
+ else {
+ ghnsPerFunc = getGHNsPerFunctionalityFromSession();
+ }
+ int funcToLookFor = Integer.parseInt(funcId);
+ GHNsPerFunctionality ghnPF = null;
+ for (int i = 0; i < ghnsPerFunc.length; i++) {
+ if (funcToLookFor == ghnsPerFunc[i].id()) {
+ ghnPF = ghnsPerFunc[i];
+ break;
+ }
+ }
+ if (ghnPF == null || ghnPF.missingServices() == null)
+ toReturn.setMissingServices(new RunningInstanceMessage[0]);
+ else {
+ toReturn.setMissingServices(ghnPF.missingServices().toArray(new RunningInstanceMessage[0]));
+ }
+ if (ghnPF == null || ghnPF.foundServices() == null)
+ toReturn.setFoundServices(new RunningInstanceMessage[0]);
+ else {
+ toReturn.setFoundServices(ghnPF.foundServices().toArray(new RunningInstanceMessage[0]));
+ }
+ if (ghnPF == null || ghnPF.ghns() == null)
+ toReturn.setGhns(new GHN[0]);
+ else
+ toReturn.setGhns(ghnPF.ghns().toArray(new GHN[0]));
+ return toReturn;
+ } catch (RemoteException e) {
+ e.printStackTrace();
+ return null;
+ }
+ }
+
+ /**
+ * return the ghn available list
+ * @return
+ * @throws RemoteException
+ */
+ @Override
+ public List getAvailableGHNs() {
+ List toReturn = new ArrayList();
+ VREGeneratorEvo vreGenerator = null;
+ if (isTesting) {
+ vreGenerator = new VREGeneratorEvo(getASLSession(), customEPR);
+ }
+ else {
+ ASLSession aslSession = getASLSession();
+ vreGenerator = getVREGeneratorEvo(aslSession);
+ }
+
+ List ghns = null;
+ try {
+ log.debug("Asking gHN list");
+ ghns = vreGenerator.getGHNs();
+ } catch (RemoteException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+ if (ghns == null)
+ return toReturn;
+ log.debug("got gHN list, menbers: " + ghns.size());
+ for (GHN ghn : ghns) {
+ List ris = new ArrayList();
+ if (ghn.relatedRIs() != null) {
+ for (int i = 0; i < ghn.relatedRIs().size(); i++) {
+ ris.add(new RunningInstance(ghn.relatedRIs().get(i).serviceName(), ghn.relatedRIs().get(i).serviceClass()));
+ }
+ }
+
+ toReturn.add(new GHNProfile(ghn.id(), ghn.host(), ris, ghn.securityEnabled(),
+ new GHNMemory(ghn.memory().memorySize()+"", ghn.memory().diskSpace()+""),
+ new GHNSite(ghn.site().location(), ghn.site().country(), ghn.site().domain()), null,
+ ghn.selected()) );
+
+ }
+ return toReturn;
+
+ }
+
+
+ /**
+ *
+ * @param selectedGHNIds
+ * @param idCandidateGHN
+ * @return
+ */
+ public boolean setGHNsSelected(String[] selectedGHNIds) {
+ VREGeneratorEvo vreGenerator = null;
+ if (isTesting) {
+ vreGenerator = new VREGeneratorEvo(getASLSession(), customEPR);
+ }
+ else {
+ ASLSession aslSession = getASLSession();
+ vreGenerator = getVREGeneratorEvo(aslSession);
+ }
+
+ try {
+ log.debug(" selectedIDs");
+ for (int i = 0; i < selectedGHNIds.length; i++) {
+ System.out.println(" id: " + selectedGHNIds[i].toString());
+ }
+ vreGenerator.setGHNs(selectedGHNIds);
+ } catch (RemoteException e) {
+ e.printStackTrace();
+ return false;
+ }
+ return true;
+ }
+
+ /**
+ *
+ * @return
+ */
+ public int isCloudSelected() {
+
+ VREGeneratorEvo vreGenerator = null;
+ if (isTesting) {
+ vreGenerator = new VREGeneratorEvo(getASLSession(), customEPR);
+ }
+ else {
+ ASLSession aslSession = getASLSession();
+ vreGenerator = getVREGeneratorEvo(aslSession);
+ }
+ if (vreGenerator.isCloudSelected())
+ return vreGenerator.getCloudVMSelected();
+ else
+ return -1;
+ }
+
+
+ /**
+ *
+ */
+ public int getCloudVMSelected() {
+
+ VREGeneratorEvo vreGenerator = null;
+ if (isTesting) {
+ vreGenerator = new VREGeneratorEvo(getASLSession(), customEPR);
+ }
+ else {
+ ASLSession aslSession = getASLSession();
+ vreGenerator = getVREGeneratorEvo(aslSession);
+ }
+ return vreGenerator.getCloudVMSelected();
+ }
+
+ /**
+ *
+ * @param virtualMachines
+ * @return
+ */
+ public boolean setCloudDeploy(int virtualMachines) {
+ VREGeneratorEvo vreGenerator = null;
+ if (isTesting) {
+ vreGenerator = new VREGeneratorEvo(getASLSession(), customEPR);
+ }
+ else {
+ ASLSession aslSession = getASLSession();
+ vreGenerator = getVREGeneratorEvo(aslSession);
+ }
+
+ return vreGenerator.setCloudDeploy(virtualMachines);
+ }
+
+
+ public boolean deployVRE() {
+ log.info("--- deployVRE started ---");
+ VREGeneratorEvo vreGenerator = null;
+ if (isTesting) {
+ vreGenerator = new VREGeneratorEvo(getASLSession(), customEPR);
+ }
+ else {
+ ASLSession aslSession = getASLSession();
+ vreGenerator = getVREGeneratorEvo(aslSession);
+ }
+ try {
+ vreGenerator.deployVRE();
+ //need time to prepare report
+ log.info("--- SLEEP 2 seconds ---");
+ Thread.sleep(2500);
+ } catch (Exception e) {
+ e.printStackTrace();
+ return false;
+ }
+// AccessLogger log = AccessLogger.getAccessLogger();
+// CreatedVRELogEntry logEntry;
+// try {
+// logEntry = new CreatedVRELogEntry(
+// vreGenerator.getVREModel().name(),
+// vreGenerator.getVREepr(),
+// vreGenerator.getVREModel().designer(),
+// vreGenerator.getVREModel().manager());
+// log.logEntry(getASLSession().getUsername(), getASLSession().getScopeName(), logEntry);
+// } catch (RemoteException e) {
+// e.printStackTrace();
+// }
+
+ return true;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public ClientDeployReport checkCreateVRE() {
+ log.info("--- check Create VRE started ---");
+
+ VREGeneratorEvo vreGenerator = null;
+ if (isTesting) {
+ try {
+ vreGenerator = new VREGeneratorEvo(getASLSession(), customEPR);
+ }
+ catch (NullPointerException e) {
+ log.error("Error while trying to contact VRE Modeler service with TEST ID: " + customEPR +
+ " Probly does not exist anymore, request from " + this.getThreadLocalRequest().getRemoteHost() + "("+this.getThreadLocalRequest().getRemoteAddr()+")");
+ return new ClientDeployReport();
+ }
+ }
+ else {
+ ASLSession aslSession = getASLSession();
+ vreGenerator = getVREGeneratorEvo(aslSession);
+ }
+ DeployReport report = null;
+
+ try {
+ report = vreGenerator.checkVREStatus();
+ } catch (Exception e) {
+ log.error("Error while trying to retrieve VRE Status, return Empty Report" + e.getMessage() + "\n, " +
+ "request from " + this.getThreadLocalRequest().getRemoteHost() + "("+this.getThreadLocalRequest().getRemoteAddr()+")");
+ return new ClientDeployReport();
+ }
+
+ if (report == null || report.getStatus() == null) {
+ log.error("--- DeployReport is NULL or Status is null, return Empty Report, " +
+ "request from " + this.getThreadLocalRequest().getRemoteHost() + "("+this.getThreadLocalRequest().getRemoteAddr()+")");
+ return new ClientDeployReport();
+ }
+
+ if (report.getStatus() == Status.Finished) {
+ System.out.println("--- Create VRE COMPLETED, CREATING LAYOUTS AND COMMUNITY ... ");
+ String name = "";
+ try {
+ name = vreGenerator.getVREModel().name();
+ } catch (RemoteException e) {
+ e.printStackTrace();
+ }
+ createCommunityAndLayout(name);
+ System.out.println("--- CREATed LAYOUTS AND COMMUNITY ---");
+ }
+ else
+ setDeployingStatusOn();
+
+ //jsut for testing
+ // if (isTesting)
+ // return convertServiceDeployReport(simulateReport());
+
+ log.debug("---Sending Report, globalState --- " + report.getStatus() );
+ return convertServiceDeployReport(report);
+ }
+
+ /**
+ *
+ * @return the html representation of the report
+ */
+ public String getHTMLReport() {
+ log.info("--- getHTMLReport VRE ---");
+
+ VREGeneratorEvo vreGenerator = null;
+ if (isTesting) {
+ vreGenerator = new VREGeneratorEvo(getASLSession(), customEPR);
+ }
+ else {
+ ASLSession aslSession = getASLSession();
+ vreGenerator = getVREGeneratorEvo(aslSession);
+ }
+
+ String report = null;
+
+ try {
+ report = Utils.toXML(vreGenerator.checkVREStatus());
+ } catch (RemoteException e) {
+ e.printStackTrace();
+ }
+ String startDirectory = this.getServletContext().getRealPath("");
+ String xslFileLocation = startDirectory + "/styles/report.xsl";
+
+ String transformed = "";
+ if (isTesting) {
+
+ String pathXML = startDirectory + "/xml/report.xml";
+ log.info("--- pathXML: " + pathXML);
+ log.info("--- xsl: " + xslFileLocation);
+ transformed = transformToHtml(fileToString(pathXML), xslFileLocation);
+ }
+ else {
+ transformed = transformToHtml(report, xslFileLocation);
+ }
+
+ return transformed;
+ }
+
+
+
+
+ /**
+ * convert the service report to a report client sendable
+ * @param toConvert
+ * @return
+ */
+ private ClientDeployReport convertServiceDeployReport(DeployReport toConvert) {
+
+ ClientDeployReport toReturn = new ClientDeployReport();
+
+ //*** Overall deploy status report part
+ toReturn.setGlobalStatus(convStatus(toConvert.getStatus()));
+
+
+ //*** Cloud deploy report part
+ GHNonCloudReport cDeploy = toConvert.getCloudDeployingReport();
+
+ if (isCloudSelected() != -1) {
+ System.out.println("***** GHNonCloudReportSelected ******");
+ List singleCloudStatus = new LinkedList();
+ for (int i = 0; i < cDeploy.getDeployingState().length; i++) {
+ singleCloudStatus.add(convStatus(cDeploy.getDeployingState()[i]));
+ }
+
+ toReturn.setCloudReport(new ClientCloudReport(convStatus(cDeploy.getStatus()), singleCloudStatus));
+ }
+ else {
+ System.out.println("***** GHNonCloudReport Not Selected ******");
+ ClientCloudReport cdp = new ClientCloudReport();
+ cdp.setStatus(DeployStatus.SKIP);
+ toReturn.setCloudReport(cdp);
+ }
+ //*** ResourceManager deploy report part
+ toReturn.setResourceManagerReport(
+ new ClientResourceManagerDeployingReport(convStatus(toConvert.getResourceDeployingReport().getStatus()), toConvert.getResourceDeployingReport().toString()));
+
+ //*** Functionality deploy report part
+ ClientFunctionalityDeployReport cfDeployReport = new ClientFunctionalityDeployReport();
+
+
+ Hashtable> table = toConvert.getFunctionalityDeployingReport().getFunctionalityTable();
+ HashMap> newTable = new HashMap>();
+
+ //creating new hashtable
+ for (FunctionalityReport fr : table.keySet()) {
+ List theList = new LinkedList();
+ for (ServiceReport sr : table.get(fr))
+ theList.add(new ClientServiceReport(sr.getServiceName(), sr.getServiceClass(), sr.getServiceVersion()));
+ //adding new key and payload
+ newTable.put(new ClientFunctionalityReport(fr.getFunctionalityId(), fr.getFunctionalityName(), convStatus(fr.getState())), theList);
+ }
+
+ cfDeployReport.setStatus(convStatus(toConvert.getFunctionalityDeployingReport().getStatus()));
+ cfDeployReport.setReportXML(toConvert.getFunctionalityDeployingReport().getResourceManagerReport());
+ cfDeployReport.setFunTable(newTable);
+ toReturn.setFunctionalityReport(cfDeployReport);
+
+ //*** Resource deploy report part
+
+ List newResources = new LinkedList();
+ for (Resource res : toConvert.getResourceDeployingReport().getResources()) {
+ newResources.add(new ClientResource(res.getResourceId(), res.getResourceType(), convStatus(res.getStatus())));
+ }
+
+ toReturn.setResourcesReport(new ClientResourcesDeployReport(
+ convStatus(toConvert.getResourceDeployingReport().getStatus()), newResources));
+
+ return toReturn;
+ }
+
+
+ /**
+ *
+ * @param status to convert
+ * @return
+ */
+ private DeployStatus convStatus(Status status) {
+ switch (status) {
+ case Failed:
+ return DeployStatus.FAIL;
+ case Finished:
+ return DeployStatus.FINISH;
+ case Pending:
+ return DeployStatus.PENDING;
+ case Running:
+ return DeployStatus.RUN;
+ case Skipped:
+ return DeployStatus.SKIP;
+ case Waiting:
+ return DeployStatus.WAIT;
+ default:
+ return DeployStatus.FAIL;
+ }
+ }
+
+ /**
+ *
+ * @param vreName
+ * @return
+ */
+ private boolean vreExists(String vreName) {
+ GroupManager gm = new LiferayGroupManager();
+ String currOrgid = ""+getASLSession().getGroupId();
+
+ List vres = null;
+ try {
+ vres = gm.listSubGroupsByGroup(currOrgid);
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ for (GroupModel vre : vres) {
+ if (vre.getGroupName().equals(vreName))
+ return true;
+ }
+ return false;
+ }
+
+ /**
+ * Creates the community and its layout in Liferay
+ */
+ private void createCommunityAndLayout(String vreName) {
+
+ if (vreExists(vreName)) {
+ System.out.println("VRE Exists already");
+ return;
+ }
+
+
+ log.info("TRYING READING CURRENT ORG ID");
+ long currOrgid = getASLSession().getGroupId(); //VO ID
+ String desc = (getASLSession().getAttribute(DESCRIPTION) == null) ? "No Description found": getASLSession().getAttribute(DESCRIPTION).toString(); //desc
+
+
+ String designer = (String) getASLSession().getAttribute(DESIGNER);
+ log.info("Designer found Name : " + designer);
+ String manager = (String) getASLSession().getAttribute(MANAGER);
+ System.out.println("Manager found Name : " + manager);
+
+ OrganizationManagerImpl orgManager = OrganizationManagerImpl.getInstance(getASLSession());
+ try {
+ GCUBESiteLayout siteLayout = getBaseLayout(vreName, orgManager, false);
+ long groupModelid = orgManager.createVRE(vreName, desc, currOrgid, siteLayout, OrganizationsUtil.getgCubeThemeId(ThemesIdManager.GCUBE_LOGGEDIN_THEME));
+
+ //the method above create a VRE and assign the manager Role to the person that triggers the creation
+ //however the VRE-Designer and the VRE-Manager persons of the VRE could be different and need to be created too
+ UserManager uman = new LiferayUserManager();
+ //if the manager is not the one who triggered the creation
+ if (manager.compareTo(getASLSession().getUsername()) != 0) {
+ //add the role VRE-Manager
+ long uid = Long.parseLong(uman.getUserId(manager));
+ Role created = createRole("VRE-Manager", vreName, uid);
+ log.debug("Admin Role "+ created.getName() + " Created Successfully");
+
+ Group vreCreated = OrganizationLocalServiceUtil.getOrganization(groupModelid).getGroup();
+
+ uman.assignUserToGroup(""+vreCreated.getClassPK(), ""+uid);
+ log.debug("Added user " + manager + " to group " + vreCreated.getName() + " with Success");
+
+ log.debug("Assigning Role: VRE-Manager");
+ RoleManager rm = new LiferayRoleManager();
+ rm.assignRoleToUser(""+vreCreated.getClassPK(), ""+created.getRoleId(), ""+uid);
+ log.debug("Admin Role VRE-Manager Associated to user " + designer + " .... returning ...");
+
+ }
+ //if the designer is different
+ if (designer.compareTo(manager) != 0) {
+ //add the role VRE-Designer
+ long uid = Long.parseLong(uman.getUserId(designer));
+ Role created = createRole("VRE-Designer", vreName, uid);
+ log.debug("Admin Role "+ created.getName() + " Created Successfully");
+
+ Group vreCreated = OrganizationLocalServiceUtil.getOrganization(groupModelid).getGroup();
+
+ uman.assignUserToGroup(""+vreCreated.getClassPK(), ""+uid);
+ log.debug("Added user " + designer + " to group " + vreCreated.getName() + " with Success");
+
+
+ RoleManager rm = new LiferayRoleManager();
+ rm.assignRoleToUser(""+vreCreated.getClassPK(), ""+created.getRoleId(), ""+uid);
+ log.debug("Admin Role VRE-Designer Associated to user " + designer + " .... returning ...");
+
+ }
+
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+ /**
+ * Create a Regular Manager Role for the community
+ * @param vreName
+ * @return
+ * @throws PortalException
+ * @throws SystemException
+ */
+ protected static Role createRole(String roleName, String vreName, long userid){
+ try {
+ Company company = OrganizationsUtil.getCompany();
+ String roletoAdd = roleName+"-" + vreName.replaceAll(" ", "-");
+ Role toCreate = null;
+ try {
+ toCreate = RoleLocalServiceUtil.getRole(company.getCompanyId(), roletoAdd);
+ } catch (NoSuchRoleException e) {
+ log.debug("Adding Role: " + roletoAdd);
+ return RoleLocalServiceUtil.addRole(userid, company.getCompanyId(), roletoAdd, null, roleName +" of " + vreName, LIFERAY_REGULAR_ROLE_ID);
+ }
+ return toCreate;
+
+ } catch (PortalException e) {
+ e.printStackTrace();
+ } catch (SystemException e) {
+ e.printStackTrace();
+ }
+ return null;
+ }
+
+ /**
+ * CHECK IF THE VRE DEPLOYMENT IS FINISHED
+ * @param report
+ * @return
+ */
+ private String getGlobalDeploymentStatus(String report) {
+ String ret = "NOT FINISHED";
+
+ return ret;
+ }
+
+
+ /**
+ *
+ * @param profile
+ * @param xslFile
+ * @return
+ */
+ private String transformToHtml(String profile, String xslFile){
+
+
+ File stylesheet = new File(xslFile);
+
+ TransformerFactory tFactory = TransformerFactory.newInstance();
+
+ StreamSource stylesource = new StreamSource(stylesheet);
+
+ Transformer transformer = null;
+ try {
+ transformer = tFactory.newTransformer(stylesource);
+ } catch (TransformerConfigurationException e) {
+ e.printStackTrace();
+ return "";
+ }
+
+
+ Document document = null;
+ DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
+ DocumentBuilder builder = null;
+ try {
+ builder = factory.newDocumentBuilder();
+ } catch (ParserConfigurationException e) {
+ e.printStackTrace();
+ return "";
+ }
+
+
+ StringReader reader = new StringReader(profile);
+ InputSource inputSource = new InputSource(reader);
+
+ log.debug("***** --- Reading **** ");
+
+
+ try {
+ document = builder.parse(inputSource);
+ } catch (SAXException e) {
+ log.error("***** --- ERROR PARSING REPORT SAXException--- **** ");
+ log.error("CHECK THIS: \n" + profile);
+
+ e.printStackTrace();
+ return "";
+ } catch (IOException e) {
+ e.printStackTrace();
+ return "";
+ }
+
+
+ DOMSource source = new DOMSource(document);
+
+ ByteArrayOutputStream resultStream = new ByteArrayOutputStream();
+ StreamResult result = new StreamResult(resultStream);
+
+ try {
+ transformer.transform(source, result);
+ } catch (TransformerException e) {
+ e.printStackTrace();
+ return "";
+ }
+
+ return resultStream.toString();
+ }
+
+
+ /**
+ * simulate a report
+ * @return
+ */
+ private DeployReport simulateReport() {
+ DeployReport reportToReturn = new DeployReport();
+ //
+ // Random random = new Random();
+ // int pick = random.nextInt(5);
+ //
+ // reportToReturn.setStatus(Status.Running);
+ //
+ // GHNonCloudReport cloudDeploy = new GHNonCloudReport();
+ // Status globalstatus;
+ // Status singlestatus;
+ //
+ // switch (pick) {
+ // case 0:
+ // cloudDeploy.setStatus(Status.Running);
+ // Status[] statuses = {Status.Failed,Status.Running, Status.Failed, Status.Failed, Status.Finished};
+ // cloudDeploy.setDeployingState(statuses);
+ //
+ // globalstatus = Status.Running;
+ // singlestatus = Status.Running;
+ // break;
+ // case 1:
+ // cloudDeploy.setStatus(Status.Waiting);
+ // Status[] status1 = {Status.Running, Status.Running, Status.Running, Status.Running, Status.Finished,
+ // Status.Failed,Status.Running, Status.Failed, Status.Failed, Status.Finished};
+ // cloudDeploy.setDeployingState(status1);
+ //
+ // globalstatus = Status.Finished;
+ // singlestatus = Status.Finished;
+ // break;
+ // case 2:
+ // cloudDeploy.setStatus(Status.Failed);
+ // Status[] status2 = {Status.Running, Status.Failed, Status.Failed, Status.Running, Status.Finished,
+ // Status.Failed,Status.Running, Status.Failed, Status.Failed, Status.Finished};
+ // cloudDeploy.setDeployingState(status2);
+ //
+ // globalstatus = Status.Failed;
+ // singlestatus = Status.Failed;
+ // break;
+ // case 3:
+ // cloudDeploy.setStatus(Status.Waiting);
+ // Status[] status3 = {Status.Running, Status.Running, Status.Running, Status.Waiting, Status.Waiting};
+ // cloudDeploy.setDeployingState(status3);
+ //
+ // globalstatus = Status.Waiting;
+ // singlestatus = Status.Running;
+ // case 4:
+ // cloudDeploy.setStatus(Status.Finished);
+ // Status[] status4 = {Status.Running, Status.Running, Status.Running, Status.Waiting, Status.Waiting};
+ // cloudDeploy.setDeployingState(status4);
+ //
+ // globalstatus = Status.Waiting;
+ // singlestatus = Status.Waiting;
+ // default:
+ // Status[] statusd = {Status.Skipped, Status.Skipped, Status.Skipped, Status.Skipped, Status.Skipped};
+ // cloudDeploy.setDeployingState(statusd);
+ //
+ // globalstatus = Status.Waiting;
+ // singlestatus = Status.Waiting;
+ // }
+ //
+ // reportToReturn.setCloudDeployingReport(cloudDeploy);
+ //
+ // ResourceDeployingReport rmdr = new ResourceDeployingReport();
+ // rmdr.setStatus(singlestatus);
+ //
+ // FunctionalityDeployingReport fdr = new FunctionalityDeployingReport();
+ //
+ // //creating func table
+ // Hashtable> funtable = new Hashtable>();
+ // for (int i = 0; i < 5; i++) {
+ // FunctionalityReport fr = new FunctionalityReport();
+ // fr.setFunctionalityId("0000");
+ // fr.setFunctionalityName("Search Potente");
+ // fr.setStatus(Status.Running);
+ //
+ // List sreports = new ArrayList();
+ //
+ // for (int j = 0; j < 7; j++) {
+ // ServiceReport sr = new ServiceReport();
+ // sr.setServiceClass("search");
+ // sr.setServiceName("ft indexer");
+ // sr.setServiceVersion("1.0");
+ // sreports.add(sr);
+ // }
+ // funtable.put(fr, sreports);
+ // }
+ //
+ // fdr.setFunctionalityTable(funtable);
+ // fdr.setStatus(Status.Running);
+ // fdr.setResourceManagerReport(null);
+ //
+ // reportToReturn.setFunctionalityDeployingReport(fdr);
+ // reportToReturn.setStatus(globalstatus);
+ return reportToReturn;
+ }
+
+ /**
+ *
+ * @param path
+ * @return
+ */
+ private String fileToString(String path) {
+ BufferedReader filebuf = null;
+ String nextStr = null;
+ StringBuilder ret = new StringBuilder();
+ try {
+ filebuf = new BufferedReader(new FileReader(path));
+ nextStr = filebuf.readLine(); // Read a line from file
+ while (nextStr != null) {
+ ret.append(nextStr);
+ nextStr = filebuf.readLine(); // Read the next line
+ }
+ filebuf.close(); // close the file
+ } catch (FileNotFoundException e) {
+ e.printStackTrace();
+ } catch (IOException e1) {
+ e1.printStackTrace();
+ }
+ return ret.toString();
+ }
+
+ /**
+ *
+ * @return the built layout of a rootVO
+ * @throws SystemException .
+ * @throws PortalException .
+ */
+ public GCUBESiteLayout getBaseLayout(String voName, OrganizationManagerImpl orgManager, boolean isVO) throws PortalException, SystemException {
+ GCUBESiteLayout siteLayout = null;
+ String email = OrganizationManagerImpl.validateUser(getASLSession().getUsername()).getEmailAddress();
+ siteLayout = new GCUBESiteLayout(OrganizationManagerImpl.getCompany(), voName, email);
+ siteLayout.addTab(new GCUBELayoutTab("Home", GCUBELayoutType.ONE_COL,
+ new GCUBEPortlet("gCube Loggedin", PortletsIdManager.getLRPortletId(PortletsIdManager.GCUBE_LOGGEDIN))));
+
+ //create tab Users and Roles with 2 subtabs
+ GCUBELayoutTab usersAndRoles = new GCUBELayoutTab("Administration", GCUBELayoutType.ONE_COL,
+ new GCUBEPortlet("Navigation", PortletsIdManager.getLRPortletId(PortletsIdManager.LR_NAVIGATION)));
+ GCUBELayoutTab usersTab = new GCUBELayoutTab("Manage Users", GCUBELayoutType.ONE_COL,
+ new GCUBEPortlet("Users", PortletsIdManager.getLRPortletId(PortletsIdManager.GCUBE_USERS_MANAGE)));
+ GCUBELayoutTab rolesTab = new GCUBELayoutTab("Manage Roles", GCUBELayoutType.ONE_COL,
+ new GCUBEPortlet("Roles", PortletsIdManager.getLRPortletId(PortletsIdManager.GCUBE_ROLES_MANAGE)));
+ usersAndRoles.addSubTab(usersTab);
+ usersAndRoles.addSubTab(rolesTab);
+ //add the tab
+ siteLayout.addTab(usersAndRoles);
+ if (isVO)
+ siteLayout.addTab(new GCUBELayoutTab("Resources Management", GCUBELayoutType.ONE_COL,
+ new GCUBEPortlet("Resources Management", PortletsIdManager.getLRPortletId(PortletsIdManager.RESOURCES_MANAGEMENT))));
+ else
+ siteLayout.addTab(new GCUBELayoutTab("Workspace", GCUBELayoutType.ONE_COL,
+ new GCUBEPortlet("Workspace", PortletsIdManager.getLRPortletId(PortletsIdManager.WORKSPACE))));
+ return siteLayout;
+ }
+
+
+}
+
diff --git a/src/main/java/org/gcube/portlets/admin/vredeployer/server/portlet/VREViewerPortlet.java b/src/main/java/org/gcube/portlets/admin/vredeployer/server/portlet/VREViewerPortlet.java
new file mode 100644
index 0000000..9d2ed6d
--- /dev/null
+++ b/src/main/java/org/gcube/portlets/admin/vredeployer/server/portlet/VREViewerPortlet.java
@@ -0,0 +1,36 @@
+
+package org.gcube.portlets.admin.vredeployer.server.portlet;
+
+import java.io.IOException;
+
+import javax.portlet.ActionRequest;
+import javax.portlet.ActionResponse;
+import javax.portlet.GenericPortlet;
+import javax.portlet.PortletException;
+import javax.portlet.PortletRequestDispatcher;
+import javax.portlet.RenderRequest;
+import javax.portlet.RenderResponse;
+
+import org.gcube.portal.custom.scopemanager.scopehelper.ScopeHelper;
+
+/**
+ * CollectionViewerPortlet Portlet Class
+ * @author massi
+ */
+public class VREViewerPortlet extends GenericPortlet {
+
+ public void doView(RenderRequest request, RenderResponse response) throws PortletException, IOException {
+ ScopeHelper.setContext(request);
+ PortletRequestDispatcher dispatcher =
+ getPortletContext().getRequestDispatcher("/WEB-INF/jsp/CollectionViewerPortlet_view.jsp");
+ dispatcher.include(request, response);
+ }
+
+ /**
+ *
+ */
+ public void processAction(ActionRequest request, ActionResponse response)
+ throws PortletException, IOException {
+ }
+
+}
diff --git a/src/main/java/org/gcube/portlets/admin/vredeployer/shared/FieldVerifier.java b/src/main/java/org/gcube/portlets/admin/vredeployer/shared/FieldVerifier.java
new file mode 100644
index 0000000..21b4483
--- /dev/null
+++ b/src/main/java/org/gcube/portlets/admin/vredeployer/shared/FieldVerifier.java
@@ -0,0 +1,42 @@
+package org.gcube.portlets.admin.vredeployer.shared;
+
+/**
+ *
+ * FieldVerifier validates that the name the user enters is valid.
+ *
+ *
+ * This class is in the shared
packing because we use it in both
+ * the client code and on the server. On the client, we verify that the name is
+ * valid before sending an RPC request so the user doesn't have to wait for a
+ * network round trip to get feedback. On the server, we verify that the name is
+ * correct to ensure that the input is correct regardless of where the RPC
+ * originates.
+ *
+ *
+ * When creating a class that is used on both the client and the server, be sure
+ * that all code is translatable and does not use native JavaScript. Code that
+ * is note translatable (such as code that interacts with a database or the file
+ * system) cannot be compiled into client side JavaScript. Code that uses native
+ * JavaScript (such as Widgets) cannot be run on the server.
+ *
+ */
+public class FieldVerifier {
+
+ /**
+ * Verifies that the specified name is valid for our service.
+ *
+ * In this example, we only require that the name is at least four
+ * characters. In your application, you can use more complex checks to ensure
+ * that usernames, passwords, email addresses, URLs, and other fields have the
+ * proper syntax.
+ *
+ * @param name the name to validate
+ * @return true if valid, false if invalid
+ */
+ public static boolean isValidName(String name) {
+ if (name == null) {
+ return false;
+ }
+ return name.length() > 3;
+ }
+}
diff --git a/src/main/java/org/gcube/portlets/admin/vredeployer/shared/GHNBean.java b/src/main/java/org/gcube/portlets/admin/vredeployer/shared/GHNBean.java
new file mode 100644
index 0000000..04780d6
--- /dev/null
+++ b/src/main/java/org/gcube/portlets/admin/vredeployer/shared/GHNBean.java
@@ -0,0 +1,77 @@
+
+package org.gcube.portlets.admin.vredeployer.shared;
+
+import com.extjs.gxt.ui.client.data.BaseModel;
+
+public class GHNBean extends BaseModel {
+
+ private static final long serialVersionUID = 1L;
+ /**
+ * default const. for serialization
+ */
+ public GHNBean() { }
+ /**
+ *
+ * @param id
+ * @param host
+ * @param memory
+ * @param uptime
+ * @param isSelected
+ */
+ public GHNBean(String id, String host, String memory, String domain,
+ boolean isSelected, String diskSpace, String location, String country, boolean isSecure) {
+ set("id", id);
+ set("host", host);
+ set("memory", memory);
+ set("domain", domain);
+
+ set("isSelected", isSelected);
+ set("diskspace", diskSpace);
+ set("location", location);
+ set("country", country);
+ set("isSecure", isSecure);
+ }
+
+ /**
+ *
+ * @return
+ */
+
+ public String getDiskspace() {
+ return (String) get("diskspace");
+ }
+ public String getLocation() {
+ return (String) get("location");
+ }
+ public String getCountry() {
+ return (String) get("country");
+ }
+ public String getSecurity() {
+ return (String) get("security");
+ }
+
+ public String getId() {
+ return (String) get("id");
+ }
+
+ public String getHost() {
+ return (String) get("host");
+ }
+
+ public String getMemory() {
+ return (String) get("memory");
+ }
+
+ public String getDomain() {
+ return (String) get("domain");
+ }
+
+ public boolean isSelected() {
+ return ((Boolean) get("isSelected")).booleanValue();
+ }
+
+ public boolean isSecure() {
+ return ((Boolean) get("isSecure")).booleanValue();
+ }
+
+}
diff --git a/src/main/java/org/gcube/portlets/admin/vredeployer/shared/GHNMemory.java b/src/main/java/org/gcube/portlets/admin/vredeployer/shared/GHNMemory.java
new file mode 100644
index 0000000..855b423
--- /dev/null
+++ b/src/main/java/org/gcube/portlets/admin/vredeployer/shared/GHNMemory.java
@@ -0,0 +1,35 @@
+package org.gcube.portlets.admin.vredeployer.shared;
+
+import java.io.Serializable;
+
+public class GHNMemory implements Serializable {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ String virtualAvailable;
+ String localAvailableSpace;
+ public GHNMemory() {
+ super();
+ // TODO Auto-generated constructor stub
+ }
+ public GHNMemory(String virtualAvailable, String localAvailableSpace) {
+ super();
+ this.virtualAvailable = virtualAvailable + " MB";
+ this.localAvailableSpace = localAvailableSpace + " MB";
+ }
+ public String getVirtualAvailable() {
+ return virtualAvailable;
+ }
+ public void setVirtualAvailable(String virtualAvailable) {
+ this.virtualAvailable = virtualAvailable;
+ }
+ public String getLocalAvailableSpace() {
+ return localAvailableSpace;
+ }
+ public void setLocalAvailableSpace(String localAvailableSpace) {
+ this.localAvailableSpace = localAvailableSpace;
+ }
+
+
+}
diff --git a/src/main/java/org/gcube/portlets/admin/vredeployer/shared/GHNProfile.java b/src/main/java/org/gcube/portlets/admin/vredeployer/shared/GHNProfile.java
new file mode 100644
index 0000000..15324d8
--- /dev/null
+++ b/src/main/java/org/gcube/portlets/admin/vredeployer/shared/GHNProfile.java
@@ -0,0 +1,92 @@
+package org.gcube.portlets.admin.vredeployer.shared;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ *
+ * @author Massimiliano Assante ISTI-CNR
+ *
+ */
+public class GHNProfile implements Serializable {
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ private String id;
+ private String host;
+ private List runningInstances;
+ private boolean security;
+ private GHNMemory memory;
+ private GHNSite site;
+ private List libraries;
+ private boolean isSelected;
+ public GHNProfile() {
+ super();
+ }
+ public GHNProfile(String id, String host,
+ List runningInstances, boolean security,
+ GHNMemory memory, GHNSite site,
+ List libraries, boolean isSelected) {
+ super();
+ this.id = id;
+ this.host = host;
+ this.runningInstances = runningInstances;
+ this.security = security;
+ this.memory = memory;
+ this.site = site;
+ this.libraries = libraries;
+ this.isSelected = isSelected;
+ }
+ public String getId() {
+ return id;
+ }
+ public void setId(String id) {
+ this.id = id;
+ }
+ public String getHost() {
+ return host;
+ }
+ public void setHost(String host) {
+ this.host = host;
+ }
+ public List getRunningInstances() {
+ return runningInstances;
+ }
+ public void setRunningInstances(List runningInstances) {
+ this.runningInstances = runningInstances;
+ }
+ public boolean isSecure() {
+ return security;
+ }
+ public void setSecurity(Boolean securityEnabled) {
+ this.security = securityEnabled;
+ }
+ public GHNMemory getMemory() {
+ return memory;
+ }
+ public void setMemory(GHNMemory memory) {
+ this.memory = memory;
+ }
+ public GHNSite getSite() {
+ return site;
+ }
+ public void setSite(GHNSite site) {
+ this.site = site;
+ }
+ public List getLibraries() {
+ return libraries;
+ }
+ public void setLibraries(List libraries) {
+ this.libraries = libraries;
+ }
+
+ public boolean isSelected() {
+ return isSelected;
+ }
+ public void setSelected(boolean isSelected) {
+ this.isSelected = isSelected;
+ }
+
+}
diff --git a/src/main/java/org/gcube/portlets/admin/vredeployer/shared/GHNSite.java b/src/main/java/org/gcube/portlets/admin/vredeployer/shared/GHNSite.java
new file mode 100644
index 0000000..3ea77f2
--- /dev/null
+++ b/src/main/java/org/gcube/portlets/admin/vredeployer/shared/GHNSite.java
@@ -0,0 +1,39 @@
+package org.gcube.portlets.admin.vredeployer.shared;
+
+import java.io.Serializable;
+
+@SuppressWarnings("serial")
+public class GHNSite implements Serializable {
+
+ String location;
+ String country;
+ String domain;
+ public GHNSite() {
+ super();
+ }
+ public GHNSite(String location, String country, String domain) {
+ super();
+ this.location = location;
+ this.country = country;
+ this.domain = domain;
+ }
+ public String getLocation() {
+ return location;
+ }
+ public void setLocation(String location) {
+ this.location = location;
+ }
+ public String getCountry() {
+ return country;
+ }
+ public void setCountry(String country) {
+ this.country = country;
+ }
+ public String getDomain() {
+ return domain;
+ }
+ public void setDomain(String domain) {
+ this.domain = domain;
+ }
+
+}
diff --git a/src/main/java/org/gcube/portlets/admin/vredeployer/shared/ResourceCategory.java b/src/main/java/org/gcube/portlets/admin/vredeployer/shared/ResourceCategory.java
new file mode 100644
index 0000000..1762c35
--- /dev/null
+++ b/src/main/java/org/gcube/portlets/admin/vredeployer/shared/ResourceCategory.java
@@ -0,0 +1,57 @@
+package org.gcube.portlets.admin.vredeployer.shared;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+
+
+@SuppressWarnings("serial")
+public class ResourceCategory implements Serializable {
+
+ private String id;
+ private String name;
+ private ArrayList items;
+
+ public ResourceCategory() {
+ super();
+ }
+
+ public ResourceCategory(String id, String name,
+ ArrayList items) {
+ super();
+ this.id = id;
+ this.name = name;
+ this.items = items;
+ }
+
+ public ResourceCategory(String id, String name) {
+ super();
+ this.id = id;
+ this.name = name;
+ this.items = new ArrayList();
+ }
+
+
+ public String getId() {
+ return id;
+ }
+ public void setId(String id) {
+ this.id = id;
+ }
+ public String getName() {
+ return name;
+ }
+ public void setName(String name) {
+ this.name = name;
+ }
+ public ArrayList getItems() {
+ return items;
+ }
+ public void setItems(ArrayList items) {
+ this.items = items;
+ }
+
+ public void addResourceItem(ResourceCategoryItem item) {
+ items.add(item);
+ }
+
+}
diff --git a/src/main/java/org/gcube/portlets/admin/vredeployer/shared/ResourceCategoryItem.java b/src/main/java/org/gcube/portlets/admin/vredeployer/shared/ResourceCategoryItem.java
new file mode 100644
index 0000000..b010e97
--- /dev/null
+++ b/src/main/java/org/gcube/portlets/admin/vredeployer/shared/ResourceCategoryItem.java
@@ -0,0 +1,60 @@
+package org.gcube.portlets.admin.vredeployer.shared;
+
+import java.io.Serializable;
+
+@SuppressWarnings("serial")
+public class ResourceCategoryItem implements Serializable {
+
+ private String id;
+ private String name;
+ private String description;
+ private boolean isSelected;
+
+ public ResourceCategoryItem() {
+ super();
+ }
+
+ public ResourceCategoryItem(String id, String name, String description,
+ boolean isSelected) {
+ super();
+ this.id = id;
+ this.name = name;
+ this.description = description;
+ this.isSelected = isSelected;
+ }
+
+ public String getId() {
+ return id;
+ }
+
+ public void setId(String id) {
+ this.id = id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public String getDescription() {
+ return description;
+ }
+
+ public void setDescription(String description) {
+ this.description = description;
+ }
+
+ public boolean isSelected() {
+ return isSelected;
+ }
+
+ public void setSelected(boolean isSelected) {
+ this.isSelected = isSelected;
+ }
+
+
+
+}
diff --git a/src/main/java/org/gcube/portlets/admin/vredeployer/shared/RunningInstance.java b/src/main/java/org/gcube/portlets/admin/vredeployer/shared/RunningInstance.java
new file mode 100644
index 0000000..4c6ccfe
--- /dev/null
+++ b/src/main/java/org/gcube/portlets/admin/vredeployer/shared/RunningInstance.java
@@ -0,0 +1,37 @@
+package org.gcube.portlets.admin.vredeployer.shared;
+
+import java.io.Serializable;
+
+@SuppressWarnings("serial")
+public class RunningInstance implements Serializable {
+ private String name;
+ private String serviceClass;
+
+ public RunningInstance() {
+ super();
+ }
+
+ public RunningInstance(String name, String serviceClass) {
+ super();
+ this.name = name;
+ this.serviceClass = serviceClass;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public String getServiceClass() {
+ return serviceClass;
+ }
+
+ public void setServiceClass(String serviceClass) {
+ this.serviceClass = serviceClass;
+ }
+
+
+}
diff --git a/src/main/java/org/gcube/portlets/admin/vredeployer/shared/VREDeployerStatusType.java b/src/main/java/org/gcube/portlets/admin/vredeployer/shared/VREDeployerStatusType.java
new file mode 100644
index 0000000..999ab48
--- /dev/null
+++ b/src/main/java/org/gcube/portlets/admin/vredeployer/shared/VREDeployerStatusType.java
@@ -0,0 +1,23 @@
+package org.gcube.portlets.admin.vredeployer.shared;
+
+import com.google.gwt.user.client.rpc.IsSerializable;
+
+/**
+ *
+ * @author massi
+ *
+ */
+public enum VREDeployerStatusType implements IsSerializable {
+ /**
+ * APPROVE
+ */
+ APPROVE,
+ /**
+ * NON_APPROVE
+ */
+ NON_APPROVE,
+ /**
+ * DEPLOYING
+ */
+ DEPLOYING;
+}
diff --git a/src/main/java/org/gcube/portlets/admin/vredeployer/shared/VREDescrBean.java b/src/main/java/org/gcube/portlets/admin/vredeployer/shared/VREDescrBean.java
new file mode 100644
index 0000000..eba94ba
--- /dev/null
+++ b/src/main/java/org/gcube/portlets/admin/vredeployer/shared/VREDescrBean.java
@@ -0,0 +1,87 @@
+package org.gcube.portlets.admin.vredeployer.shared;
+
+import java.io.Serializable;
+import java.util.Calendar;
+import java.util.Date;
+
+@SuppressWarnings("serial")
+public class VREDescrBean implements Serializable {
+
+ private String name;
+
+ private String description;
+
+ private String designer;
+
+ private String manager;
+
+ private Date startTime;
+
+ private Date endTime;
+
+ public VREDescrBean() {
+ super();
+ // TODO Auto-generated constructor stub
+ }
+
+ public VREDescrBean(String name, String description, String designer,
+ String manager, Date startTime, Date endTime) {
+ super();
+ this.name = name;
+ this.description = description;
+ this.designer = designer;
+ this.manager = manager;
+ this.startTime = startTime;
+ this.endTime = endTime;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public String getDescription() {
+ return description;
+ }
+
+ public void setDescription(String description) {
+ this.description = description;
+ }
+
+ public String getDesigner() {
+ return designer;
+ }
+
+ public void setDesigner(String designer) {
+ this.designer = designer;
+ }
+
+ public String getManager() {
+ return manager;
+ }
+
+ public void setManager(String manager) {
+ this.manager = manager;
+ }
+
+ public Date getStartTime() {
+ return startTime;
+ }
+
+ public void setStartTime(Date startTime) {
+ this.startTime = startTime;
+ }
+
+ public Date getEndTime() {
+ return endTime;
+ }
+
+ public void setEndTime(Date endTime) {
+ this.endTime = endTime;
+ }
+
+
+}
diff --git a/src/main/java/org/gcube/portlets/admin/vredeployer/shared/deployreport/ClientCloudReport.java b/src/main/java/org/gcube/portlets/admin/vredeployer/shared/deployreport/ClientCloudReport.java
new file mode 100644
index 0000000..8b38fa2
--- /dev/null
+++ b/src/main/java/org/gcube/portlets/admin/vredeployer/shared/deployreport/ClientCloudReport.java
@@ -0,0 +1,62 @@
+package org.gcube.portlets.admin.vredeployer.shared.deployreport;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ *
+ * @author massi
+ *
+ */
+public class ClientCloudReport implements Serializable {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ /**
+ *
+ */
+ private DeployStatus status;
+
+ /**
+ *
+ */
+ private List itemsStatuses;
+ /**
+ *
+ */
+ public ClientCloudReport() {
+ super();
+ }
+
+ /**
+ *
+ * @param globalstatus
+ * @param itemsStatuses
+ */
+ public ClientCloudReport(DeployStatus globalstatus,
+ List itemsStatuses) {
+ super();
+ this.status = globalstatus;
+ this.itemsStatuses = itemsStatuses;
+ }
+
+ public DeployStatus getStatus() {
+ return status;
+ }
+
+ public void setStatus(DeployStatus status) {
+ this.status = status;
+ }
+
+ public List getItemsStatuses() {
+ return itemsStatuses;
+ }
+
+ public void setItemsStatuses(List itemsStatuses) {
+ this.itemsStatuses = itemsStatuses;
+ }
+
+
+}
diff --git a/src/main/java/org/gcube/portlets/admin/vredeployer/shared/deployreport/ClientDeployReport.java b/src/main/java/org/gcube/portlets/admin/vredeployer/shared/deployreport/ClientDeployReport.java
new file mode 100644
index 0000000..d344e6f
--- /dev/null
+++ b/src/main/java/org/gcube/portlets/admin/vredeployer/shared/deployreport/ClientDeployReport.java
@@ -0,0 +1,126 @@
+package org.gcube.portlets.admin.vredeployer.shared.deployreport;
+
+import java.io.Serializable;
+
+@SuppressWarnings("serial")
+public class ClientDeployReport implements Serializable {
+ /**
+ *
+ */
+ private DeployStatus globalStatus;
+ /**
+ *
+ */
+ private ClientCloudReport cloudReport;
+ /**
+ *
+ */
+ private ClientResourceManagerDeployingReport resourceManagerReport;
+ /**
+ *
+ */
+ private ClientFunctionalityDeployReport functionalityReport;
+ /**
+ *
+ */
+ private ClientResourcesDeployReport resourcesReport;
+ /**
+ *
+ */
+ public ClientDeployReport() {
+ super();
+ }
+ /**
+ *
+ * @param status status
+ * @param cloudReport cloudReport
+ * @param resourceManagerReport resourceManagerReport
+ * @param functionalityReport functionalityReport
+ * @param resourcesReport resourcesReport
+ */
+ public ClientDeployReport(DeployStatus status,
+ ClientCloudReport cloudReport,
+ ClientResourceManagerDeployingReport resourceManagerReport,
+ ClientFunctionalityDeployReport functionalityReport,
+ ClientResourcesDeployReport resourcesReport) {
+ super();
+ this.globalStatus = status;
+ this.cloudReport = cloudReport;
+ this.resourceManagerReport = resourceManagerReport;
+ this.functionalityReport = functionalityReport;
+ this.resourcesReport = resourcesReport;
+ }
+ /**
+ * @return
+ */
+ public DeployStatus getGlobalsStatus() {
+ return globalStatus;
+ }
+ /**
+ *
+ * @param status
+ */
+ public void setGlobalStatus(DeployStatus status) {
+ this.globalStatus = status;
+ }
+ /**
+ *
+ * @return
+ */
+ public ClientCloudReport getCloudReport() {
+ return cloudReport;
+ }
+ /**
+ *
+ * @param cloudReport
+ */
+ public void setCloudReport(ClientCloudReport cloudReport) {
+ this.cloudReport = cloudReport;
+ }
+ /**
+ *
+ * @return
+ */
+ public ClientResourceManagerDeployingReport getResourceManagerReport() {
+ return resourceManagerReport;
+ }
+ /**
+ *
+ * @param resourceManagerReport
+ */
+ public void setResourceManagerReport(
+ ClientResourceManagerDeployingReport resourceManagerReport) {
+ this.resourceManagerReport = resourceManagerReport;
+ }
+ /**
+ *
+ * @return
+ */
+ public ClientFunctionalityDeployReport getFunctionalityReport() {
+ return functionalityReport;
+ }
+ /**
+ *
+ * @param functionalityReport
+ */
+ public void setFunctionalityReport(
+ ClientFunctionalityDeployReport functionalityReport) {
+ this.functionalityReport = functionalityReport;
+ }
+ /**
+ *
+ * @return
+ */
+ public ClientResourcesDeployReport getResourcesReport() {
+ return resourcesReport;
+ }
+ /**
+ *
+ * @param resourcesReport
+ */
+ public void setResourcesReport(ClientResourcesDeployReport resourcesReport) {
+ this.resourcesReport = resourcesReport;
+ }
+
+
+}
diff --git a/src/main/java/org/gcube/portlets/admin/vredeployer/shared/deployreport/ClientFunctionalityDeployReport.java b/src/main/java/org/gcube/portlets/admin/vredeployer/shared/deployreport/ClientFunctionalityDeployReport.java
new file mode 100644
index 0000000..7fb72db
--- /dev/null
+++ b/src/main/java/org/gcube/portlets/admin/vredeployer/shared/deployreport/ClientFunctionalityDeployReport.java
@@ -0,0 +1,97 @@
+package org.gcube.portlets.admin.vredeployer.shared.deployreport;
+
+import java.io.Serializable;
+import java.util.HashMap;
+import java.util.List;
+
+/**
+ *
+ * @author massi
+ *
+ */
+public class ClientFunctionalityDeployReport implements Serializable {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ /**
+ *
+ */
+ private DeployStatus status;
+ /**
+ *
+ */
+ private String reportXML;
+ /**
+ *
+ */
+ private HashMap> funTable;
+ /**
+ *
+ */
+ public ClientFunctionalityDeployReport() {
+ super();
+ // TODO Auto-generated constructor stub
+ }
+ /**
+ *
+ * @param globalstatus
+ * @param reportXML
+ * @param funTable
+ */
+ public ClientFunctionalityDeployReport(
+ DeployStatus globalstatus,
+ String reportXML,
+ HashMap> funTable) {
+ super();
+ this.status = globalstatus;
+ this.reportXML = reportXML;
+ this.funTable = funTable;
+ }
+
+ /**
+ *
+ * @return
+ */
+ public DeployStatus getStatus() {
+ return status;
+ }
+ /**
+ *
+ * @param globalstatus
+ */
+ public void setStatus(DeployStatus globalstatus) {
+ this.status = globalstatus;
+ }
+ /**
+ *
+ * @return
+ */
+ public HashMap> getFunTable() {
+ return funTable;
+ }
+
+ /**
+ *
+ * @param funTable
+ */
+ public void setFunTable(
+ HashMap> funTable) {
+ this.funTable = funTable;
+ }
+ /**
+ *
+ * @return
+ */
+ public String getReportXML() {
+ return reportXML;
+ }
+ /**
+ *
+ * @param reportXML
+ */
+ public void setReportXML(String reportXML) {
+ this.reportXML = reportXML;
+ }
+
+}
diff --git a/src/main/java/org/gcube/portlets/admin/vredeployer/shared/deployreport/ClientFunctionalityReport.java b/src/main/java/org/gcube/portlets/admin/vredeployer/shared/deployreport/ClientFunctionalityReport.java
new file mode 100644
index 0000000..503f224
--- /dev/null
+++ b/src/main/java/org/gcube/portlets/admin/vredeployer/shared/deployreport/ClientFunctionalityReport.java
@@ -0,0 +1,80 @@
+package org.gcube.portlets.admin.vredeployer.shared.deployreport;
+
+import java.io.Serializable;
+
+public class ClientFunctionalityReport implements Serializable {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ /**
+ *
+ */
+ private String id;
+ /**
+ *
+ */
+ private String name;
+ /**
+ *
+ */
+ private DeployStatus status;
+ public ClientFunctionalityReport() {
+ super();
+ // TODO Auto-generated constructor stub
+ }
+ /**
+ *
+ * @param id
+ * @param name
+ * @param status
+ */
+ public ClientFunctionalityReport(int id, String name, DeployStatus status) {
+ super();
+ this.id = id+"";
+ this.name = name;
+ this.status = status;
+ }
+ /**
+ *
+ * @return id
+ */
+ public String getId() {
+ return id;
+ }
+ /**
+ *
+ * @param id
+ */
+ public void setId(String id) {
+ this.id = id;
+ }
+ /**
+ *
+ * @return name
+ */
+ public String getName() {
+ return name;
+ }
+ /**
+ *
+ * @param name a name
+ */
+ public void setName(String name) {
+ this.name = name;
+ }
+ /**
+ *
+ * @return
+ */
+ public DeployStatus getStatus() {
+ return status;
+ }
+ /**
+ *
+ * @param status
+ */
+ public void setStatus(DeployStatus status) {
+ this.status = status;
+ }
+}
diff --git a/src/main/java/org/gcube/portlets/admin/vredeployer/shared/deployreport/ClientResource.java b/src/main/java/org/gcube/portlets/admin/vredeployer/shared/deployreport/ClientResource.java
new file mode 100644
index 0000000..4cc11c5
--- /dev/null
+++ b/src/main/java/org/gcube/portlets/admin/vredeployer/shared/deployreport/ClientResource.java
@@ -0,0 +1,87 @@
+package org.gcube.portlets.admin.vredeployer.shared.deployreport;
+
+import com.google.gwt.user.client.rpc.IsSerializable;
+
+
+/**
+ *
+ * @author massi
+ *
+ */
+public class ClientResource implements IsSerializable {
+ /**
+ *
+ */
+ private String resourceid;
+ /**
+ *
+ */
+ private String resourceType;
+ /**
+ *
+ */
+ private DeployStatus status;
+ /**
+ *
+ */
+ public ClientResource() {
+ super();
+ // TODO Auto-generated constructor stub
+ }
+ /**
+ *
+ * @param resourceid -
+ * @param resourceType -
+ * @param status -
+ */
+ public ClientResource(String resourceid, String resourceType,
+ DeployStatus status) {
+ super();
+ this.resourceid = resourceid;
+ this.resourceType = resourceType;
+ this.status = status;
+ }
+ /**
+ *
+ * @return -
+ */
+ public String getResourceid() {
+ return resourceid;
+ }
+ /**
+ *
+ * @param resourceid-
+ */
+ public void setResourceid(String resourceid) {
+ this.resourceid = resourceid;
+ }
+ /**
+ *
+ * @return -
+ */
+ public String getResourceType() {
+ return resourceType;
+ }
+ /**
+ *
+ * @param resourceType -
+ */
+ public void setResourceType(String resourceType) {
+ this.resourceType = resourceType;
+ }
+ /**
+ *
+ * @return -
+ */
+ public DeployStatus getStatus() {
+ return status;
+ }
+ /**
+ *
+ * @param status -
+ */
+ public void setStatus(DeployStatus status) {
+ this.status = status;
+ }
+
+}
diff --git a/src/main/java/org/gcube/portlets/admin/vredeployer/shared/deployreport/ClientResourceManagerDeployingReport.java b/src/main/java/org/gcube/portlets/admin/vredeployer/shared/deployreport/ClientResourceManagerDeployingReport.java
new file mode 100644
index 0000000..574d869
--- /dev/null
+++ b/src/main/java/org/gcube/portlets/admin/vredeployer/shared/deployreport/ClientResourceManagerDeployingReport.java
@@ -0,0 +1,52 @@
+package org.gcube.portlets.admin.vredeployer.shared.deployreport;
+
+import java.io.Serializable;
+
+/**
+ *
+ * @author massi
+ *
+ */
+public class ClientResourceManagerDeployingReport implements Serializable {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ /**
+ *
+ */
+ private DeployStatus status;
+ /**
+ *
+ */
+ private String reportXML;
+
+ public ClientResourceManagerDeployingReport() {
+ super();
+ // TODO Auto-generated constructor stub
+ }
+
+ public ClientResourceManagerDeployingReport(DeployStatus status,
+ String reportXML) {
+ super();
+ this.status = status;
+ this.reportXML = reportXML;
+ }
+
+ public DeployStatus getStatus() {
+ return status;
+ }
+
+ public void setStatus(DeployStatus status) {
+ this.status = status;
+ }
+
+ public String getReportXML() {
+ return reportXML;
+ }
+
+ public void setReportXML(String reportXML) {
+ this.reportXML = reportXML;
+ }
+
+}
diff --git a/src/main/java/org/gcube/portlets/admin/vredeployer/shared/deployreport/ClientResourcesDeployReport.java b/src/main/java/org/gcube/portlets/admin/vredeployer/shared/deployreport/ClientResourcesDeployReport.java
new file mode 100644
index 0000000..8183ec4
--- /dev/null
+++ b/src/main/java/org/gcube/portlets/admin/vredeployer/shared/deployreport/ClientResourcesDeployReport.java
@@ -0,0 +1,66 @@
+package org.gcube.portlets.admin.vredeployer.shared.deployreport;
+
+import java.io.Serializable;
+import java.util.List;
+
+public class ClientResourcesDeployReport implements Serializable {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ /**
+ *
+ */
+ private DeployStatus status;
+
+ /**
+ *
+ */
+ private List resources;
+ /**
+ *
+ */
+ public ClientResourcesDeployReport() {
+ super();
+ // TODO Auto-generated constructor stub
+ }
+ /**
+ *
+ * @param globalstatus -
+ * @param resources -
+ */
+ public ClientResourcesDeployReport(DeployStatus globalstatus, List resources) {
+ super();
+ this.status = globalstatus;
+ this.resources = resources;
+ }
+ /**
+ *
+ * @return -
+ */
+ public DeployStatus getStatus() {
+ return status;
+ }
+ /**
+ *
+ * @param globalstatus -
+ */
+ public void setStatus(DeployStatus globalstatus) {
+ this.status = globalstatus;
+ }
+ /**
+ *
+ * @return -
+ */
+ public List getResources() {
+ return resources;
+ }
+ /**
+ *
+ * @param resources -
+ */
+ public void setResources(List resources) {
+ this.resources = resources;
+ }
+
+}
diff --git a/src/main/java/org/gcube/portlets/admin/vredeployer/shared/deployreport/ClientServiceReport.java b/src/main/java/org/gcube/portlets/admin/vredeployer/shared/deployreport/ClientServiceReport.java
new file mode 100644
index 0000000..269a4b3
--- /dev/null
+++ b/src/main/java/org/gcube/portlets/admin/vredeployer/shared/deployreport/ClientServiceReport.java
@@ -0,0 +1,84 @@
+package org.gcube.portlets.admin.vredeployer.shared.deployreport;
+
+import java.io.Serializable;
+
+public class ClientServiceReport implements Serializable {
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ /**
+ *
+ */
+ private String name;
+ /**
+ *
+ */
+ private String serviceClass;
+ /**
+ *
+ */
+ private String version;
+ /**
+ *
+ */
+ public ClientServiceReport() {
+ super();
+ }
+ /**
+ *
+ * @param name service name
+ * @param serviceClass service class
+ * @param version its version
+ */
+ public ClientServiceReport(String name, String serviceClass, String version) {
+ super();
+ this.name = name;
+ this.serviceClass = serviceClass;
+ this.version = version;
+ }
+ /**
+ *
+ * @return .
+ */
+ public String getName() {
+ return name;
+ }
+ /**
+ *
+ * @param name .
+ */
+ public void setName(String name) {
+ this.name = name;
+ }
+ /**
+ *
+ * @return .
+ */
+ public String getServiceClass() {
+ return serviceClass;
+ }
+ /**
+ *
+ * @param serviceClass .
+ */
+ public void setServiceClass(String serviceClass) {
+ this.serviceClass = serviceClass;
+ }
+ /**
+ *
+ * @return .
+ */
+ public String getVersion() {
+ return version;
+ }
+ /**
+ *
+ * @param version .
+ */
+ public void setVersion(String version) {
+ this.version = version;
+ }
+
+}
diff --git a/src/main/java/org/gcube/portlets/admin/vredeployer/shared/deployreport/DeployStatus.java b/src/main/java/org/gcube/portlets/admin/vredeployer/shared/deployreport/DeployStatus.java
new file mode 100644
index 0000000..f3fdf46
--- /dev/null
+++ b/src/main/java/org/gcube/portlets/admin/vredeployer/shared/deployreport/DeployStatus.java
@@ -0,0 +1,15 @@
+package org.gcube.portlets.admin.vredeployer.shared.deployreport;
+
+/**
+ *
+ * @author massi
+ *
+ */
+public enum DeployStatus {
+ WAIT,
+ RUN,
+ FINISH,
+ FAIL,
+ SKIP,
+ PENDING;
+}
diff --git a/src/main/resources/org/gcube/portlets/admin/vredeployer/Vredeployer.gwt.xml b/src/main/resources/org/gcube/portlets/admin/vredeployer/Vredeployer.gwt.xml
new file mode 100644
index 0000000..e09ab60
--- /dev/null
+++ b/src/main/resources/org/gcube/portlets/admin/vredeployer/Vredeployer.gwt.xml
@@ -0,0 +1,35 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/main/webapp/Vredeployer.css b/src/main/webapp/Vredeployer.css
new file mode 100644
index 0000000..8983583
--- /dev/null
+++ b/src/main/webapp/Vredeployer.css
@@ -0,0 +1,40 @@
+/** Add css rules here for your application. */
+
+
+.info-icon {
+ background-image:url(images/icons/information.png) !important;
+}
+.content-icon {
+ background-image:url(images/icons/content.png) !important;
+}
+.collections-icon {
+ background-image:url(images/icons/collections.png) !important;
+}
+.metadata-icon {
+ background-image:url(images/icons/metadata.png) !important;
+}
+.functionality-icon {
+ background-image:url(images/icons/functionality.png) !important;
+}
+.functionality-add-icon {
+ background-image:url(images/icons/functionality_add.png) !important;
+}
+.architecture-icon {
+ background-image:url(images/icons/architecture.png) !important;
+}
+.report-icon {
+ background-image:url(images/icons/report.png) !important;
+}
+.play-icon {
+ background-image:url(images/icons/play.png) !important;
+}
+.runninginstance-icon {
+ background-image:url(images/icons/runninginstance.png) !important;
+}
+.missing-ri {
+ background-image:url(images/cog_error.png) !important;
+}
+
+.extres-icon {
+ background-image:url(images/icons/ext_resource.png) !important;
+}
\ No newline at end of file
diff --git a/src/main/webapp/Vredeployer.html b/src/main/webapp/Vredeployer.html
new file mode 100644
index 0000000..bc67b16
--- /dev/null
+++ b/src/main/webapp/Vredeployer.html
@@ -0,0 +1,37 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ VRE Deployer
+
+
+
+
+
+
+
+
+
+
+ Your web browser must have JavaScript enabled
+ in order for this application to display correctly.
+
+
+
+
+
+
+
diff --git a/src/main/webapp/WEB-INF/jsp/CollectionViewerPortlet_edit.jsp b/src/main/webapp/WEB-INF/jsp/CollectionViewerPortlet_edit.jsp
new file mode 100644
index 0000000..0a197a8
--- /dev/null
+++ b/src/main/webapp/WEB-INF/jsp/CollectionViewerPortlet_edit.jsp
@@ -0,0 +1,13 @@
+<%@page contentType="text/html"%>
+<%@page pageEncoding="UTF-8"%>
+
+<%-- Uncomment below lines to add portlet taglibs to jsp
+<%@ page import="javax.portlet.*"%>
+<%@ taglib uri="http://java.sun.com/portlet_2_0" prefix="portlet"%>
+
+
+--%>
+
+
+ EDIT MODE
+
\ No newline at end of file
diff --git a/src/main/webapp/WEB-INF/jsp/CollectionViewerPortlet_help.jsp b/src/main/webapp/WEB-INF/jsp/CollectionViewerPortlet_help.jsp
new file mode 100644
index 0000000..39ed5a1
--- /dev/null
+++ b/src/main/webapp/WEB-INF/jsp/CollectionViewerPortlet_help.jsp
@@ -0,0 +1,13 @@
+<%@page contentType="text/html"%>
+<%@page pageEncoding="UTF-8"%>
+
+<%-- Uncomment below lines to add portlet taglibs to jsp
+<%@ page import="javax.portlet.*"%>
+<%@ taglib uri="http://java.sun.com/portlet_2_0" prefix="portlet"%>
+
+
+--%>
+
+
+ HELP MODE
+
\ No newline at end of file
diff --git a/src/main/webapp/WEB-INF/jsp/CollectionViewerPortlet_view.jsp b/src/main/webapp/WEB-INF/jsp/CollectionViewerPortlet_view.jsp
new file mode 100644
index 0000000..50510b8
--- /dev/null
+++ b/src/main/webapp/WEB-INF/jsp/CollectionViewerPortlet_view.jsp
@@ -0,0 +1,17 @@
+<%@page contentType="text/html"%>
+<%@page pageEncoding="UTF-8"%>
+
+<%-- Uncomment below lines to add portlet taglibs to jsp
+<%@ page import="javax.portlet.*"%>
+<%@ taglib uri="http://java.sun.com/portlet_2_0" prefix="portlet"%>
+
+
+--%>
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/main/webapp/WEB-INF/liferay-display.xml b/src/main/webapp/WEB-INF/liferay-display.xml
new file mode 100644
index 0000000..806ed1a
--- /dev/null
+++ b/src/main/webapp/WEB-INF/liferay-display.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
diff --git a/src/main/webapp/WEB-INF/liferay-plugin-package.properties b/src/main/webapp/WEB-INF/liferay-plugin-package.properties
new file mode 100644
index 0000000..a974b90
--- /dev/null
+++ b/src/main/webapp/WEB-INF/liferay-plugin-package.properties
@@ -0,0 +1,9 @@
+name=VRE Deployer
+module-group-id=liferay
+module-incremental-version=1
+tags=
+short-description=
+change-log=
+page-url=http://www.liferay.com
+author=Liferay, Inc.
+licenses=MIT
\ No newline at end of file
diff --git a/src/main/webapp/WEB-INF/liferay-portlet.xml b/src/main/webapp/WEB-INF/liferay-portlet.xml
new file mode 100644
index 0000000..ac7378c
--- /dev/null
+++ b/src/main/webapp/WEB-INF/liferay-portlet.xml
@@ -0,0 +1,17 @@
+
+
+
+
+
+ deployer
+ false
+ false
+ false
+
+ /Wizard.css
+
+
+ administrator
+ Administrator
+
+
diff --git a/src/main/webapp/WEB-INF/portlet.xml b/src/main/webapp/WEB-INF/portlet.xml
new file mode 100644
index 0000000..be8dfd8
--- /dev/null
+++ b/src/main/webapp/WEB-INF/portlet.xml
@@ -0,0 +1,24 @@
+
+
+
+ deployer
+ VRE Deployer
+ org.gcube.portlets.admin.vredeployer.server.portlet.VREViewerPortlet
+
+ view-jsp
+ /WEB-INF/jsp/VREDeployerPortlet_view.jsp
+
+ 0
+
+ text/html
+
+
+ VRE Deployer
+ VRE Deployer
+ VRE Deployer
+
+
+ administrator
+
+
+
diff --git a/src/main/webapp/WEB-INF/web.xml b/src/main/webapp/WEB-INF/web.xml
new file mode 100644
index 0000000..50afba3
--- /dev/null
+++ b/src/main/webapp/WEB-INF/web.xml
@@ -0,0 +1,24 @@
+
+
+
+
+
+
+
+ VREDeployerServiceImpl
+ org.gcube.portlets.admin.vredeployer.server.VREDeployerServiceImpl
+
+
+
+ VREDeployerServiceImpl
+ /vredeployer/VREDeployerServiceImpl
+
+
+
+
+ Vredeployer.html
+
+
+
diff --git a/src/main/webapp/gxt/chart/open-flash-chart.swf b/src/main/webapp/gxt/chart/open-flash-chart.swf
new file mode 100755
index 0000000..5ec4444
Binary files /dev/null and b/src/main/webapp/gxt/chart/open-flash-chart.swf differ
diff --git a/src/main/webapp/gxt/css/gxt-all.css b/src/main/webapp/gxt/css/gxt-all.css
new file mode 100755
index 0000000..c426966
--- /dev/null
+++ b/src/main/webapp/gxt/css/gxt-all.css
@@ -0,0 +1,7443 @@
+html,body,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,form,fieldset,input,p,blockquote,th,td{margin:0;padding:0;}img,body,html{border:0;}address,caption,cite,code,dfn,em,strong,th,var{font-style:normal;font-weight:normal;}ol,ul {list-style:none;}caption,th {text-align:left;}h1,h2,h3,h4,h5,h6{font-size:100%;}q:before,q:after{content:'';}
+.x-contrast-test {
+ background: url(../images/default/s.gif);
+ visibility: hidden;
+ position: relative;
+ left: -1000px;
+ top: -1000px;
+}
+.ext-el-mask {
+ z-index: 100;
+ position: absolute;
+ top: 0;
+ left: 0;
+ -moz-opacity: 0.5;
+ opacity: .50;
+ filter: alpha(opacity = 50);
+ width: 100%;
+ height: 100%;
+ zoom: 1;
+}
+
+.ext-el-mask-msg {
+ z-index: 101;
+ position: absolute;
+ top: 0;
+ left: 0;
+ border: 1px solid;
+ background: repeat-x 0 -16px;
+ padding: 2px;
+}
+
+.ext-el-mask-msg div {
+ padding: 5px 10px 5px 10px;
+ border: 1px solid;
+ cursor: wait;
+}
+
+.ext-webkit *:focus {
+ outline: none !important;
+}
+
+.ext-webkit .x-form-check-wrap input:focus {
+ outline: auto !important;
+}
+
+.ext-shim {
+ position: absolute;
+ visibility: hidden;
+ left: 0;
+ top: 0;
+ overflow: hidden;
+}
+
+.ext-ie .ext-shim {
+ filter: alpha(opacity = 0);
+}
+
+.ext-ie6 .ext-shim {
+ margin-left: 5px;
+ margin-top: 3px;
+}
+
+.x-mask-loading div {
+ padding: 5px 10px 5px 25px;
+ background: no-repeat 5px 5px;
+ line-height: 16px;
+}
+
+.x-hidden,.x-hide-offsets {
+ position: absolute !important;
+ left: -10000px !important;
+ top: -10000px !important;
+ visibility: hidden !important;
+}
+
+.x-hide-display {
+ display: none !important;
+}
+
+.x-hide-visibility {
+ visibility: hidden !important;
+}
+
+.x-masked {
+ overflow: hidden !important;
+}
+
+.x-masked-relative {
+ position: relative !important;
+}
+
+.x-masked select,.x-masked object,.x-masked embed {
+ visibility: hidden;
+}
+
+.x-layer {
+ visibility: hidden;
+}
+
+.x-unselectable,.x-unselectable * {
+ -moz-user-select: none;
+ -khtml-user-select: none;
+ -webkit-user-select: ignore;
+}
+
+.x-unselectable-single {
+ -moz-user-select: none;
+ -khtml-user-select: none;
+ -webkit-user-select: ignore;
+}
+
+.x-selectable,.x-selectable * {
+ -moz-user-select: text !important;
+ -webkit-user-select: auto;
+}
+
+.x-repaint {
+ zoom: 1;
+ background-color: transparent;
+ -moz-outline: none;
+ outline: 0 none;
+}
+
+.x-item-disabled {
+ cursor: default;
+ opacity: .6;
+ -moz-opacity: .6;
+ filter: alpha(opacity = 60);
+}
+
+.ext-ie .x-item-disabled {
+ filter: none !important;
+}
+
+.x-item-disabled * {
+ cursor: default !important;
+}
+
+.x-splitbar-proxy {
+ position: absolute;
+ visibility: hidden;
+ z-index: 20001;
+ zoom: 1;
+ line-height: 1px;
+ font-size: 1px;
+ overflow: hidden;
+}
+
+.x-splitbar-h,.x-splitbar-proxy-h {
+ cursor: e-resize;
+ cursor: col-resize;
+}
+
+.x-splitbar-v,.x-splitbar-proxy-v {
+ cursor: s-resize;
+ cursor: row-resize;
+}
+
+.x-color-palette {
+ width: 150px;
+ height: 92px;
+ cursor: pointer;
+ -moz-outline: 0 none;
+ outline: 0 none;
+}
+
+.x-color-palette a {
+ border: 1px solid;
+ float: left;
+ padding: 2px;
+ text-decoration: none;
+ -moz-outline: 0 none;
+ outline: 0 none;
+ cursor: pointer;
+}
+
+.x-color-palette a.x-color-palette-hover,.x-color-palette a.x-color-palette-sel {
+ border: 1px solid;
+}
+
+.x-color-palette em {
+ display: block;
+ border: 1px solid;
+}
+
+.x-color-palette em span {
+ cursor: pointer;
+ display: block;
+ height: 10px;
+ line-height: 10px;
+ width: 10px;
+}
+
+.x-ie-shadow {
+ display: none;
+ position: absolute;
+ overflow: hidden;
+ left: 0;
+ top: 0;
+ zoom: 1;
+}
+
+.x-shadow {
+ display: none;
+ position: absolute;
+ overflow: hidden;
+ left: 0;
+ top: 0;
+}
+
+.x-shadow * {
+ overflow: hidden;
+}
+
+.x-shadow * {
+ padding: 0;
+ border: 0;
+ margin: 0;
+ clear: none;
+ zoom: 1;
+}
+
+.x-shadow .xstc,.x-shadow .xsbc {
+ height: 6px;
+ float: left;
+}
+
+.x-shadow .xstl,.x-shadow .xstr,.x-shadow .xsbl,.x-shadow .xsbr {
+ width: 6px;
+ height: 6px;
+ float: left;
+}
+
+.x-shadow .xsc {
+ width: 100%;
+}
+
+.x-shadow .xsml,.x-shadow .xsmr {
+ width: 6px;
+ float: left;
+ height: 100%;
+}
+
+.x-shadow .xsmc {
+ float: left;
+ height: 100%;
+ background: transparent;
+}
+
+.x-shadow .xst,.x-shadow .xsb {
+ height: 6px;
+ overflow: hidden;
+ width: 100%;
+}
+
+.x-shadow .xsml {
+ background: transparent repeat-y 0 0;
+}
+
+.x-shadow .xsmr {
+ background: transparent repeat-y -6px 0;
+}
+
+.x-shadow .xstl {
+ background: transparent no-repeat 0 0;
+}
+
+.x-shadow .xstc {
+ background: transparent repeat-x 0 -30px;
+}
+
+.x-shadow .xstr {
+ background: transparent repeat-x 0 -18px;
+}
+
+.x-shadow .xsbl {
+ background: transparent no-repeat 0 -12px;
+}
+
+.x-shadow .xsbc {
+ background: transparent repeat-x 0 -36px;
+}
+
+.x-shadow .xsbr {
+ background: transparent repeat-x 0 -6px;
+}
+
+.loading-indicator {
+ background: no-repeat left;
+ padding-left: 20px;
+ line-height: 16px;
+ margin: 3px;
+}
+
+.x-text-resize {
+ position: absolute;
+ left: -1000px;
+ top: -1000px;
+ visibility: hidden;
+ zoom: 1;
+}
+
+.x-drag-overlay {
+ width: 100%;
+ height: 100%;
+ display: none;
+ position: absolute;
+ left: 0;
+ top: 0;
+ background-image: url(../images/default/s.gif);
+ z-index: 20000;
+}
+
+.x-clear {
+ clear: both;
+ overflow: hidden;
+ line-height: 0;
+ font-size: 0;
+}
+
+.x-spotlight {
+ z-index: 8999;
+ position: absolute;
+ top: 0;
+ left: 0;
+ -moz-opacity: 0.5;
+ opacity: .50;
+ filter: alpha(opacity = 50);
+ width: 0;
+ height: 0;
+ zoom: 1;
+}
+
+#x-history-frame {
+ position: absolute;
+ top: -1px;
+ left: 0;
+ width: 1px;
+ height: 1px;
+ visibility: hidden;
+}
+
+#x-history-field {
+ position: absolute;
+ top: 0;
+ left: -1px;
+ width: 1px;
+ height: 1px;
+ visibility: hidden;
+}
+
+.x-portlet {
+ margin-bottom: 10px;
+}
+
+.x-portlet .x-panel-body {
+ background-color: white !important;
+}
+
+.ext-ie .x-btn-icon .x-btn-center .x-btn-text {
+ height: auto;
+}
+
+.x-portal-insert div {
+ height: 4px;
+ font-size: 0px;
+ border: 2px dotted blue;
+}
+
+.icon-wait {
+ background: url(../images/gxt/icons/wait.gif) no-repeat !important;
+}
+
+.x-panel-icon {
+ padding-left: 20px !important;
+}
+
+.x-icon-btn {
+ width: 16px;
+ height: 16px;
+ overflow: hidden;
+ background-repeat: no-repeat;
+ cursor: pointer;
+}
+
+.x-panel-inline-icon {
+ margin-top: 0;
+}
+
+.x-modal {
+ position: absolute;
+ z-index: 10;
+ background-color: black;
+ filter: alpha(opacity = 10);
+ opacity: .1;
+ left: 0px;
+ top: 0px;
+}
+
+.x-progress {
+ font-family: tahoma, arial, helvetica, sans-serif;
+}
+
+.x-float-right {
+ float: right;
+}
+
+.x-toolbar .x-float-right {
+ margin-right: 4px;
+}
+
+.x-border {
+ border: 1px solid #99BBE8;
+}
+
+.x-border-top {
+ border-top: 1px solid #99BBE8;
+}
+
+.x-layout-popup {
+ background-color: #DFE8F6;
+ border: 1px solid #7CA4D9;
+}
+
+.x-panel-popup-body {
+ border-top: 1px solid #99BBE8;
+}
+
+.x-layout-collapsed .x-panel-header {
+ border-left: none;
+ border-right: none;
+ border-top: none;
+}
+
+.x-layout-collapsed .x-panel-header .x-tool {
+ margin: 0 0 0 -4px;
+ padding: 0px;
+}
+
+.x-layout-collapsed {
+ position: absolute;
+ visibility: hidden;
+ background-color: #d2e0f2;
+ width: 20px;
+ height: 20px;
+ overflow: hidden;
+ border: 1px solid #98c0f4;
+ z-index: 20;
+}
+
+.ext-border-box .x-layout-collapsed {
+ width: 22px;
+ height: 22px;
+}
+
+.x-layout-collapsed-over {
+ cursor: pointer;
+ background-color: #d9e8fb;
+}
+
+.x-layout-collapsed-west .x-layout-collapsed-tools,.x-layout-collapsed-east .x-layout-collapsed-tools {
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 20px;
+ height: 20px;
+}
+
+.x-panel-toolbar {
+ float: right;
+}
+
+.x-cursor-row-resize {
+ cursor: n-resize;
+ cursor: row-resize;
+}
+
+.x-date-picker,.x-date-picker a {
+ font-size: 11px;
+}
+
+.x-date-days {
+ table-layout: fixed;
+ width: 100%;
+}
+
+.x-date-days td {
+ width: 25px;
+ border: none;
+}
+
+.x-date-days td span {
+ display: block;
+ padding: 2px 7px 2px 2px;
+}
+
+.x-date-days td {
+ background: #DFECFB url(../images/default/shared/glass-bg.gif) repeat-x scroll left top;
+ border-bottom: 1px solid #A3BAD9;
+ border-collapse: separate;
+ color: #233D6D;
+ cursor: default;
+ font-family: arial, helvetica, tahoma, sans-serif;
+ font-size: 10px;
+ font-size-adjust: none;
+ font-stretch: normal;
+ font-style: normal;
+ font-variant: normal;
+ font-weight: normal;
+ line-height: normal;
+ padding: 0pt;
+ text-align: right !important;
+}
+
+.x-date-picker .x-date-header {
+ background: url(../images/default/shared/hd-sprite.gif) repeat-x 0 -83px;
+ height: 22px;
+ left: 10px;
+ top: 10px;
+ width: 157px;
+}
+
+.x-date-header .x-btn .x-btn-text {
+ color: #fff;
+}
+
+.x-date-picker-footer {
+ width: 100%;
+}
+
+.x-date-picker-footer td {
+ text-align: center;
+}
+
+.x-date-left {
+ background: transparent url(../images/default/shared/hd-sprite.gif) repeat-x scroll 0pt -83px;
+ color: #FFFFFF;
+ font-family: "sans serif", tahoma, verdana, helvetica;
+ font-size: 11px;
+ font-size-adjust: none;
+ font-stretch: normal;
+ font-style: normal;
+ font-variant: normal;
+ font-weight: bold;
+ line-height: normal;
+ overflow: hidden;
+}
+
+.x-modal {
+ position: absolute;
+ z-index: 10;
+ background-color: black;
+ filter: alpha(opacity = 10);
+ opacity: .1;
+ left: 0px;
+ top: 0px;
+}
+
+.x-progress {
+ font-family: tahoma, arial, helvetica, sans-serif;
+}
+
+.x-float-right {
+ float: right;
+}
+
+.x-layout-popup {
+ background-color: #DFE8F6;
+ border: 1px solid #7CA4D9;
+}
+
+.x-layout-collapsed .x-panel-header .x-tool {
+ margin: 0 0 0 -4px;
+ padding: 0px;
+}
+
+.ext-border-box .x-layout-collapsed {
+ width: 22px;
+ height: 22px;
+}
+
+.x-layout-collapsed-over {
+ cursor: pointer;
+ background-color: #d9e8fb;
+}
+
+.x-layout-collapsed-west .x-layout-collapsed-tools,.x-layout-collapsed-east .x-layout-collapsed-tools {
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 20px;
+ height: 20px;
+}
+
+.x-panel-toolbar {
+ float: right;
+}
+
+.x-cursor-col-resize {
+ cursor: e-resize;
+ cursor: col-resize;
+}
+
+.x-cursor-row-resize {
+ cursor: n-resize;
+ cursor: row-resize;
+}
+
+.x-drag-proxy {
+ border: 1px dashed #3b5a82;
+ background-color: #EDEDED;
+ filter: alpha(opacity = 50);
+ opacity: .5;
+ background-color: #c3daf9;
+ z-index: 20000;
+ overflow: hidden;
+ position: absolute;
+ left: 0;;
+ top: 0;
+ cursor: move;
+}.x-tab-panel {
+ overflow: hidden;
+ -moz-outline: none;
+ outline: 0 none;
+}
+
+.x-tab-panel-header,.x-tab-panel-footer {
+ border: 1px solid;
+ overflow: hidden;
+ zoom: 1;
+}
+
+.x-tab-panel-header {
+ border: 1px solid;
+ padding-bottom: 2px;
+}
+
+.x-tab-panel-footer {
+ border: 1px solid;
+ padding-top: 2px;
+}
+
+.x-tab-strip-wrap {
+ width: 100%;
+ overflow: hidden;
+ position: relative;
+ zoom: 1;
+}
+
+ul.x-tab-strip {
+ display: block;
+ width: 7000px;
+ zoom: 1;
+}
+
+ul.x-tab-strip-top {
+ padding-top: 1px;
+ background: repeat-x bottom;
+ border-bottom: 1px solid;
+}
+
+ul.x-tab-strip-bottom {
+ padding-bottom: 1px;
+ background: repeat-x top;
+ border-top: 1px solid;
+ border-bottom: 0 none;
+}
+
+.x-tab-panel-header-plain .x-tab-strip-top {
+ background: transparent !important;
+ padding-top: 0 !important;
+}
+
+.x-tab-panel-header-plain {
+ background: transparent !important;
+ border-width: 0 !important;
+ padding-bottom: 0 !important;
+}
+
+.x-tab-panel-header-plain .x-tab-strip-spacer,.x-tab-panel-footer-plain .x-tab-strip-spacer
+ {
+ border: 1px solid;
+ height: 2px;
+ font-size: 1px;
+ line-height: 1px;
+}
+
+.x-tab-panel-header-plain .x-tab-strip-spacer {
+ border-top: 0 none;
+}
+
+.x-tab-panel-footer-plain .x-tab-strip-spacer {
+ border-bottom: 0 none;
+}
+
+.x-tab-panel-footer-plain .x-tab-strip-bottom {
+ background: transparent !important;
+ padding-bottom: 0 !important;
+}
+
+.x-tab-panel-footer-plain {
+ background: transparent !important;
+ border-width: 0 !important;
+ padding-top: 0 !important;
+}
+
+.ext-border-box .x-tab-panel-header-plain .x-tab-strip-spacer,.ext-border-box .x-tab-panel-footer-plain .x-tab-strip-spacer
+ {
+ height: 3px;
+}
+
+ul.x-tab-strip li {
+ float: left;
+ position: relative;
+ margin-left: 2px;
+}
+
+ul.x-tab-strip li.x-tab-edge {
+ float: left;
+ margin: 0 !important;
+ padding: 0 !important;
+ border: 0 none !important;
+ font-size: 1px !important;
+ line-height: 1px !important;
+ overflow: hidden;
+ zoom: 1;
+ background: transparent !important;
+ width: 1px;
+}
+
+.x-tab-strip a,.x-tab-strip span,.x-tab-strip em {
+ display: block;
+}
+
+.x-tab-strip a {
+ text-decoration: none !important;
+ -moz-outline: none;
+ outline: none;
+ cursor: pointer;
+}
+
+.x-tab-strip-inner {
+ overflow: hidden;
+ text-overflow: ellipsis;
+}
+
+.x-tab-strip span.x-tab-strip-text {
+ white-space: nowrap;
+ cursor: pointer;
+ padding: 4px 0;
+}
+
+.x-tab-strip-top .x-tab-with-icon .x-tab-right {
+ padding-left: 6px;
+}
+
+.x-tab-strip .x-tab-with-icon span.x-tab-strip-text {
+ padding-left: 20px;
+ background-position: 0 3px;
+ background-repeat: no-repeat;
+}
+
+.x-tab-strip-active,.x-tab-strip-active a.x-tab-right {
+ cursor: default;
+}
+
+.x-tab-strip-active span.x-tab-strip-text {
+ cursor: default;
+}
+
+.x-tab-strip-disabled .x-tabs-text {
+ cursor: default;
+}
+
+.x-tab-panel-body {
+ overflow: hidden;
+}
+
+.x-tab-panel-bwrap {
+ overflow: hidden;
+}
+
+.ext-ie .x-tab-strip .x-tab-right {
+ position: relative;
+}
+
+.x-tab-strip-top .x-tab-strip-active .x-tab-right {
+ margin-bottom: -1px;
+}
+
+.x-tab-strip-top .x-tab-strip-active .x-tab-right span.x-tab-strip-text
+ {
+ padding-bottom: 5px;
+}
+
+.x-tab-strip-bottom .x-tab-strip-active .x-tab-right {
+ margin-top: -1px;
+}
+
+.x-tab-strip-bottom .x-tab-strip-active .x-tab-right span.x-tab-strip-text
+ {
+ padding-top: 5px;
+}
+
+.x-tab-strip-top .x-tab-right {
+ background: transparent no-repeat 0 -51px;
+ padding-left: 10px;
+}
+
+.x-tab-strip-top .x-tab-left {
+ background: transparent no-repeat right -351px;
+ padding-right: 10px;
+}
+
+.x-tab-strip-top .x-tab-strip-inner {
+ background: transparent repeat-x 0 -201px;
+}
+
+.x-tab-strip-top .x-tab-strip-over .x-tab-right {
+ background-position: 0 -101px;
+}
+
+.x-tab-strip-top .x-tab-strip-over .x-tab-left {
+ background-position: right -401px;
+}
+
+.x-tab-strip-top .x-tab-strip-over .x-tab-strip-inner {
+ background-position: 0 -251px;
+}
+
+.x-tab-strip-top .x-tab-strip-active .x-tab-right {
+ background-position: 0 0;
+}
+
+.x-tab-strip-top .x-tab-strip-active .x-tab-left {
+ background-position: right -301px;
+}
+
+.x-tab-strip-top .x-tab-strip-active .x-tab-strip-inner {
+ background-position: 0 -151px;
+}
+
+.x-tab-strip-bottom .x-tab-right {
+ background: no-repeat bottom right;
+}
+
+.x-tab-strip-bottom .x-tab-left {
+ background: no-repeat bottom left;
+}
+
+.x-tab-strip-bottom .x-tab-strip-active .x-tab-right {
+ background: no-repeat bottom left;
+}
+
+.x-tab-strip-bottom .x-tab-strip-active .x-tab-left {
+ background: no-repeat bottom right;
+}
+
+.x-tab-strip-bottom .x-tab-left {
+ padding: 0 10px;
+}
+
+.x-tab-strip-bottom .x-tab-right {
+ padding: 0;
+}
+
+.x-tab-strip .x-tab-strip-close {
+ display: none;
+}
+
+.x-tab-strip-closable {
+ position: relative;
+}
+
+.x-tab-strip-closable .x-tab-left {
+ padding-right: 19px;
+}
+
+.x-tab-strip .x-tab-strip-closable a.x-tab-strip-close {
+ opacity: .6;
+ -moz-opacity: .6;
+ background-repeat: no-repeat;
+ display: block;
+ width: 11px;
+ height: 11px;
+ position: absolute;
+ top: 3px;
+ right: 3px;
+ cursor: pointer;
+ z-index: 2;
+}
+
+.x-tab-strip .x-tab-strip-active a.x-tab-strip-close {
+ opacity: .8;
+ -moz-opacity: .8;
+}
+
+.x-tab-strip .x-tab-strip-closable a.x-tab-strip-close:hover {
+ opacity: 1;
+ -moz-opacity: 1;
+}
+
+.x-tab-panel-body {
+ border: 1px solid;
+}
+
+.x-tab-panel-body-top {
+ border-top: 0 none;
+}
+
+.x-tab-panel-body-bottom {
+ border-bottom: 0 none;
+}
+
+.x-tab-scroller-left {
+ background: transparent no-repeat -18px 0;
+ border-bottom: 1px solid;
+ width: 18px;
+ position: absolute;
+ left: 0;
+ top: 0;
+ z-index: 10;
+ cursor: pointer;
+}
+
+.x-tab-scroller-left-over {
+ background-position: 0 0;
+}
+
+.x-tab-scroller-left-disabled {
+ background-position: -18px 0;
+ opacity: .5;
+ -moz-opacity: .5;
+ filter: alpha(opacity = 50);
+ cursor: default;
+}
+
+.x-tab-scroller-right {
+ background: transparent no-repeat 0 0;
+ border-bottom: 1px solid;
+ width: 18px;
+ position: absolute;
+ right: 0;
+ top: 0;
+ z-index: 10;
+ cursor: pointer;
+}
+
+.x-tab-scroller-right-over {
+ background-position: -18px 0;
+}
+
+.x-tab-scroller-right-disabled {
+ background-position: 0 0;
+ opacity: .5;
+ -moz-opacity: .5;
+ filter: alpha(opacity = 50);
+ cursor: default;
+}
+
+.x-tab-scrolling-bottom .x-tab-scroller-left,.x-tab-scrolling-bottom .x-tab-scroller-right
+ {
+ margin-top: 1px;
+}
+
+.x-tab-scrolling .x-tab-strip-wrap {
+ margin-left: 18px;
+ margin-right: 18px;
+}
+
+.x-tab-scrolling {
+ position: relative;
+}
+
+.x-tab-panel-bbar .x-toolbar {
+ border: 1px solid;
+ border-top: 0 none;
+ overflow: hidden;
+ padding: 2px;
+}
+
+.x-tab-panel-tbar .x-toolbar {
+ border: 1px solid;
+ border-top: 0 none;
+ overflow: hidden;
+ padding: 2px;
+}
+
+.x-tab-strip li .x-tab-image {
+ position: absolute;
+ top: 3px;
+ left: 5px;
+}
+
+.ext-ie8 .x-tab-strip li .x-tab-image,.ext-ie8-compatibility .x-tab-strip li .x-tab-image {
+ top: 4px;
+ left: 6px;
+}
+
+.ext-ie8 .x-tab-strip-top .x-tab-right,.ext-ie8-compatibility .x-tab-strip-top .x-tab-right
+ {
+ top: 1px;
+}
+
+.ext-strict .ext-ie8 .x-tab-strip-top .x-tab-right,.ext-ie8 .x-tab-panel-header-plain .x-tab-strip-top .x-tab-right,.ext-ie8-compatibility .x-tab-panel-header-plain .x-tab-strip-top .x-tab-right
+ {
+ top: 0;
+}
+.ext-strict .ext-ie7 .x-panel-body {
+ position: relative !important;
+}
+
+.x-form-field {
+ margin: 0;
+}
+
+.foo {
+ padding: 1px;
+}
+
+.foo {
+ margin: 4px;
+}
+
+.x-form-text,textarea.x-form-field {
+ padding: 1px 3px;
+ background: repeat-x 0 0;
+ border: 1px solid;
+}
+
+.ext-gecko textarea.x-form-field {
+ padding: 0;
+}
+
+.x-form-text,.ext-ie .x-form-file {
+ height: 22px;
+ line-height: 18px;
+ vertical-align: middle;
+}
+
+.ext-ie6 .x-form-text,.ext-ie7 .x-form-text {
+ margin: -1px 0;
+ height: 22px; /* ie quirks */
+ line-height: 18px;
+}
+
+.ext-ie8-compatibility .x-form-text {
+ margin: 0;
+}
+
+.ext-ie textarea.x-form-field {
+ margin: -1px 0; /* ie bogus margin bug */
+}
+
+.ext-strict .ext-ie8 textarea.x-form-field,.ext-strict .ext-ie8-compatibility textarea.x-form-field {
+ margin: 0;
+}
+
+.x-form-field-wrap .x-form-text {
+ position: relative;
+}
+
+.ext-strict .x-form-text {
+ height: 18px;
+}
+
+.ext-safari.ext-mac textarea.x-form-field {
+ margin-bottom: -2px;
+}
+
+.ext-gecko .x-form-text,.ext-ie8 .x-form-text {
+ padding-top: 2px;
+ padding-bottom: 0;
+}
+
+textarea {
+ resize: none;
+}
+
+.x-form-select-one {
+ height: 20px;
+ line-height: 18px;
+ vertical-align: middle;
+ border: 1px solid;
+}
+
+.x-form-check-wrap {
+ line-height: 18px;
+ height: 22px;
+ white-space: nowrap;
+}
+
+.x-editor .x-form-check-wrap {
+ border: 1px solid;
+ padding: 2px;
+ height: 14px;
+}
+
+.x-editor .x-form-checkbox {
+ height: 13px;
+}
+
+.x-form-check-group-label {
+ border-bottom: 1px solid;
+ margin-bottom: 5px;
+ padding-left: 3px !important;
+ float: none !important;
+}
+
+.x-form-field-wrap .x-form-trigger {
+ width: 17px;
+ height: 21px;
+ border: 0;
+ background: transparent no-repeat 0 0;
+ cursor: pointer;
+ border-bottom: 1px solid;
+ position: absolute;
+ top: 0;
+}
+
+.ext-safari .x-form-field-wrap .x-form-trigger {
+ height: 21px;
+}
+
+.ext-strict .ext-safari .x-form-field-wrap .x-form-trigger {
+ height: 23px;
+}
+
+.ext-strict .ext-safari .x-small-editor .x-form-field-wrap .x-form-trigger {
+ height: 19px;
+}
+
+.ext-strict .ext-ie8 .x-small-editor .x-form-field-wrap .x-form-trigger {
+ height: 20px !important;
+}
+
+.ext-strict .ext-gecko .x-small-editor .x-form-field-wrap .x-form-trigger {
+ height: 21px !important;
+}
+
+.x-form-field-wrap .x-form-date-trigger,.x-form-field-wrap .x-form-clear-trigger,.x-form-field-wrap .x-form-search-trigger
+ {
+ cursor: pointer;
+}
+
+.ext-safari .x-form-field-wrap .x-form-trigger,.ext-gecko .x-form-field-wrap .x-form-trigger {
+ right: 0;
+}
+
+.x-form-field-wrap .x-form-twin-triggers .x-form-trigger {
+ position: static;
+ top: auto;
+ vertical-align: top;
+}
+
+.x-form-field-wrap {
+ position: relative;
+ left: 0;
+ top: 0;
+ zoom: 1;
+ white-space: nowrap;
+ text-align: left;
+}
+
+.x-form-field-wrap .x-form-trigger-over {
+ background-position: -17px 0;
+}
+
+.x-form-field-wrap .x-form-trigger-click {
+ background-position: -34px 0;
+}
+
+.x-trigger-wrap-focus .x-form-trigger {
+ background-position: -51px 0;
+}
+
+.x-trigger-wrap-focus .x-form-trigger-over {
+ background-position: -68px 0;
+}
+
+.x-trigger-wrap-focus .x-form-trigger-click {
+ background-position: -85px 0;
+}
+
+.x-trigger-wrap-focus .x-form-trigger {
+ border-bottom: 1px solid;
+}
+
+.x-item-disabled .x-form-trigger-over {
+ background-position: 0 0 !important;
+ border-bottom: 1px solid;
+}
+
+.x-item-disabled .x-form-trigger-click {
+ background-position: 0 0 !important;
+ border-bottom: 1px solid;
+}
+
+.x-form-focus,textarea.x-form-focus {
+ border: 1px solid;
+}
+
+.x-form-invalid,textarea.x-form-invalid {
+ background: repeat-x bottom;
+ border: 1px solid;
+}
+
+.ext-safari .x-form-invalid {
+ border: 1px solid;
+}
+
+.x-form-inner-invalid,textarea.x-form-inner-invalid {
+ background: repeat-x bottom;
+}
+
+.x-editor {
+ padding: 0;
+ margin: 0;
+}
+
+.x-form-grow-sizer {
+ left: -10000px;
+ padding: 8px 3px;
+ position: absolute;
+ visibility: hidden;
+ top: -10000px;
+ white-space: pre-wrap;
+ white-space: -moz-pre-wrap;
+ white-space: -pre-wrap;
+ white-space: -o-pre-wrap;
+ word-wrap: break-word;
+ zoom: 1;
+}
+
+.x-form-grow-sizer p {
+ margin: 0 !important;
+ border: 0 none !important;
+ padding: 0 !important;
+}
+
+.x-form-item {
+ display: block;
+ margin-bottom: 4px;
+}
+
+.x-form-item .x-form-item-label {
+ display: block;
+ float: left;
+ width: 100px;
+ padding: 3px;
+ padding-left: 0;
+ clear: left;
+ z-index: 2;
+ position: relative;
+}
+
+.x-form-element {
+ padding-left: 105px;
+ position: relative;
+}
+
+.x-form-invalid-msg {
+ padding: 2px;
+ padding-left: 18px;
+ background: transparent no-repeat 0 2px;
+ line-height: 16px;
+ width: 200px;
+}
+
+.x-form-label-left .x-form-item-label {
+ text-align: left;
+}
+
+.x-form-label-right .x-form-item-label {
+ text-align: right;
+}
+
+.x-form-label-top .x-form-item .x-form-item-label {
+ width: auto;
+ float: none;
+ clear: none;
+ display: inline;
+ margin-bottom: 4px;
+ position: static;
+}
+
+.x-form-label-top .x-form-element {
+ padding-left: 0;
+ padding-top: 4px;
+}
+
+.x-form-label-top .x-form-item {
+ padding-bottom: 4px;
+}
+
+.x-small-editor .x-form-text {
+ height: 20px;
+ line-height: 16px;
+ vertical-align: middle;
+}
+
+.ext-ie6 .x-small-editor .x-form-text,.ext-ie7 .x-small-editor .x-form-text {
+ height: 20px !important;
+ line-height: 16px !important;
+}
+
+.ext-strict .x-small-editor .x-form-text {
+ height: 16px !important;
+}
+
+.ext-strict .ext-ie8 .x-small-editor .x-form-text {
+ height: 17px !important;
+}
+
+.ext-strict .ext-webkit .x-small-editor .x-form-text {
+ height: 18px !important;
+ padding: 0px 3px;
+}
+
+.ext-strict .ext-gecko .x-small-editor .x-form-text {
+ height: 18px !important;
+}
+
+.ext-strict .ext-gecko .x-edit-grid .x-small-editor .x-form-text {
+ height:17px !important;
+}
+
+.ext-border-box .x-small-editor .x-form-text {
+ height: 20px;
+}
+
+.x-small-editor .x-form-select-one {
+ height: 20px;
+ line-height: 16px;
+ vertical-align: middle;
+}
+
+.x-small-editor .x-form-num-field {
+ text-align: right;
+}
+
+.x-small-editor .x-form-field-wrap .x-form-trigger {
+ height: 19px;
+}
+
+.x-form-clear {
+ clear: both;
+ overflow: hidden;
+ line-height: 0;
+ font-size: 0;
+ height: 0;
+}
+
+.x-form-clear-left {
+ clear: left;
+ overflow: hidden;
+ line-height: 0;
+ font-size: 0;
+ height: 0;
+}
+
+.x-form-cb-label {
+ width: auto !important;
+ float: none !important;
+ clear: none !important;
+ display: inline !important;
+ margin-left: 4px;
+}
+
+.x-form-column {
+ float: left;
+ padding: 0;
+ margin: 0;
+ width: 48%;
+ overflow: hidden;
+ zoom: 1;
+}
+
+.x-form .x-form-btns-ct .x-btn {
+ float: right;
+ clear: none;
+}
+
+.x-form .x-form-btns-ct .x-form-btns td {
+ border: 0;
+ padding: 0;
+}
+
+.x-form .x-form-btns-ct .x-form-btns-right table {
+ float: right;
+ clear: none;
+}
+
+.x-form .x-form-btns-ct .x-form-btns-left table {
+ float: left;
+ clear: none;
+}
+
+.x-form .x-form-btns-ct .x-form-btns-center {
+ text-align: center;
+}
+
+.x-form .x-form-btns-ct .x-form-btns-center table {
+ margin: 0 auto;
+}
+
+.x-form .x-form-btns-ct table td.x-form-btn-td {
+ padding: 3px;
+}
+
+.x-form .x-form-btns-ct .x-btn-focus .x-btn-left {
+ background-position: 0 -147px;
+}
+
+.x-form .x-form-btns-ct .x-btn-focus .x-btn-right {
+ background-position: 0 -168px;
+}
+
+.x-form .x-form-btns-ct .x-btn-focus .x-btn-center {
+ background-position: 0 -189px;
+}
+
+.x-form .x-form-btns-ct .x-btn-click .x-btn-center {
+ background-position: 0 -126px;
+}
+
+.x-form .x-form-btns-ct .x-btn-click .x-btn-right {
+ background-position: 0 -84px;
+}
+
+.x-form .x-form-btns-ct .x-btn-click .x-btn-left {
+ background-position: 0 -63px;
+}
+
+.x-form-invalid-icon {
+ width: 16px;
+ height: 18px;
+ position: absolute;
+ left: 0;
+ top: 0;
+ display: block;
+ background: transparent no-repeat 0 2px;
+}
+
+.x-fieldset {
+ border: 1px solid;
+ padding: 10px;
+ margin-bottom: 10px;
+ display: block;
+}
+
+.ext-ie .x-fieldset legend {
+ margin-bottom: 10px;
+}
+
+.ext-ie .x-fieldset {
+ padding-top: 0;
+ padding-bottom: 10px;
+}
+
+.x-fieldset legend .x-tool-toggle {
+ margin-right: 3px;
+ margin-left: 0;
+ float: left !important;
+}
+
+.x-fieldset legend input {
+ margin-right: 3px;
+ float: left !important;
+ height: 13px;
+ width: 13px;
+}
+
+fieldset.x-panel-collapsed {
+ padding-bottom: 0 !important;
+ border-width: 1px 1px 0 1px !important;
+ border-left-color: transparent;
+ border-right-color: transparent;
+}
+
+.ext-ie6 fieldset.x-panel-collapsed {
+ padding-bottom: 0 !important;
+ border-width: 1px 0 0 0 !important;
+ margin-left: 1px;
+ margin-right: 1px;
+}
+
+fieldset.x-panel-collapsed .x-fieldset-bwrap {
+ visibility: hidden;
+ position: absolute;
+ left: -1000px;
+ top: -1000px;
+}
+
+.ext-ie .x-fieldset-bwrap {
+ zoom: 1;
+}
+
+.x-fieldset-noborder {
+ border: 0px none transparent;
+}
+
+.x-fieldset-noborder legend {
+ margin-left: -3px;
+}
+
+.ext-ie .x-fieldset-noborder legend {
+ position: relative;
+ margin-bottom: 23px;
+}
+
+.ext-ie .x-fieldset-noborder legend span {
+ position: absolute;
+ left: 16px;
+}
+
+.ext-gecko .x-form-item {
+ -moz-outline: none;
+ outline: 0 none;
+}
+
+.x-hide-label label.x-form-item-label {
+ display: none !important;
+}
+
+.x-hide-label .x-form-element {
+ padding-left: 0 !important;
+}
+
+.x-fieldset {
+ overflow: hidden;
+}
+
+/* make top of checkbox/tools visible in webkit */
+.ext-webkit .x-fieldset-header {
+ padding-top: 1px;
+}
+
+.x-fieldset-bwrap {
+ overflow: hidden;
+ zoom: 1;
+}
+
+.x-fieldset-body {
+ overflow: hidden;
+}
+
+.x-combo-list .x-combo-selected {
+ border-color: #a3bae9 !important;
+}
+
+.x-combo-list {
+ background-color: white !important;
+}
+
+.ext-gecko .x-form-file {
+ height: inherit !important;
+}
+
+.x-form-check {
+ background: none !important
+}
+
+.x-form-radio {
+ background: none !important
+}
+
+.x-form-label {
+ padding: 2px 3px 3px 0px;
+ font-size: 12px;
+}
+
+.x-form-label-top .x-form-item {
+ padding-bottom: 0px;
+ margin-bottom: 2px;
+}
+
+.ext-safari .x-form-text {
+ height: 22px; /* safari always same size */
+ padding: 0 3px;
+ /* remove extra top/bottom padding */
+}
+
+.ext-safari .x-small-editor .x-form-text {
+ height: 20px;
+}
+
+.x-form-group-label,.x-form-cb-label {
+ font: normal 12px tahoma, arial, helvetica, sans-serif;
+ padding-right: 10px;
+}
+
+.x-form-list {
+ background: #FFFFFF url(../images/default/form/text-bg.gif) repeat-x scroll 0 0;
+ border: 1px solid #B5B8C8;
+}
+
+/*
+ * FileUploadField component styles
+ */
+.x-form-file-wrap {
+ height: 22px;
+}
+
+.x-form-file-wrap .x-form-file {
+ position: absolute;
+ right: 0;
+ -moz-opacity: 0;
+ filter: alpha(opacity : 0);
+ opacity: 0;
+ z-index: 2;
+ height: 22px;
+ top: 0;
+}
+
+.x-form-file-wrap .x-form-file-btn {
+ position: absolute;
+ right: 0;
+ z-index: 1;
+ top: 0;
+}
+
+.x-form-file-wrap .x-form-file-text {
+ z-index: 3;
+ color: #777;
+}
+
+.x-form-invalid-icon {
+ background-position: 0 0 !important;
+}
+
+.x-triggerfield-noedit {
+ cursor: pointer;
+}
+
+.ext-webkit .x-form-checkbox:focus {
+ outline: auto !important;
+}
+
+.x-spinner-field .x-form-twin-triggers .x-form-spinner-up, .x-spinner-field .x-form-twin-triggers .x-form-spinner-down {
+ height: 10px;
+ position: absolute;
+}
+
+.ext-strict .ext-safari .x-form-field-wrap .x-form-spinner-up {
+ height: 10px;
+}
+
+.ext-strict .ext-safari .x-form-field-wrap .x-form-spinner-down {
+ height: 12px;
+}
+
+.x-spinner-field .x-form-twin-triggers .x-form-spinner-up {
+ top:0px;
+}
+
+.x-spinner-field .x-form-twin-triggers .x-form-spinner-down {
+ top:11px;
+}
+
+.x-spinner-field .x-form-twin-triggers {
+ width: 17px;
+}
+
+.x-spinner-field .x-form-spinner-down {
+ background-position:0 -12px;
+}
+
+.x-trigger-wrap-focus .x-form-spinner-up {
+ background-position:-85px 0;
+}
+
+.x-trigger-wrap-focus .x-form-spinner-down {
+ background-position:-85px -12px;
+}
+
+.x-form-field-wrap .x-form-spinner-overup{
+ background-position:-17px 0;
+}
+.x-form-field-wrap .x-form-spinner-clickup{
+ background-position:-34px 0;
+}
+
+.x-trigger-wrap-focus .x-form-spinner-overup{
+ background-position:-102px 0;
+}
+
+.x-trigger-wrap-focus .x-form-spinner-clickup{
+ background-position:-119px 0;
+}
+
+.x-form-field-wrap .x-form-spinner-overdown{
+ background-position:-51px -12px;
+}
+.x-form-field-wrap .x-form-spinner-clickdown{
+ background-position:-68px -12px;
+}
+.x-trigger-wrap-focus .x-form-spinner-overdown{
+ background-position:-136px -12px;
+}
+.x-trigger-wrap-focus .x-form-spinner-clickdown{
+ background-position:-153px -12px;
+}.x-btn{
+ cursor:pointer;
+ white-space: nowrap;
+}
+.x-btn button{
+ border:0 none;
+ background:transparent;
+ padding-left:3px;
+ padding-right:3px;
+ cursor:pointer;
+ margin:0;
+ overflow:hidden;
+ width:auto;
+ -moz-outline:0 none;
+ outline:0 none;
+}
+* html .ext-ie .x-btn button {
+ width:1px;
+}
+.ext-ie .x-item-disabled .x-btn-mc img {
+ filter: alpha(opacity=60);
+}
+.ext-gecko .x-btn button,.ext-webkit .x-btn button {
+ padding-left:0;
+ padding-right:0;
+}
+.ext-gecko .x-btn button::-moz-focus-inner {
+ padding:0;
+}
+.ext-ie .x-btn button {
+ padding-top:2px;
+}
+.x-btn td {
+ padding:0 !important;
+}
+.x-btn-text {
+ cursor:pointer;
+ white-space: nowrap;
+ padding:0;
+}
+.x-btn-noicon .x-btn-small .x-btn-text{
+ height: 16px;
+}
+.x-btn-noicon .x-btn-medium .x-btn-text{
+ height: 24px;
+}
+.x-btn-noicon .x-btn-large .x-btn-text{
+ height: 32px;
+}
+.x-btn-icon .x-btn-text{
+ background-position: center;
+ background-repeat: no-repeat;
+}
+.x-btn-icon .x-btn-small .x-btn-text{
+ height: 16px;
+ width: 16px;
+}
+.x-btn-icon .x-btn-medium .x-btn-text{
+ height: 24px;
+ width: 24px;
+}
+.x-btn-icon .x-btn-large .x-btn-text{
+ height: 32px;
+ width: 32px;
+}
+.x-btn-text-icon .x-btn-icon-small-left .x-btn-text{
+ background-position: 0 center;
+ background-repeat: no-repeat;
+ padding-left:18px;
+ height:16px;
+}
+.x-btn-text-icon .x-btn-icon-medium-left .x-btn-text{
+ background-position: 0 center;
+ background-repeat: no-repeat;
+ padding-left:26px;
+ height:24px;
+}
+.x-btn-text-icon .x-btn-icon-large-left .x-btn-text{
+ background-position: 0 center;
+ background-repeat: no-repeat;
+ padding-left:34px;
+ height:32px;
+}
+.x-btn-text-icon .x-btn-icon-small-top .x-btn-text{
+ background-position: center 0;
+ background-repeat: no-repeat;
+ padding-top:18px;
+}
+.x-btn-text-icon .x-btn-icon-medium-top .x-btn-text{
+ background-position: center 0;
+ background-repeat: no-repeat;
+ padding-top:26px;
+}
+.x-btn-text-icon .x-btn-icon-large-top .x-btn-text{
+ background-position: center 0;
+ background-repeat: no-repeat;
+ padding-top:34px;
+}
+.x-btn-text-icon .x-btn-icon-small-right .x-btn-text{
+ background-position: right center;
+ background-repeat: no-repeat;
+ padding-right:18px;
+ height:16px;
+}
+.x-btn-text-icon .x-btn-icon-medium-right .x-btn-text{
+ background-position: right center;
+ background-repeat: no-repeat;
+ padding-right:26px;
+ height:24px;
+}
+.x-btn-text-icon .x-btn-icon-large-right .x-btn-text{
+ background-position: right center;
+ background-repeat: no-repeat;
+ padding-right:34px;
+ height:32px;
+}
+.x-btn-text-icon .x-btn-icon-small-bottom .x-btn-text{
+ background-position: center bottom;
+ background-repeat: no-repeat;
+ padding-bottom:18px;
+}
+.x-btn-text-icon .x-btn-icon-medium-bottom .x-btn-text{
+ background-position: center bottom;
+ background-repeat: no-repeat;
+ padding-bottom:26px;
+}
+.x-btn-text-icon .x-btn-icon-large-bottom .x-btn-text{
+ background-position: center bottom;
+ background-repeat: no-repeat;
+ padding-bottom:34px;
+}
+.x-btn-tr i, .x-btn-tl i, .x-btn-mr i, .x-btn-ml i, .x-btn-br i, .x-btn-bl i{
+ font-size:1px;
+ line-height:1px;
+ width:3px;
+ display:block;
+ overflow:hidden;
+}
+.x-btn-tr i, .x-btn-tl i, .x-btn-br i, .x-btn-bl i{
+ height:3px;
+}
+.x-btn-tl{
+ width:3px;
+ height:3px;
+ background:no-repeat 0 0;
+}
+.x-btn-tr{
+ width:3px;
+ height:3px;
+ background:no-repeat -3px 0;
+}
+.x-btn-tc{
+ height:3px;
+ background:repeat-x 0 -6px;
+}
+.x-btn-ml{
+ width:3px;
+ background:no-repeat 0 -24px;
+}
+.x-btn-mr{
+ width:3px;
+ background:no-repeat -3px -24px;
+}
+.x-btn-mc{
+ background:repeat-x 0 -1096px;
+ vertical-align: middle;
+ text-align:center;
+ padding:0 5px;
+ cursor:pointer;
+ white-space:nowrap;
+}
+.x-btn-bl{
+ width:3px;
+ height:3px;
+ background:no-repeat 0 -3px;
+}
+.x-btn-br{
+ width:3px;
+ height:3px;
+ background:no-repeat -3px -3px;
+}
+.x-btn-bc{
+ height:3px;
+ background:repeat-x 0 -15px;
+}
+.x-btn-over .x-btn-tl{
+ background-position: -6px 0;
+}
+.x-btn-over .x-btn-tr{
+ background-position: -9px 0;
+}
+.x-btn-over .x-btn-tc{
+ background-position: 0 -9px;
+}
+.x-btn-over .x-btn-ml{
+ background-position: -6px -24px;
+}
+.x-btn-over .x-btn-mr{
+ background-position: -9px -24px;
+}
+.x-btn-over .x-btn-mc{
+ background-position: 0 -2168px;
+}
+.x-btn-over .x-btn-bl{
+ background-position: -6px -3px;
+}
+.x-btn-over .x-btn-br{
+ background-position: -9px -3px;
+}
+.x-btn-over .x-btn-bc{
+ background-position: 0 -18px;
+}
+.ext-webkit .x-btn-focus .x-btn-tl{
+ background-position: -6px 0;
+}
+.ext-webkit .x-btn-focus .x-btn-tr{
+ background-position: -9px 0;
+}
+.ext-webkit .x-btn-focus .x-btn-tc{
+ background-position: 0 -9px;
+}
+.ext-webkit .x-btn-focus .x-btn-ml{
+ background-position: -6px -24px;
+}
+.ext-webkit .x-btn-focus .x-btn-mr{
+ background-position: -9px -24px;
+}
+.ext-webkit .x-btn-focus .x-btn-mc{
+ background-position: 0 -2168px;
+}
+.ext-webkit .x-btn-focus .x-btn-bl{
+ background-position: -6px -3px;
+}
+.ext-webkit .x-btn-focus .x-btn-br{
+ background-position: -9px -3px;
+}
+.ext-webkit .x-btn-focus .x-btn-bc{
+ background-position: 0 -18px;
+}
+.x-btn-click .x-btn-tl, .x-btn-menu-active .x-btn-tl, .x-btn-pressed .x-btn-tl{
+ background-position: -12px 0 !important;
+}
+.x-btn-click .x-btn-tr, .x-btn-menu-active .x-btn-tr, .x-btn-pressed .x-btn-tr{
+ background-position: -15px 0 !important;
+}
+.x-btn-click .x-btn-tc, .x-btn-menu-active .x-btn-tc, .x-btn-pressed .x-btn-tc{
+ background-position: 0 -12px !important;
+}
+.x-btn-click .x-btn-ml, .x-btn-menu-active .x-btn-ml, .x-btn-pressed .x-btn-ml{
+ background-position: -12px -24px !important;
+}
+.x-btn-click .x-btn-mr, .x-btn-menu-active .x-btn-mr, .x-btn-pressed .x-btn-mr{
+ background-position: -15px -24px !important;
+}
+.x-btn-click .x-btn-mc, .x-btn-menu-active .x-btn-mc, .x-btn-pressed .x-btn-mc{
+ background-position: 0 -3240px !important;
+}
+.x-btn-click .x-btn-bl, .x-btn-menu-active .x-btn-bl, .x-btn-pressed .x-btn-bl{
+ background-position: -12px -3px !important;
+}
+.x-btn-click .x-btn-br, .x-btn-menu-active .x-btn-br, .x-btn-pressed .x-btn-br{
+ background-position: -15px -3px !important;
+}
+.x-btn-click .x-btn-bc, .x-btn-menu-active .x-btn-bc, .x-btn-pressed .x-btn-bc{
+ background-position: 0 -21px !important;
+}
+.x-btn-disabled *{
+ cursor:default !important;
+}
+.x-btn-mc em.x-btn-arrow {
+ display:block;
+ background:transparent no-repeat right center;
+ padding-right:10px;
+}
+.x-btn-mc em.x-btn-split {
+ display:block;
+ background:transparent no-repeat right center;
+ padding-right:14px;
+}
+.x-btn-mc em.x-btn-arrow-bottom {
+ display:block;
+ background:transparent no-repeat center bottom;
+ padding-bottom:14px;
+}
+.x-btn-mc em.x-btn-split-bottom {
+ display:block;
+ background:transparent no-repeat center bottom;
+ padding-bottom:14px;
+}
+.x-btn-as-arrow .x-btn-mc em {
+ display:block;
+ background:transparent;
+ padding-bottom:14px;
+}
+.x-btn-group {
+ padding:1px;
+}
+.x-btn-group-header {
+ padding:2px;
+ text-align:center;
+}
+.x-btn-group-tc {
+ background: transparent repeat-x 0 0;
+ overflow:hidden;
+}
+.x-btn-group-tl {
+ background: transparent no-repeat 0 0;
+ padding-left:3px;
+ zoom:1;
+}
+.x-btn-group-tr {
+ background: transparent no-repeat right 0;
+ zoom:1;
+ padding-right:3px;
+}
+.x-btn-group-bc {
+ background: transparent repeat-x 0 bottom;
+ zoom:1;
+}
+.x-btn-group-bc .x-panel-footer {
+ zoom:1;
+}
+.x-btn-group-bl {
+ background: transparent no-repeat 0 bottom;
+ padding-left:3px;
+ zoom:1;
+}
+.x-btn-group-br {
+ background: transparent no-repeat right bottom;
+ padding-right:3px;
+ zoom:1;
+}
+.x-btn-group-mc {
+ border:0 none;
+ padding:1px 0 0 0;
+ margin:0;
+}
+.x-btn-group-mc .x-btn-group-body {
+ background:transparent;
+ border: 0 none;
+}
+.x-btn-group-ml {
+ background: transparent repeat-y 0 0;
+ padding-left:3px;
+ zoom:1;
+}
+.x-btn-group-mr {
+ background: transparent repeat-y right 0;
+ padding-right:3px;
+ zoom:1;
+}
+.x-btn-group-bc .x-btn-group-footer {
+ padding-bottom:6px;
+}
+.x-panel-nofooter .x-btn-group-bc {
+ height:3px;
+ font-size:0;
+ line-height:0;
+}
+.x-btn-group-bwrap {
+ overflow:hidden;
+ zoom:1;
+}
+.x-btn-group-body {
+ overflow:hidden;
+ zoom:1;
+}
+.x-btn-group-notitle .x-btn-group-tc {
+ background: transparent repeat-x 0 0;
+ overflow:hidden;
+ height:2px;
+}
+.x-toolbar{
+ border-style:solid;
+ border-width:0 0 1px 0;
+ display: block;
+ padding:2px;
+ background:repeat-x top left;
+ position:relative;
+ left:0;
+ top:0;
+ zoom:1;
+ overflow:hidden;
+}
+.x-toolbar .x-item-disabled .x-btn-icon {
+ opacity: .35;
+ -moz-opacity: .35;
+ filter: alpha(opacity=35);
+}
+.x-toolbar td {
+ vertical-align:middle;
+}
+.x-toolbar td,.x-toolbar span,.x-toolbar input,.x-toolbar div,.x-toolbar select,.x-toolbar label{
+ white-space: nowrap;
+}
+.x-toolbar .x-item-disabled {
+ cursor:default;
+ opacity:.6;
+ -moz-opacity:.6;
+ filter:alpha(opacity=60);
+}
+
+.x-toolbar .x-item-disabled *{
+ cursor:default;
+}
+
+.x-toolbar .x-toolbar-cell {
+ vertical-align:middle;
+}
+.x-toolbar .x-btn-tl, .x-toolbar .x-btn-tr, .x-toolbar .x-btn-tc, .x-toolbar .x-btn-ml, .x-toolbar .x-btn-mr,
+.x-toolbar .x-btn-mc, .x-toolbar .x-btn-bl, .x-toolbar .x-btn-br, .x-toolbar .x-btn-bc
+{
+ background-position: 500px 500px;
+}
+.x-toolbar .x-btn-over .x-btn-tl{
+ background-position: -6px 0;
+}
+.x-toolbar .x-btn-over .x-btn-tr{
+ background-position: -9px 0;
+}
+.x-toolbar .x-btn-over .x-btn-tc{
+ background-position: 0 -9px;
+}
+.x-toolbar .x-btn-over .x-btn-ml{
+ background-position: -6px -24px;
+}
+.x-toolbar .x-btn-over .x-btn-mr{
+ background-position: -9px -24px;
+}
+.x-toolbar .x-btn-over .x-btn-mc{
+ background-position: 0 -2168px;
+}
+.x-toolbar .x-btn-over .x-btn-bl{
+ background-position: -6px -3px;
+}
+.x-toolbar .x-btn-over .x-btn-br{
+ background-position: -9px -3px;
+}
+.x-toolbar .x-btn-over .x-btn-bc{
+ background-position: 0 -18px;
+}
+.x-toolbar .x-btn-click .x-btn-tl, .x-toolbar .x-btn-menu-active .x-btn-tl, .x-toolbar .x-btn-pressed .x-btn-tl{
+ background-position: -12px 0;
+}
+.x-toolbar .x-btn-click .x-btn-tr, .x-toolbar .x-btn-menu-active .x-btn-tr, .x-toolbar .x-btn-pressed .x-btn-tr{
+ background-position: -15px 0;
+}
+.x-toolbar .x-btn-click .x-btn-tc, .x-toolbar .x-btn-menu-active .x-btn-tc, .x-toolbar .x-btn-pressed .x-btn-tc{
+ background-position: 0 -12px;
+}
+.x-toolbar .x-btn-click .x-btn-ml, .x-toolbar .x-btn-menu-active .x-btn-ml, .x-toolbar .x-btn-pressed .x-btn-ml{
+ background-position: -12px -24px;
+}
+.x-toolbar .x-btn-click .x-btn-mr, .x-toolbar .x-btn-menu-active .x-btn-mr, .x-toolbar .x-btn-pressed .x-btn-mr{
+ background-position: -15px -24px;
+}
+.x-toolbar .x-btn-click .x-btn-mc, .x-toolbar .x-btn-menu-active .x-btn-mc, .x-toolbar .x-btn-pressed .x-btn-mc{
+ background-position: 0 -3240px;
+}
+.x-toolbar .x-btn-click .x-btn-bl, .x-toolbar .x-btn-menu-active .x-btn-bl, .x-toolbar .x-btn-pressed .x-btn-bl{
+ background-position: -12px -3px;
+}
+.x-toolbar .x-btn-click .x-btn-br, .x-toolbar .x-btn-menu-active .x-btn-br, .x-toolbar .x-btn-pressed .x-btn-br{
+ background-position: -15px -3px;
+}
+.x-toolbar .x-btn-click .x-btn-bc, .x-toolbar .x-btn-menu-active .x-btn-bc, .x-toolbar .x-btn-pressed .x-btn-bc{
+ background-position: 0 -21px;
+}
+.x-toolbar div.xtb-text{
+ padding:2px 2px 0;
+ line-height:16px;
+ display:block;
+}
+.x-toolbar .xtb-sep {
+ background-position: center;
+ background-repeat: no-repeat;
+ display: block;
+ font-size: 1px;
+ height: 16px;
+ width:4px;
+ overflow: hidden;
+ cursor:default;
+ margin: 0 2px 0;
+ border:0;
+}
+.x-toolbar .xtb-spacer {
+ width:2px;
+}
+.x-tbar-page-number{
+ width:24px;
+ height:14px;
+}
+.x-paging-info {
+ position:absolute;
+ top:5px;
+ right: 8px;
+}
+.x-toolbar-ct {
+ width:100%;
+}
+.x-panel-tbar, .x-panel-bbar, .x-window-tbar, .x-window-bbar, .x-tab-panel-tbar, .x-tab-panel-bbar, .x-plain-tbar, .x-plain-bbar {
+ overflow:hidden;
+ zoom:1;
+}
+.x-toolbar-more .x-btn-small .x-btn-text{
+ height: 16px;
+ width: 12px;
+}
+.x-toolbar-more em.x-btn-arrow {
+ display:inline;
+ background:transparent;
+ padding-right:0;
+}
+.x-toolbar-more .x-btn-mc em.x-btn-arrow {
+ background-image: none;
+}
+div.x-toolbar-no-items {
+ color:gray !important;
+ padding:5px 10px !important;
+}.x-resizable-handle {
+ position:absolute;
+ z-index:100;
+ font-size:1px;
+ line-height:6px;
+ overflow:hidden;
+ filter:alpha(opacity=0);
+ opacity:0;
+ zoom:1;
+}
+.x-resizable-handle-east{
+ width:6px;
+ cursor:e-resize;
+ right:0;
+ top:0;
+ height:100%;
+}
+.ext-ie .x-resizable-handle-east {
+ margin-right:-1px;
+}
+.x-resizable-handle-south{
+ width:100%;
+ cursor:s-resize;
+ left:0;
+ bottom:0;
+ height:6px;
+}
+.ext-ie .x-resizable-handle-south {
+ margin-bottom:-1px;
+}
+.x-resizable-handle-west{
+ width:6px;
+ cursor:w-resize;
+ left:0;
+ top:0;
+ height:100%;
+}
+.x-resizable-handle-north{
+ width:100%;
+ cursor:n-resize;
+ left:0;
+ top:0;
+ height:6px;
+}
+.x-resizable-handle-southeast{
+ width:6px;
+ cursor:se-resize;
+ right:0;
+ bottom:0;
+ height:6px;
+ z-index:101;
+}
+.x-resizable-handle-northwest{
+ width:6px;
+ cursor:nw-resize;
+ left:0;
+ top:0;
+ height:6px;
+ z-index:101;
+}
+.x-resizable-handle-northeast{
+ width:6px;
+ cursor:ne-resize;
+ right:0;
+ top:0;
+ height:6px;
+ z-index:101;
+}
+.x-resizable-handle-southwest{
+ width:6px;
+ cursor:sw-resize;
+ left:0;
+ bottom:0;
+ height:6px;
+ z-index:101;
+}
+.x-resizable-over .x-resizable-handle, .x-resizable-pinned .x-resizable-handle{
+ filter:alpha(opacity=100);
+ opacity:1;
+}
+.x-resizable-over .x-resizable-handle-east, .x-resizable-pinned .x-resizable-handle-east,
+.x-resizable-over .x-resizable-handle-west, .x-resizable-pinned .x-resizable-handle-west
+{
+ background-position: left;
+}
+.x-resizable-over .x-resizable-handle-south, .x-resizable-pinned .x-resizable-handle-south,
+.x-resizable-over .x-resizable-handle-north, .x-resizable-pinned .x-resizable-handle-north
+{
+ background-position: top;
+}
+.x-resizable-over .x-resizable-handle-southeast, .x-resizable-pinned .x-resizable-handle-southeast{
+ background-position: top left;
+}
+.x-resizable-over .x-resizable-handle-northwest, .x-resizable-pinned .x-resizable-handle-northwest{
+ background-position:bottom right;
+}
+.x-resizable-over .x-resizable-handle-northeast, .x-resizable-pinned .x-resizable-handle-northeast{
+ background-position: bottom left;
+}
+.x-resizable-over .x-resizable-handle-southwest, .x-resizable-pinned .x-resizable-handle-southwest{
+ background-position: top right;
+}
+.x-resizable-proxy{
+ border: 1px dashed;
+ position:absolute;
+ overflow:hidden;
+ display:none;
+ left:0;
+ top:0;
+ z-index:50000;
+}
+.x-resizable-overlay{
+ width:100%;
+ height:100%;
+ display:none;
+ position:absolute;
+ left:0;
+ top:0;
+ z-index:200000;
+ -moz-opacity: 0;
+ opacity:0;
+ filter: alpha(opacity=0);
+}
+.x-grid3 {
+ position: relative;
+ overflow: hidden;
+}
+
+.x-grid-panel {
+ -moz-outline: none;
+ -moz-user-focus: normal;
+ outline: 0 none;
+}
+
+.x-grid-panel .x-panel-body {
+ overflow: hidden !important;
+}
+
+.x-grid-panel .x-panel-mc .x-panel-body {
+ border: 1px solid;
+}
+
+.x-grid3 .x-grid3-row-table, .x-grid3 .x-grid3-summary-table {
+ table-layout: fixed;
+}
+
+.x-grid3-viewport {
+ overflow: hidden;
+}
+
+.x-grid3-hd-row .x-grid3-hd,.x-grid3-row .x-grid3-hd,.x-grid3-summary-row .x-grid3-hd {
+ -moz-outline: none;
+ -moz-user-focus: normal;
+ outline: 0 none;
+}
+
+.x-grid3-summary-row {
+ -moz-user-select: none;
+ -khtml-user-select: none;
+ -webkit-user-select: ignore;
+ outline: 0 none;
+}
+
+.x-grid3-row td.x-grid3-cell,.x-grid3-summary-row td.x-grid3-cell {
+ line-height: 14px;
+ vertical-align: top;
+ padding-left: 1px;
+ padding-right: 1px;
+ -moz-outline: none;
+ outline: 0 none;
+}
+
+.x-grid3-hd-row .x-grid3-hd {
+ line-height: 15px;
+ vertical-align: middle;
+ border-left: 1px solid;
+ border-right: 1px solid;
+}
+
+.x-grid3-hd-row .x-grid3-marker-hd {
+ padding: 3px;
+}
+
+.x-grid3-row .x-grid3-marker {
+ padding: 3px;
+}
+
+.x-grid3-cell-inner,.x-grid3-hd-inner {
+ overflow: hidden;
+ -o-text-overflow: ellipsis;
+ text-overflow: ellipsis;
+ padding: 3px 3px 3px 5px;
+ white-space: nowrap;
+}
+
+.x-grid3-hd-inner {
+ position: relative;
+ cursor: inherit;
+ padding: 4px 3px 4px 5px;
+ vertical-align: middle;
+}
+
+.x-grid3-row-body {
+ white-space: normal;
+ font-size: 11px;
+}
+
+.x-grid3-body-cell {
+ -moz-outline: 0 none;
+ outline: 0 none;
+}
+
+.ext-ie .x-grid3-cell-inner,.ext-ie .x-grid3-hd-inner {
+ width: 100%;
+}
+
+.ext-strict .x-grid3-cell-inner,.ext-strict .x-grid3-hd-inner {
+ width: auto;
+}
+
+.x-grid-row-loading {
+ background: no-repeat center center;
+}
+
+.x-grid-page {
+ overflow: hidden;
+}
+
+.x-grid3-row {
+ cursor: default;
+ border: 1px solid;
+ width: 100%;
+}
+
+.x-grid3-row-over {
+ border: 1px solid;
+ background: repeat-x left top;
+}
+
+.x-grid3-resize-proxy {
+ width: 1px;
+ left: 0;
+ cursor: e-resize;
+ cursor: col-resize;
+ position: absolute;
+ top: 0;
+ height: 100px;
+ overflow: hidden;
+ visibility: hidden;
+ border: 0 none;
+ z-index: 7;
+}
+
+.x-grid3-resize-marker {
+ width: 1px;
+ left: 0;
+ position: absolute;
+ top: 0;
+ height: 100px;
+ overflow: hidden;
+ visibility: hidden;
+ border: 0 none;
+ z-index: 7;
+}
+
+.x-grid3-focus {
+ position: absolute;
+ left: 0;
+ top: 0;
+ width: 1px;
+ height: 1px;
+ line-height: 1px;
+ font-size: 1px;
+ -moz-outline: 0 none;
+ outline: 0 none;
+ -moz-user-select: text;
+ -khtml-user-select: text;
+ -webkit-user-select: ignore;
+}
+
+.x-grid3-header {
+ background: repeat-x 0 bottom;
+ cursor: default;
+ zoom: 1;
+ padding: 0px 0 0 0;
+}
+
+.x-grid3-header-pop {
+ border-left: 1px solid;
+ float: right;
+ clear: none;
+}
+
+.x-grid3-header-pop-inner {
+ border-left: 1px solid;
+ width: 14px;
+ height: 19px;
+ background: transparent no-repeat center center;
+}
+
+.ext-ie .x-grid3-header-pop-inner {
+ width: 15px;
+}
+
+.ext-strict .x-grid3-header-pop-inner {
+ width: 14px;
+}
+
+.x-grid3-header-inner {
+ overflow: hidden;
+ zoom: 1;
+ float: left;
+}
+
+.x-grid3-header-offset {
+ padding-left: 1px;
+}
+
+td.x-grid3-hd-over,td.sort-desc,td.sort-asc,td.x-grid3-hd-menu-open {
+ border-left: 1px solid;
+ border-right: 1px solid;
+}
+
+td.x-grid3-hd-over .x-grid3-hd-inner,td.sort-desc .x-grid3-hd-inner,td.sort-asc .x-grid3-hd-inner,td.x-grid3-hd-menu-open .x-grid3-hd-inner
+ {
+ background: repeat-x left bottom;
+}
+
+.x-grid3-sort-icon {
+ background-repeat: no-repeat;
+ display: none;
+ height: 4px;
+ width: 13px;
+ margin-left: 3px;
+ vertical-align: middle;
+}
+
+.sort-asc .x-grid3-sort-icon,.sort-desc .x-grid3-sort-icon {
+ display: inline;
+}
+
+.ext-strict .ext-ie .x-grid3-header-inner,.ext-strict .ext-ie6 .x-grid3-hd {
+ position: relative;
+}
+
+.ext-strict .ext-ie6 .x-grid3-hd-inner {
+ position: static;
+}
+
+.x-grid3-body {
+ zoom: 1;
+}
+
+.x-grid3-scroller {
+ overflow: auto;
+ zoom: 1;
+ position: relative;
+}
+
+.x-grid3-cell-text,.x-grid3-hd-text {
+ display: block;
+ padding: 3px 5px 3px 5px;
+}
+
+.x-grid3-split {
+ background-position: center;
+ background-repeat: no-repeat;
+ cursor: e-resize;
+ cursor: col-resize;
+ display: block;
+ font-size: 1px;
+ height: 16px;
+ overflow: hidden;
+ position: absolute;
+ top: 2px;
+ width: 6px;
+ z-index: 3;
+}
+
+.x-dd-drag-proxy .x-grid3-hd-inner {
+ background: repeat-x left bottom;
+ width: 120px;
+ padding: 3px;
+ border: 1px solid;
+ overflow: hidden;
+}
+
+.col-move-top,.col-move-bottom {
+ width: 9px;
+ height: 9px;
+ position: absolute;
+ top: 0;
+ line-height: 1px;
+ font-size: 1px;
+ overflow: hidden;
+ visibility: hidden;
+ z-index: 20000;
+ background: transparent no-repeat left top;
+}
+
+.x-grid3-row-selected {
+ border: 1px dotted;
+}
+
+.x-grid3-locked td.x-grid3-row-marker,.x-grid3-locked .x-grid3-row-selected td.x-grid3-row-marker {
+ background: repeat-x 0 bottom !important;
+ vertical-align: middle !important;
+ padding: 0;
+ border-top: 1px solid;
+ border-bottom: none !important;
+ border-right: 1px solid !important;
+ text-align: center;
+}
+
+.x-grid3-locked td.x-grid3-row-marker div,.x-grid3-locked .x-grid3-row-selected td.x-grid3-row-marker div {
+ padding: 0 4px;
+ text-align: center;
+}
+
+.x-grid3-dirty-cell {
+ background: transparent no-repeat 0 0;
+}
+
+.x-grid3-invalid-cell {
+ background: repeat-x bottom;
+}
+
+.x-grid3-topbar,.x-grid3-bottombar {
+ overflow: hidden;
+ display: none;
+ zoom: 1;
+ position: relative;
+}
+
+.x-grid3-topbar .x-toolbar {
+ border-right: 0 none;
+}
+
+.x-grid3-bottombar .x-toolbar {
+ border-right: 0 none;
+ border-bottom: 0 none;
+ border-top: 1px solid;
+}
+
+.x-props-grid .x-grid3-cell {
+ padding: 1px;
+}
+
+.x-props-grid .x-grid3-td-name .x-grid3-cell-inner {
+ background: transparent repeat-y -16px !important;
+ padding-left: 12px;
+}
+
+.x-props-grid .x-grid3-body .x-grid3-td-name {
+ padding: 1px;
+ padding-right: 0;
+ border: 0 none;
+ border-right: 1px solid;
+}
+
+.x-grid3-col-dd {
+ border: 0 none;
+ padding: 0;
+ background: transparent;
+}
+
+.x-dd-drag-ghost .x-grid3-dd-wrap {
+ padding: 1px 3px 3px 1px;
+}
+
+.x-grid3-hd {
+ -moz-user-select: none;
+ -khtml-user-select: none;
+ -webkit-user-select: ignore;
+}
+
+.x-grid3-hd-btn {
+ display: none;
+ position: absolute;
+ width: 14px;
+ background: no-repeat left center;
+ right: 0;
+ top: 0;
+ z-index: 2;
+ cursor: pointer;
+ outline: none;
+}
+
+.x-grid3-hd-over .x-grid3-hd-btn,.x-grid3-hd-menu-open .x-grid3-hd-btn {
+ display: block;
+}
+
+a.x-grid3-hd-btn:hover {
+ background-position: -14px center;
+}
+
+.x-grid3-body .x-grid3-td-expander {
+ background: transparent repeat-y right;
+}
+
+.x-grid3-body .x-grid3-td-expander .x-grid3-cell-inner {
+ padding: 0 !important;
+ height: 100%;
+}
+
+.x-grid3-row-expander {
+ width: 100%;
+ height: 18px;
+ background-position: 4px 2px;
+ background-repeat: no-repeat;
+ background-color: transparent;
+}
+
+.x-grid3-row-collapsed .x-grid3-row-expander {
+ background-position: 4px 2px;
+}
+
+.x-grid3-row-expanded .x-grid3-row-expander {
+ background-position: -21px 2px;
+}
+
+.x-grid3-row-collapsed .x-grid3-row-body {
+ display: none !important;
+}
+
+.x-grid3-row-expanded .x-grid3-row-body {
+ display: block !important;
+}
+
+.x-grid3-body .x-grid3-td-checker {
+ background: transparent repeat-y right;
+}
+
+.x-grid3-body .x-grid3-td-checker .x-grid3-cell-inner,.x-grid3-header .x-grid3-td-checker .x-grid3-hd-inner {
+ padding: 0 !important;
+ height: 100%;
+}
+
+.x-grid3-group-checker {
+ float: left;
+}
+
+.x-grid3-row-checker,.x-grid3-hd-checker {
+ width: 100%;
+ height: 18px;
+ background-position: 2px 2px;
+ background-repeat: no-repeat;
+ background-color: transparent;
+}
+
+.x-grid3-hd-checker {
+ padding-bottom: 0px !important;
+}
+
+.x-grid3-row .x-grid3-row-checker {
+ background-position: 2px 2px;
+}
+
+.x-grid3-row-selected .x-grid3-row-checker,.x-grid3-hd-checker-on .x-grid3-hd-checker,.x-grid3-row-checked .x-grid3-row-checker
+ {
+ background-position: -23px 2px;
+}
+
+.x-grid3-hd-checker {
+ background-position: 2px 3px;
+}
+
+.x-grid3-hd-checker-on .x-grid3-hd-checker {
+ background-position: -23px 3px;
+}
+
+.x-grid3-body .x-grid3-td-numberer {
+ background: transparent repeat-y right;
+}
+
+.x-grid3-body .x-grid3-td-numberer .x-grid3-cell-inner {
+ padding: 3px 5px 0 0 !important;
+ text-align: right;
+}
+
+.x-grid3-body .x-grid3-td-row-icon {
+ background: transparent repeat-y right;
+ vertical-align: top;
+ text-align: center;
+}
+
+.x-grid3-body .x-grid3-td-row-icon .x-grid3-cell-inner {
+ padding: 0 !important;
+ background-position: center center;
+ background-repeat: no-repeat;
+ width: 16px;
+ height: 16px;
+ margin-left: 2px;
+ margin-top: 3px;
+}
+
+.x-grid3-body .x-grid3-row-selected .x-grid3-td-numberer,.x-grid3-body .x-grid3-row-selected .x-grid3-td-checker,.x-grid3-body .x-grid3-row-selected .x-grid3-td-expander
+ {
+ background: transparent repeat-y right;
+}
+
+.x-grid3-body .x-grid3-check-col-td .x-grid3-cell-inner {
+ padding: 1px 0 0 0 !important;
+}
+
+.x-grid3-check-col {
+ width: 100%;
+ height: 16px;
+ background-position: center center;
+ background-repeat: no-repeat;
+ background-color: transparent;
+}
+
+.x-grid3-check-col-on {
+ width: 100%;
+ height: 16px;
+ background-position: center center;
+ background-repeat: no-repeat;
+ background-color: transparent;
+}
+
+.x-grid-group,.x-grid-group-body,.x-grid-group-hd {
+ zoom: 1;
+}
+
+.x-grid-group-hd {
+ border-bottom: 2px solid;
+ cursor: pointer;
+ padding-top: 6px;
+}
+
+.x-grid-group-hd .x-grid-group-div {
+ background: transparent no-repeat 3px -47px;
+ padding: 4px 4px 4px 17px;
+}
+
+.x-grid-group-collapsed .x-grid-group-hd .x-grid-group-div {
+ background-position: 3px 3px;
+}
+
+.x-grid-group-collapsed .x-grid-group-body {
+ display: none;
+}
+
+.x-grid-empty {
+ padding: 10px;
+}
+
+.ext-ie7 .x-grid-panel .x-panel-bbar {
+ position: relative;
+}
+
+.x-grid-with-col-lines .x-grid3-row td.x-grid3-cell {
+ padding-right: 0;
+ border-right: 1px solid;
+}
+
+.ext-ie6 .x-grid3-header {
+ position: relative;
+}
+
+.x-grid3-check-col-disabled {
+ width: 100%;
+ height: 16px;
+ background-position: center center;
+ background-repeat: no-repeat;
+}
+
+.x-row-editor-header {
+ height: 2px;
+ overflow: hidden;
+}
+
+.x-row-editor-footer {
+ height: 2px;
+ overflow: hidden;
+}
+
+.ext-ie .x-row-editor-footer {
+ margin-top: -1px;
+}
+
+.x-row-editor-body {
+ overflow: hidden;
+ zoom: 1;
+ padding-top: 2px;
+}
+
+.x-row-editor .x-btns {
+ position: absolute;
+ top: 28px;
+ left: 20px;
+ padding-left: 5px;
+}
+
+.x-row-editor .x-btns .x-plain-bwrap {
+ padding-right: 5px;
+}
+
+.x-row-editor .x-btns .x-plain-body {
+ height: 31px;
+}
+
+.x-row-editor .x-btns .x-table-layout-cell {
+ padding: 3px;
+}
+
+.x-grid3-footer {
+ background: #f7f7f7 none repeat scroll 0 0;
+ border-top: 1px solid #DDDDDD;
+ border-bottom: 1px solid #DDDDDD;
+ display: block;
+ overflow: hidden;
+ position: relative;
+}
+
+.x-grid3-footer-row {
+ border-top: 1px solid #EEEEEE;
+ background-color: #f7f7f7;
+ -moz-user-select: none;
+ -khtml-user-select: none;
+ -webkit-user-select: ignore;
+ cursor: default;
+}
+
+.x-grid3-footer-row td {
+ line-height: 13px;
+ vertical-align: top;
+ padding-left: 1px;
+ padding-right: 1px;
+ font: normal 11px arial, tahoma, helvetica, sans-serif;
+}
+
+.ext-ie6 .x-grid3 .x-editor .x-form-text,.ext-ie7 .x-grid3 .x-editor .x-form-text {
+ top: -1px;
+}
+
+.ext-ie8-compatibility .x-grid3 .x-editor .x-form-text {
+ top: 0;
+}
+
+.x-grid-panel .x-livegrid-scroller {
+ z-index: 1;
+ position: absolute;
+ right: 0px;
+ width: 18px;
+ overflow-y: scroll;
+ overflow-x: hidden;
+}
+
+.x-grid3-group-checker div {
+ width: 14px;
+ height: 18px;
+ background-position: -1 -2px;
+ background-repeat: no-repeat;
+ background-color: transparent;
+}
+
+.x-grid-group-hd .x-grid3-group-check {
+ background-image: url(../images/default/menu/checked.gif);
+}
+
+.x-grid-group-hd .x-grid3-group-uncheck {
+ background-image: url(../images/default/menu/unchecked.gif);
+}
+
+.x-grid3-hd-row .x-filtered-column {
+ font-style: italic !important;
+ font-weight: bold !important;
+}
+.x-dd-drag-proxy{
+ position:absolute;
+ left:0;
+ top:0;
+ visibility:hidden;
+ z-index:15000;
+}
+.x-dd-drag-ghost{
+ -moz-opacity: 0.85;
+ opacity:.85;
+ filter: alpha(opacity=85);
+ border: 1px solid;
+ padding:3px;
+ padding-left:20px;
+ white-space:nowrap;
+}
+.x-dd-drag-repair .x-dd-drag-ghost{
+ -moz-opacity: 0.4;
+ opacity:.4;
+ filter: alpha(opacity=40);
+ border:0 none;
+ padding:0;
+ background-color:transparent;
+}
+.x-dd-drag-repair .x-dd-drop-icon{
+ visibility:hidden;
+}
+.x-dd-drop-icon{
+ position:absolute;
+ top:3px;
+ left:3px;
+ display:block;
+ width:16px;
+ height:16px;
+ background-color:transparent;
+ background-position: center;
+ background-repeat: no-repeat;
+ z-index:1;
+}
+.x-view-selector {
+ position:absolute;
+ left:0;
+ top:0;
+ width:0;
+ border:1px dotted;
+ opacity: .5;
+ -moz-opacity: .5;
+ filter:alpha(opacity=50);
+ zoom:1;
+}
+
+.x-dd-cursor {
+ cursor: default !important;
+}
+
+.x-insert-bar {
+ position: absolute;
+
+ z-index: 99999;
+}
+
+.x-insert-bar td {
+ line-height: 1px;
+ font-size: 1px;
+}
+
+.x-insert-left {
+ background: url(../images/gxt/dd/insert-bg.gif) no-repeat;
+}
+
+.x-insert-mid {
+ background: url(../images/gxt/dd/insert-bg.gif) repeat-x 0 -12px;
+}
+
+.x-insert-right {
+ background: url(../images/gxt/dd/insert-bg.gif) no-repeat 0px -6px;
+}
+.tree-folder {
+ background: url(../images/gxt/icons/folder-closed.gif) no-repeat center
+ left !important;
+}
+
+.tree-folder-open {
+ background: url(../images/gxt/icons/folder.gif) no-repeat center left
+ !important;
+}
+
+.my-tree {
+ cursor: default;
+ font-size: 11px;
+ -moz-outline: none;
+ -moz-user-focus: none;
+}
+
+.my-root-item {
+ padding: 4px;
+}
+
+.my-tree-item,.my-tree-item table,.my-tree-item table td {
+ -moz-outline: none;
+ -moz-user-focus: normal;
+ outline: 0 none;
+ font-size: 11px;
+}
+
+.my-tree-item td {
+ height: 19px;
+}
+
+.my-tree-indent {
+ line-height: 1px;
+ font-size: 1px;
+}
+
+.my-tree-joint div {
+ width: 15px;
+ height: 19px;
+ line-height: 1px;
+ font-size: 1px;
+}
+
+.my-tree-left,.my-tree-left div,.my-tree-right {
+ line-height: 1px;
+ font-size: 1px;
+ width: 3px;
+}
+
+.my-tree-left div,.my-tree-right div {
+ width: 3px;
+}
+
+.my-tree-item,.my-treeitem-wrap {
+ -moz-outline: none;
+ -moz-user-focus: normal;
+ outline: 0 none;
+}
+
+.my-tree-check div {
+ width: 17px;
+ height: 17px;
+ line-height: 1px;
+ font-size: 1px;
+}
+
+.my-tree-icon div {
+ width: 16px;
+ height: 17px;
+ cursor: pointer;
+ background-repeat: no-repeat;
+ background-position: center;
+}
+
+.my-tree-item-text span {
+ font-family: arial, tahoma, helvetica, sans-serif;
+ font-size: 12px;
+ white-space: nowrap;
+ padding-left: 3px;
+ padding-right: 3px;
+ display: block;
+ height: 15px;
+ cursor: pointer;
+}
+
+.my-tree-over .my-tree-left {
+ background: url(../images/gxt/shared/select-19-bg.gif) no-repeat left
+ -57px;
+}
+
+.my-tree-over .my-tree-right {
+ background: url(../images/gxt/shared/select-19-bg.gif) no-repeat right
+ -76px;
+}
+
+.my-tree-over .my-tree-check,.my-tree-over .my-tree-icon,.my-tree-over .my-tree-item-text
+ {
+ background: url(../images/gxt/shared/select-19-bg.gif) left -95px;
+}
+
+.my-tree-sel .my-tree-left {
+ background: url(../images/gxt/shared/select-19-bg.gif) no-repeat left
+ 0px;
+}
+
+.my-tree-sel .my-tree-right {
+ background: url(../images/gxt/shared/select-19-bg.gif) no-repeat right
+ -19px;
+}
+
+.my-tree-sel .my-tree-check,.my-tree-sel .my-tree-icon,.my-tree-sel .my-tree-item-text
+ {
+ background: url(../images/gxt/shared/select-19-bg.gif) left -38px;
+}
+
+.my-tree-drop .my-tree-left {
+ background: url(../images/gxt/shared/select-19-bg.gif) no-repeat left
+ -115px;
+}
+
+.my-tree-drop .my-tree-right {
+ background: url(../images/gxt/shared/select-19-bg.gif) no-repeat right
+ -133px;
+}
+
+.my-tree-drop .my-tree-check,.my-tree-drop .my-tree-icon,.my-tree-drop .my-tree-item-text
+ {
+ background: url(../images/gxt/shared/select-19-bg.gif) left -152px;
+}
+
+.my-tree-close {
+ background: url(../images/gxt/tree/vnode_transparent.gif) no-repeat 0px
+ 1px;
+}
+
+.my-tree-open {
+ background: url(../images/gxt/tree/vnode_transparent.gif) no-repeat 0px
+ -32px;
+}
+
+.my-tree-joint-over .my-tree-open {
+ background: url(../images/gxt/tree/vnode_transparent.gif) no-repeat 0px
+ -48px;
+}
+
+.my-tree-joint-over .my-tree-close {
+ background: url(../images/gxt/tree/vnode_transparent.gif) no-repeat 0px
+ -15px;
+}
+
+.my-tree-notchecked {
+ background: url(../images/gxt/tree/notchecked.gif) no-repeat 0px 50%;
+}
+
+.my-tree-checked {
+ background: url(../images/gxt/tree/checked.gif) no-repeat 0px 50%;
+}
+
+.my-tree-loading .tree-folder {
+ background: url(../images/gxt/icons/wait.gif) no-repeat 0px -1px
+ !important;
+}
+
+.my-tree-loading .my-tree-item-text span {
+ font-style: italic;
+}
+
+.x-ftree-selected .x-ftree-text {
+ background-color: #d9e8fb;
+}
+
+.x-ftree-node-over .x-ftree-text {
+ background-color: #eee;
+}
+
+.x-ftree-item {
+ line-height: 18px;
+}
+
+.x-ftree-joint,.x-ftree-icon {
+ border: 0 none;
+ height: 18px;
+ margin: 0;
+ padding: 0;
+ vertical-align: top;
+ width: 16px;
+ background-position: center;
+ background-repeat: no-repeat;
+}
+
+.x-ftree-text {
+ color: black;
+ font: normal 11px arial, tahoma, helvetica, sans-serif;
+ white-space: nowrap;
+ text-decoration: none;
+ color: black;
+ padding-left: 4px;
+ vertical-align: middle;
+ line-height: 18px;
+ padding: 2px 4px 4px 4px;
+}
+
+/* some default icons for leaf/folder */
+.x-ftree-expanded .x-ftree-icon {
+ background-image: url(../images/default/tree/folder-open.gif);
+}
+
+.x-ftree-leaf .x-ftree-icon {
+ background-image: url(../images/default/tree/leaf.gif);
+}
+
+.x-ftree-collapsed .x-ftree-icon {
+ background-image: url(../images/gxt/icons/folder-closed.gif);
+}
+
+/* Arrows */
+.x-ftree-arrows .x-ftree-joint {
+ background: transparent;
+}
+
+.x-ftree-arrows .x-ftree-joint-plus {
+ background: transparent url(../images/default/tree/arrows.gif) no-repeat
+ 0 0;
+}
+
+.x-ftree-arrows .x-ftree-joint-minus {
+ background: transparent url(../images/default/tree/arrows.gif) no-repeat
+ -16px 0;
+}
+
+.x-ftree-arrows .x-ftree-ec-over .x-ftree-joint-plus {
+ background-position: -32px 0;
+}
+
+.x-ftree-arrows .x-ftree-ec-over .x-ftree-joint-minus {
+ background-position: -48px 0;
+}
+
+.x-ftree2-highlightrow {
+ border: 1px dotted #545352;
+}
+
+.x-ftree2-selected {
+ background-color: #d9e8fb !important;
+}
+
+.x-ftree2-node-over {
+ background-color: #eee;
+}
+
+.x-ftree2-node-drop {
+ background-color: #defadc;
+}
+
+.x-ftree2-joint,.x-ftree2-icon {
+ border: 0 none;
+ height: 18px;
+ margin: 0;
+ padding: 0;
+ vertical-align: top;
+ width: 16px;
+ background-position: center;
+ background-repeat: no-repeat;
+}
+
+.x-ftree2-joint div {
+ width: 16px;
+}
+
+.x-ftree2-el-ct {
+ display: none;
+}
+
+.x-ftree2-node {
+ padding-bottom: 1px;
+}
+
+.x-ftree2-text {
+ vertical-align: middle !important;
+ white-space: nowrap !important;
+}
+
+.x-ftree2-text span {
+ color: black;
+ font: normal 11px arial, tahoma, helvetica, sans-serif;
+ white-space: nowrap;
+ text-decoration: none;
+ color: black;
+ padding: 2px 4px 2px 1px;
+ display: block;
+}
+
+.ext-ie .x-ftree2-text span {
+ padding-left: 3px;
+}
+
+.x-ftree2-check {
+ width: 17px;
+}
+
+.x-ftree2-check div {
+ width: 17px;
+ height: 17px;
+}
+
+/* some default icons for leaf/folder */
+.x-ftree2-expanded .x-ftree2-icon {
+ background-image: url(../images/default/tree/folder-open.gif);
+}
+
+.x-ftree2-leaf .x-ftree2-icon {
+ background-image: url(../images/default/tree/leaf.gif);
+}
+
+.x-ftree2-collapsed .x-ftree2-icon {
+ background-image: url(../images/gxt/icons/folder-closed.gif);
+}
+
+/* Arrows */
+.x-ftree2-arrows .x-ftree2-joint {
+ background: transparent;
+}
+
+.x-ftree2-arrows .x-ftree2-joint-plus {
+ background: transparent url(../images/default/tree/arrows.gif) no-repeat
+ 0 0;
+}
+
+.x-ftree2-arrows .x-ftree2-joint-minus {
+ background: transparent url(../images/default/tree/arrows.gif) no-repeat
+ -16px 0;
+}
+
+.x-ftree2-arrows .x-ftree2-ec-over .x-ftree2-joint-plus {
+ background-position: -32px 0;
+}
+
+.x-ftree2-arrows .x-ftree2-ec-over .x-ftree2-joint-minus {
+ background-position: -48px 0;
+}
+
+.x-treegrid {
+ -moz-outline: none;
+ -moz-user-focus: none;
+ outline: 0 none;
+}
+
+.x-treegrid .x-treegrid-column .x-grid3-cell-inner {
+ padding: 0px !important;
+}
+
+.x-tree3 {
+ cursor: default;
+ -moz-outline: none;
+ -moz-user-focus: none;
+ outline: 0 none;
+}
+
+.ext-strict .ext-gecko .x-tree3, .ext-strict .ext-webkit .x-tree3 {
+ padding-bottom: 1px;
+}
+
+.x-tree3-node {
+ cursor: default;
+}
+
+.x-tree3-el {
+ white-space: nowrap;
+ height: 21px;
+ position: relative;
+}
+
+.x-tree3-node-text {
+ white-space: nowrap;
+ line-height: 11px;
+ text-decoration: none;
+ padding: 0 0 0 3px;
+ position: relative;
+ top: -4px;
+}
+
+.x-tree3-node-ct {
+ display: none;
+}
+
+.x-tree3-node-text-widget {
+ position: static !important;
+ padding: 0px !important;
+}.x-date-picker {
+ border: 1px solid;
+ border-top:0 none;
+ position:relative;
+ -moz-outline:0 none;
+ outline:0 none;
+}
+.x-date-picker a {
+ -moz-outline:0 none;
+ outline:0 none;
+}
+.x-date-inner, .x-date-inner td, .x-date-inner th{
+ border-collapse:separate;
+}
+.x-date-middle,.x-date-left,.x-date-right {
+ background: repeat-x 0 -83px;
+ overflow:hidden;
+}
+.x-date-middle .x-btn-tc,.x-date-middle .x-btn-tl,.x-date-middle .x-btn-tr,
+.x-date-middle .x-btn-mc,.x-date-middle .x-btn-ml,.x-date-middle .x-btn-mr,
+.x-date-middle .x-btn-bc,.x-date-middle .x-btn-bl,.x-date-middle .x-btn-br{
+ background:transparent !important;
+ vertical-align:middle;
+}
+.x-date-middle .x-btn-mc em.x-btn-arrow {
+ background:transparent no-repeat right 0;
+}
+.x-date-right, .x-date-left {
+ width:18px;
+}
+.x-date-right{
+ text-align:right;
+}
+.x-date-middle {
+ padding-top:2px;
+ padding-bottom:2px;
+ width:130px;
+}
+.x-date-right a, .x-date-left a{
+ display:block;
+ width:16px;
+ height:16px;
+ background-position: center;
+ background-repeat: no-repeat;
+ cursor:pointer;
+ -moz-opacity: 0.6;
+ opacity:.6;
+ filter: alpha(opacity=60);
+}
+.x-date-right a:hover, .x-date-left a:hover{
+ -moz-opacity: 1;
+ opacity:1;
+ filter: alpha(opacity=100);
+}
+.x-date-right a {
+ margin-right:2px;
+ text-decoration:none !important;
+}
+.x-date-left a{
+ margin-left:2px;
+ text-decoration:none !important;
+}
+table.x-date-inner {
+ width:100%;
+ table-layout:fixed;
+}
+.x-date-inner th {
+ width:25px;
+}
+.x-date-inner th {
+ background: repeat-x left top;
+ text-align:right !important;
+ border-bottom: 1px solid;
+ cursor:default;
+ padding:0;
+ border-collapse:separate;
+}
+.x-date-inner th span {
+ display:block;
+ padding:2px;
+ padding-right:7px;
+}
+.x-date-inner td {
+ border: 1px solid;
+ text-align:right;
+ padding:0;
+}
+.x-date-inner a {
+ padding:2px 5px;
+ display:block;
+ text-decoration:none;
+ text-align:right;
+ zoom:1;
+}
+.x-date-inner .x-date-active{
+ cursor:pointer;
+ color:black;
+}
+.x-date-inner .x-date-selected a{
+ background: repeat-x left top;
+ border:1px solid;
+ padding:1px 4px;
+}
+.x-date-inner .x-date-today a{
+ border: 1px solid;
+ padding:1px 4px;
+}
+.x-date-inner .x-date-prevday a,.x-date-inner .x-date-nextday a {
+ text-decoration:none !important;
+}
+.x-date-bottom {
+ padding:4px;
+ border-top: 1px solid;
+ background: repeat-x left top;
+}
+.x-date-inner a:hover, .x-date-inner .x-date-disabled a:hover{
+ text-decoration:none !important;
+}
+.x-date-inner .x-date-disabled a {
+ cursor:default;
+}
+.x-date-mmenu .x-menu-item {
+ padding:1px 24px 1px 4px;
+ white-space: nowrap;
+}
+.x-date-mmenu .x-menu-item .x-menu-item-icon {
+ width:10px;
+ height:10px;
+ margin-right:5px;
+ background-position:center -4px !important;
+}
+.x-date-mp {
+ position:absolute;
+ left:0;
+ top:0;
+ display:none;
+}
+.x-date-mp td {
+ padding:2px;
+ font:normal 11px arial, helvetica,tahoma,sans-serif;
+}
+td.x-date-mp-month,td.x-date-mp-year,td.x-date-mp-ybtn {
+ border: 0 none;
+ text-align:center;
+ vertical-align: middle;
+ width:25%;
+}
+.x-date-mp-ok {
+ margin-right:3px;
+}
+.x-date-mp-btns button {
+ text-decoration:none;
+ text-align:center;
+ text-decoration:none !important;
+ border:1px solid;
+ padding:1px 3px 1px;
+ cursor:pointer;
+}
+.x-date-mp-btns {
+ background: repeat-x left top;
+}
+.x-date-mp-btns td {
+ border-top: 1px solid;
+ text-align:center;
+}
+td.x-date-mp-month a,td.x-date-mp-year a {
+ display:block;
+ padding:2px 4px;
+ text-decoration:none;
+ text-align:center;
+}
+td.x-date-mp-month a:hover,td.x-date-mp-year a:hover {
+ text-decoration:none;
+ cursor:pointer;
+}
+td.x-date-mp-sel a {
+ padding:1px 3px;
+ background: repeat-x left top;
+ border:1px solid;
+}
+.x-date-mp-ybtn a {
+ overflow:hidden;
+ width:15px;
+ height:15px;
+ cursor:pointer;
+ background:transparent no-repeat;
+ display:block;
+ margin:0 auto;
+}
+.x-date-mp-ybtn a.x-date-mp-next {
+ background-position:0 -120px;
+}
+.x-date-mp-ybtn a.x-date-mp-next:hover {
+ background-position:-15px -120px;
+}
+.x-date-mp-ybtn a.x-date-mp-prev {
+ background-position:0 -105px;
+}
+.x-date-mp-ybtn a.x-date-mp-prev:hover {
+ background-position:-15px -105px;
+}
+.x-date-mp-ybtn {
+ text-align:center;
+}
+td.x-date-mp-sep {
+ border-right:1px solid;
+}
+
+.x-date-picker, .x-date-picker a {
+ font-size: 11px;
+}
+
+.x-date-right-icon {
+ background-image: url(../images/default/shared/right-btn.gif);
+ margin-right: 2px;
+ text-decoration: none !important;
+}
+
+.x-date-left-icon {
+ background-image: url(../images/default/shared/left-btn.gif);
+ margin-left: 4px;
+ text-decoration: none !important;
+}
+
+.x-date-days {
+ table-layout: fixed;
+ width: 100%;
+}
+
+.x-date-days td {
+ width: 25px;
+ border: none;
+}
+
+.x-date-days td span {
+ display: block;
+ padding: 2px 7px 2px 2px;
+}
+
+.x-date-days td {
+ background: #DFECFB url(../images/default/shared/glass-bg.gif) repeat-x scroll left top;
+ border-bottom: 1px solid #A3BAD9;
+ border-collapse: separate;
+ color: #233D6D;
+ cursor: default;
+ font-family: arial, helvetica, tahoma, sans-serif;
+ font-size: 10px;
+ font-size-adjust: none;
+ font-stretch: normal;
+ font-style: normal;
+ font-variant: normal;
+ font-weight: normal;
+ line-height: normal;
+ padding: 0pt;
+ text-align: right !important;
+}
+
+.x-date-picker .x-date-header {
+ background: url(../images/default/shared/hd-sprite.gif) repeat-x 0 -83px;
+ height: 22px;
+ left: 10px;
+ top: 10px;
+ width: 157px;
+}
+
+.x-date-header .x-btn .x-btn-text {
+ color: #fff;
+}
+
+.x-date-picker-footer {
+ width: 100%;
+}
+
+.x-date-picker-footer td {
+ text-align: center;
+}
+
+.x-date-left {
+ background: transparent url(../images/default/shared/hd-sprite.gif) repeat-x scroll 0pt -83px;
+ color: #FFFFFF;
+ font-family: "sans serif", tahoma, verdana, helvetica;
+ font-size: 11px;
+ font-size-adjust: none;
+ font-stretch: normal;
+ font-style: normal;
+ font-variant: normal;
+ font-weight: bold;
+ line-height: normal;
+ overflow: hidden;
+}
+
+.x-date-inner .x-date-active-hover {
+ background: #ddecfe !important;
+}.x-tip{
+ position: absolute;
+ top: 0;
+ left:0;
+ visibility: hidden;
+ z-index: 20000;
+ border:0 none;
+}
+.x-tip .x-tip-close{
+ height: 15px;
+ float:right;
+ width: 15px;
+ margin:0 0 2px 2px;
+ cursor:pointer;
+ display:none;
+}
+.x-tip .x-tip-tc {
+ background: transparent no-repeat 0 -62px;
+ padding-top:3px;
+ overflow:hidden;
+ zoom:1;
+}
+.x-tip .x-tip-tl {
+ background: transparent no-repeat 0 0;
+ padding-left:6px;
+ overflow:hidden;
+ zoom:1;
+}
+.x-tip .x-tip-tr {
+ background: transparent no-repeat right 0;
+ padding-right:6px;
+ overflow:hidden;
+ zoom:1;
+}
+.x-tip .x-tip-bc {
+ background: transparent no-repeat 0 -121px;
+ height:3px;
+ overflow:hidden;
+}
+.x-tip .x-tip-bl {
+ background: transparent no-repeat 0 -59px;
+ padding-left:6px;
+ zoom:1;
+}
+.x-tip .x-tip-br {
+ background: transparent no-repeat right -59px;
+ padding-right:6px;
+ zoom:1;
+}
+.x-tip .x-tip-mc {
+ border:0 none;
+}
+.x-tip .x-tip-ml {
+ background: no-repeat 0 -124px;
+ padding-left:6px;
+ zoom:1;
+}
+.x-tip .x-tip-mr {
+ background: transparent no-repeat right -124px;
+ padding-right:6px;
+ zoom:1;
+}
+.ext-ie .x-tip .x-tip-header,.ext-ie .x-tip .x-tip-tc {
+ font-size:0;
+ line-height:0;
+}
+.ext-border-box .x-tip .x-tip-header,.ext-border-box .ext-ie .x-tip .x-tip-tc {
+ line-height:1px;
+}
+.x-tip .x-tip-header-text {
+ padding:0;
+ margin:0 0 2px 0;
+}
+.x-tip .x-tip-body {
+ margin:0 !important;
+ line-height:14px;
+ padding:0;
+}
+.x-tip .x-tip-body .loading-indicator {
+ margin:0;
+}
+.x-tip-draggable .x-tip-header,.x-tip-draggable .x-tip-header-text {
+ cursor:move;
+}
+.x-form-invalid-tip .x-tip-tc {
+ background: repeat-x 0 -12px;
+ padding-top:6px;
+}
+.x-form-invalid-tip .x-tip-bc {
+ background: repeat-x 0 -18px;
+ height:6px;
+}
+.x-form-invalid-tip .x-tip-bl {
+ background: no-repeat 0 -6px;
+}
+.x-form-invalid-tip .x-tip-br {
+ background: no-repeat right -6px;
+}
+.x-form-invalid-tip .x-tip-body {
+ padding:2px;
+}
+.x-form-invalid-tip .x-tip-body {
+ padding-left:24px;
+ background:transparent no-repeat 2px 2px;
+}
+.x-tip-anchor {
+ position: absolute;
+ width: 9px;
+ height: 10px;
+ overflow:hidden;
+ background: transparent no-repeat 0 0;
+ zoom:1;
+}
+.x-tip-anchor-bottom {
+ background-position: -9px 0;
+}
+.x-tip-anchor-right {
+ background-position: -18px 0;
+ width: 10px;
+}
+.x-tip-anchor-left {
+ background-position: -28px 0;
+ width: 10px;
+}
+.x-menu {
+ border: 1px solid;
+ z-index: 15000;
+ zoom: 1;
+ background: repeat-y;
+ -moz-outline: none;
+ outline: 0 none;
+}
+
+.x-menu a {
+ text-decoration: none !important;
+}
+
+.ext-ie .x-menu {
+ zoom: 1;
+ overflow: hidden;
+}
+
+.x-menu-list {
+ padding: 2px;
+ background: transparent;
+ border: 0 none;
+ overflow: hidden;
+ overflow-y: hidden;
+}
+
+.ext-strict .ext-ie .x-menu-list {
+ position: relative;
+}
+
+.x-menu x-menu-sep-li {
+ font-size: 1px;
+ line-height: 1px;
+}
+
+.x-menu-list-item {
+ white-space: nowrap;
+ display: block;
+ padding: 1px;
+}
+
+.x-menu-item {
+ -moz-user-select: none;
+ -khtml-user-select: none;
+ -webkit-user-select: ignore
+}
+
+.x-menu-item-arrow {
+ background: transparent no-repeat right;
+}
+
+.x-menu-sep {
+ display: block;
+ font-size: 1px;
+ line-height: 1px;
+ margin: 2px 3px;
+ border-bottom: 1px solid;
+ overflow: hidden;
+}
+
+.x-menu-focus {
+ position: absolute;
+ left: -1px;
+ top: -1px;
+ width: 1px;
+ height: 1px;
+ line-height: 1px;
+ font-size: 1px;
+ -moz-outline: 0 none;
+ outline: 0 none;
+ -moz-user-select: none;
+ -khtml-user-select: none;
+ -webkit-user-select: ignore
+ overflow: hidden;
+ display: block;
+}
+
+a.x-menu-item {
+ cursor: pointer;
+ display: block;
+ line-height: 16px;
+ outline-color: -moz-use-text-color;
+ outline-style: none;
+ outline-width: 0;
+ padding: 3px 21px 3px 27px;
+ position: relative;
+ text-decoration: none;
+ white-space: nowrap;
+}
+
+.x-menu-item-active {
+ border-style: solid;
+ border-width: 1px;
+ padding: 0;
+}
+
+.x-menu-item-icon {
+ border: 0 none;
+ height: 16px;
+ padding: 0;
+ vertical-align: top;
+ width: 16px;
+ position: absolute;
+ left: 3px;
+ top: 3px;
+ margin: 0;
+ background-position: center;
+}
+
+.ext-ie .x-menu-item-icon {
+ left: -24px;
+}
+
+.ext-strict .x-menu-item-icon {
+ left: 3px;
+}
+
+.ext-ie6 .x-menu-item-icon {
+ left: -24px;
+}
+
+.ext-ie .x-menu-item-icon {
+ vertical-align: middle;
+}
+
+.x-date-menu .x-menu-list {
+ padding: 0;
+}
+
+.x-menu-date-item {
+ padding: 0;
+}
+
+.x-menu .x-color-palette,.x-menu .x-date-picker {
+ margin-left: 26px;
+ margin-right: 4px;
+}
+
+.x-menu .x-date-picker {
+ border: 1px solid;
+ margin-top: 2px;
+ margin-bottom: 2px;
+}
+
+.x-menu-plain .x-color-palette,.x-menu-plain .x-date-picker {
+ margin: 0;
+ border: 0 none;
+}
+
+.x-date-menu {
+ padding: 0 !important;
+}
+
+.x-cycle-menu .x-menu-item-checked {
+ border: 1px dotted !important;
+ padding: 0;
+}
+
+.x-menu .x-menu-scroller {
+ width: 100%;
+ background-repeat: no-repeat;
+ background-position: center;
+ height: 8px;
+ line-height: 8px;
+ cursor: pointer;
+ margin: 0;
+ padding: 0;
+}
+
+.x-menu .x-menu-scroller-active {
+ height: 6px;
+ line-height: 6px;
+}
+
+.x-menu-list-item-indent {
+ padding-left: 27px !important;
+}
+
+.x-menu-text {
+
+ border-style: solid;
+ background: #D6E3F2;
+ border-color:#DAE6F4 #99bbe8 #99bbe8 #DAE6F4;
+ border-width: 1px;
+ margin:-2px -2px 0;
+ color:#15428b;
+ font:bold 10px tahoma,arial,verdana,sans-serif;
+ display:block;
+ padding:3px;
+}
+
+.x-menubar {
+ padding: 3px;
+ border-style: solid;
+ border-width: 0 0 1px 0;
+ cursor: default;
+ border-color: #a9bfd3;
+ background-color: #d0def0;
+ padding: 3px;
+ background-image: url(../images/default/toolbar/bg.gif);
+}
+
+.x-menubar-item {
+ padding: 1px 8px;
+ font: 12px arial, verdana, sans-serif;
+}
+
+.x-menubar-item-over {
+ background-color: #98c5f5;
+}
+
+.x-menubar-item-active {
+ background-color: #98c5f5;
+}.x-box-tl {
+ background: transparent no-repeat 0 0;
+ zoom:1;
+}
+.x-box-tc {
+ height: 8px;
+ background: transparent repeat-x 0 0;
+ overflow: hidden;
+}
+.x-box-tr {
+ background: transparent no-repeat right -8px;
+}
+.x-box-ml {
+ background: transparent repeat-y 0;
+ padding-left: 4px;
+ overflow: hidden;
+ zoom:1;
+}
+.x-box-mc {
+ background: repeat-x 0 -16px;
+ padding: 4px 10px;
+}
+.x-box-mc h3 {
+ margin: 0 0 4px 0;
+ zoom:1;
+}
+.x-box-mr {
+ background: transparent repeat-y right;
+ padding-right: 4px;
+ overflow: hidden;
+}
+.x-box-bl {
+ background: transparent no-repeat 0 -16px;
+ zoom:1;
+}
+.x-box-bc {
+ background: transparent repeat-x 0 -8px;
+ height: 8px;
+ overflow: hidden;
+}
+.x-box-br {
+ background: transparent no-repeat right -24px;
+}
+.x-box-tl, .x-box-bl {
+ padding-left: 8px;
+ overflow: hidden;
+}
+.x-box-tr, .x-box-br {
+ padding-right: 8px;
+ overflow: hidden;
+}
+.x-combo-list {
+ border:1px solid;
+ zoom:1;
+ overflow:hidden;
+ position: absolute;
+}
+.x-combo-list-inner {
+ overflow:auto;
+ position:relative;
+ zoom:1;
+ overflow-x:hidden;
+}
+.x-combo-list-hd {
+ border-bottom:1px solid;
+ padding:3px;
+}
+.x-resizable-pinned .x-combo-list-inner {
+ border-bottom:1px solid;
+}
+.x-combo-list-item {
+ padding:2px;
+ border:1px solid;
+ white-space: nowrap;
+ overflow:hidden;
+ text-overflow: ellipsis;
+}
+.x-combo-list .x-combo-selected{
+ border:1px dotted !important;
+ cursor:pointer;
+}
+.x-combo-list .x-toolbar {
+ border-top:1px solid;
+ border-bottom:0 none;
+}
+.x-panel {
+ border-style: solid;
+ border-width:0;
+ outline: 0 none;
+}
+.x-panel-header {
+ overflow:hidden;
+ zoom:1;
+ padding:5px 3px 4px 5px;
+ border:1px solid;
+ line-height: 15px;
+ background: transparent repeat-x 0 -1px;
+}
+.x-panel-body {
+ border:1px solid;
+ border-top:0 none;
+ overflow:hidden;
+ position: relative;
+}
+.x-panel-bbar .x-toolbar, .x-panel-tbar .x-toolbar {
+ border:1px solid;
+ border-top:0 none;
+ overflow:hidden;
+ padding:2px;
+}
+.x-panel-tbar-noheader .x-toolbar, .x-panel-mc .x-panel-tbar .x-toolbar {
+ border-top:1px solid;
+ border-bottom: 0 none;
+}
+.x-panel-body-noheader, .x-panel-mc .x-panel-body {
+ border-top:1px solid;
+}
+.x-panel-header {
+ overflow:hidden;
+ zoom:1;
+}
+.x-panel-tl .x-panel-header {
+ padding:5px 0 4px 0;
+ border:0 none;
+ background:transparent;
+ line-height: 15px;
+}
+.x-panel-tl .x-panel-icon, .x-window-tl .x-panel-icon {
+ padding-left:20px !important;
+ background-repeat:no-repeat;
+ background-position:0 4px;
+ zoom:1;
+}
+.x-panel-inline-icon {
+ width:16px;
+ height:16px;
+ background-repeat:no-repeat;
+ background-position:0 0;
+ vertical-align:middle;
+ margin-right:4px;
+ margin-top:-1px;
+ margin-bottom:-1px;
+}
+.x-panel-tc {
+ background: transparent repeat-x 0 0;
+ overflow:hidden;
+}
+.ext-strict .ext-ie7 .x-panel-tc {
+ overflow: visible;
+}
+.x-panel-tl {
+ background: transparent no-repeat 0 0;
+ padding-left:6px;
+ zoom:1;
+ border-bottom:1px solid;
+}
+.x-panel-tr {
+ background: transparent no-repeat right 0;
+ zoom:1;
+ padding-right:6px;
+}
+.x-panel-bc {
+ background: transparent repeat-x 0 bottom;
+ zoom:1;
+}
+.x-panel-bc .x-panel-footer {
+ zoom:1;
+}
+.x-panel-bl {
+ background: transparent no-repeat 0 bottom;
+ padding-left:6px;
+ zoom:1;
+}
+.x-panel-br {
+ background: transparent no-repeat right bottom;
+ padding-right:6px;
+ zoom:1;
+}
+.x-panel-mc {
+ border:0 none;
+ padding:0;
+ margin:0;
+ padding-top:6px;
+}
+.x-panel-mc .x-panel-body {
+ background:transparent;
+ border: 0 none;
+}
+.x-panel-ml {
+ background: repeat-y 0 0;
+ padding-left:6px;
+ zoom:1;
+}
+.x-panel-mr {
+ background: transparent repeat-y right 0;
+ padding-right:6px;
+ zoom:1;
+}
+.x-panel-bc .x-panel-footer {
+ padding-bottom:6px;
+}
+.x-panel-nofooter .x-panel-bc, .x-panel-nofooter .x-window-bc {
+ height:6px;
+ font-size:0;
+ line-height:0;
+}
+.x-panel-bwrap {
+ overflow:hidden;
+ zoom:1;
+ left:0;
+ top:0;
+}
+.x-panel-body {
+ overflow:hidden;
+ zoom:1;
+}
+.x-panel-collapsed .x-resizable-handle{
+ display:none;
+}
+.ext-gecko .x-panel-animated * {
+ overflow:hidden !important;
+}
+.x-plain-body {
+ overflow:hidden;
+}
+.x-plain-bbar .x-toolbar {
+ overflow:hidden;
+ padding:2px;
+}
+.x-plain-tbar .x-toolbar {
+ overflow:hidden;
+ padding:2px;
+}
+.x-plain-bwrap {
+ overflow:hidden;
+ zoom:1;
+}
+.x-plain {
+ overflow:hidden;
+}
+.x-tool {
+ overflow:hidden;
+ width:15px;
+ height:15px;
+ float:right;
+ cursor:pointer;
+ background:transparent no-repeat;
+ margin-left:2px;
+}
+.x-tool-toggle {
+ background-position:0 -60px;
+}
+.x-tool-toggle-over {
+ background-position:-15px -60px;
+}
+.x-panel-collapsed .x-tool-toggle {
+ background-position:0 -75px;
+}
+.x-panel-collapsed .x-tool-toggle-over {
+ background-position:-15px -75px;
+}
+.x-tool-close {
+ background-position:0 -0;
+}
+.x-tool-close-over {
+ background-position:-15px 0;
+}
+.x-tool-minimize {
+ background-position:0 -15px;
+}
+.x-tool-minimize-over {
+ background-position:-15px -15px;
+}
+.x-tool-maximize {
+ background-position:0 -30px;
+}
+.x-tool-maximize-over {
+ background-position:-15px -30px;
+}
+.x-tool-restore {
+ background-position:0 -45px;
+}
+.x-tool-restore-over {
+ background-position:-15px -45px;
+}
+.x-tool-gear {
+ background-position:0 -90px;
+}
+.x-tool-gear-over {
+ background-position:-15px -90px;
+}
+.x-tool-pin {
+ background-position:0 -135px;
+}
+.x-tool-pin-over {
+ background-position:-15px -135px;
+}
+.x-tool-unpin {
+ background-position:0 -150px;
+}
+.x-tool-unpin-over {
+ background-position:-15px -150px;
+}
+.x-tool-right {
+ background-position:0 -165px;
+}
+.x-tool-right-over {
+ background-position:-15px -165px;
+}
+.x-tool-left {
+ background-position:0 -180px;
+}
+.x-tool-left-over {
+ background-position:-15px -180px;
+}
+.x-tool-up {
+ background-position:0 -210px;
+}
+.x-tool-up-over {
+ background-position:-15px -210px;
+}
+.x-tool-down {
+ background-position:0 -195px;
+}
+.x-tool-down-over {
+ background-position:-15px -195px;
+}
+.x-tool-refresh {
+ background-position:0 -225px;
+}
+.x-tool-refresh-over {
+ background-position:-15px -225px;
+}
+.x-tool-minus {
+ background-position:0 -255px;
+}
+.x-tool-minus-over {
+ background-position:-15px -255px;
+}
+.x-tool-plus {
+ background-position:0 -240px;
+}
+.x-tool-plus-over {
+ background-position:-15px -240px;
+}
+.x-tool-search {
+ background-position:0 -270px;
+}
+.x-tool-search-over {
+ background-position:-15px -270px;
+}
+.x-tool-save {
+ background-position:0 -285px;
+}
+.x-tool-save-over {
+ background-position:-15px -285px;
+}
+.x-tool-help {
+ background-position:0 -300px;
+}
+.x-tool-help-over {
+ background-position:-15px -300px;
+}
+.x-tool-print {
+ background-position:0 -315px;
+}
+.x-tool-print-over {
+ background-position:-15px -315px;
+}
+.x-panel-ghost {
+ z-index:12000;
+ overflow:hidden;
+ position:absolute;
+ left:0;top:0;
+ opacity:.65;
+ -moz-opacity:.65;
+ filter:alpha(opacity=65);
+}
+.x-panel-ghost ul {
+ margin:0;
+ padding:0;
+ overflow:hidden;
+ font-size:0;
+ line-height:0;
+ border:1px solid;
+ border-top:0 none;
+ display:block;
+}
+.x-panel-ghost * {
+ cursor:move !important;
+}
+.x-panel-dd-spacer {
+ border:2px dashed;
+}
+.x-panel-btns {
+ padding:5px;
+ overflow:hidden;
+}
+.x-panel-btns-left .x-buttonbar {
+ clear:none;
+}
+.x-panel-btns-center{
+ text-align:center;
+}
+.x-panel-btns-center .x-toolbar-ct {
+ margin:0 auto;
+ text-align:left;
+ width:auto;
+}
+.x-panel-fbar td.x-toolbar-cell{
+ padding:0px;
+}
+.x-panel-fbar {
+ display: block;
+ padding:2px;
+ position:relative;
+ left:0;
+ top:0;
+ zoom:1;
+ overflow:hidden;
+}
+
+.x-panel-fbar .x-toolbar-cell {
+ vertical-align:middle;
+}
+
+.x-panel-fbar td {
+ vertical-align:middle;
+}
+.x-panel-btns .x-btn-focus .x-btn-left{
+ background-position:0 -147px;
+}
+.x-panel-btns .x-btn-focus .x-btn-right{
+ background-position:0 -168px;
+}
+.x-panel-btns .x-btn-focus .x-btn-center{
+ background-position:0 -189px;
+}
+.x-panel-btns .x-btn-over .x-btn-left{
+ background-position:0 -63px;
+}
+.x-panel-btns .x-btn-over .x-btn-right{
+ background-position:0 -84px;
+}
+.x-panel-btns .x-btn-over .x-btn-center{
+ background-position:0 -105px;
+}
+.x-panel-btns .x-btn-click .x-btn-center{
+ background-position:0 -126px;
+}
+.x-panel-btns .x-btn-click .x-btn-right{
+ background-position:0 -84px;
+}
+.x-panel-btns .x-btn-click .x-btn-left{
+ background-position:0 -63px;
+}
+.x-panel-fbar td,.x-panel-fbar span,.x-panel-fbar input,.x-panel-fbar div,.x-panel-fbar select,.x-panel-fbar label{
+ white-space: nowrap;
+}
+.x-window {
+ zoom:1;
+ -moz-outline: none;
+ outline: 0 none;
+}
+.x-window .x-resizable-handle {
+ opacity:0;
+ -moz-opacity:0;
+ filter:alpha(opacity=0);
+}
+.x-window-proxy {
+ border:1px solid;
+ z-index:12000;
+ overflow:hidden;
+ position:absolute;
+ left:0;top:0;
+ display:none;
+ opacity:.5;
+ -moz-opacity:.5;
+ filter:alpha(opacity=50);
+}
+.x-window-header {
+ overflow:hidden;
+ zoom:1;
+}
+.x-window-bwrap {
+ z-index:1;
+ position:relative;
+ zoom:1;
+ left:0;top:0;
+}
+.x-window-tl .x-window-header {
+ padding:5px 0 4px 0;
+}
+.x-window-header-text {
+ cursor:pointer;
+}
+.x-window-tc {
+ background: transparent repeat-x 0 0;
+ overflow:hidden;
+ zoom:1;
+}
+.x-window-tl {
+ background: transparent no-repeat 0 0;
+ padding-left:6px;
+ zoom:1;
+ z-index:1;
+ position:relative;
+}
+.x-window-tr {
+ background: transparent no-repeat right 0;
+ padding-right:6px;
+}
+.x-window-bc {
+ background: transparent repeat-x 0 bottom;
+ zoom:1;
+}
+.x-window-bc .x-window-footer {
+ padding-bottom:6px;
+ zoom:1;
+ font-size:0;
+ line-height:0;
+}
+.x-window-bl {
+ background: transparent no-repeat 0 bottom;
+ padding-left:6px;
+ zoom:1;
+}
+.x-window-br {
+ background: transparent no-repeat right bottom;
+ padding-right:6px;
+ zoom:1;
+}
+.x-window-mc {
+ border:1px solid;
+ padding:0;
+ margin:0;
+}
+.x-window-ml {
+ background: transparent repeat-y 0 0;
+ padding-left:6px;
+ zoom:1;
+}
+.x-window-mr {
+ background: transparent repeat-y right 0;
+ padding-right:6px;
+ zoom:1;
+}
+.x-window-body {
+ overflow:hidden;
+}
+.x-window-bwrap {
+ overflow:hidden;
+}
+.x-window-maximized .x-window-bl, .x-window-maximized .x-window-br,
+ .x-window-maximized .x-window-ml, .x-window-maximized .x-window-mr,
+ .x-window-maximized .x-window-tl, .x-window-maximized .x-window-tr {
+ padding:0;
+}
+.x-window-maximized .x-window-footer {
+ padding-bottom:0;
+}
+.x-window-maximized .x-window-tc {
+ padding-left:3px;
+ padding-right:3px;
+}
+.x-window-maximized .x-window-mc {
+ border-left:0 none;
+ border-right:0 none;
+}
+.x-window-tbar .x-toolbar, .x-window-bbar .x-toolbar {
+ border-left:0 none;
+ border-right: 0 none;
+}
+.x-window-bbar .x-toolbar {
+ border-top:1px solid;
+ border-bottom:0 none;
+}
+.x-window-draggable, .x-window-draggable .x-window-header-text {
+ cursor:move;
+}
+.x-window-maximized .x-window-draggable, .x-window-maximized .x-window-draggable .x-window-header-text {
+ cursor:default;
+}
+.x-window-body {
+ background:transparent;
+}
+.x-panel-ghost .x-window-tl {
+ border-bottom:1px solid;
+}
+.x-panel-collapsed .x-window-tl {
+ border-bottom:1px solid;
+}
+.x-window-maximized-ct {
+ overflow:hidden;
+}
+.x-window-sizing-ghost ul {
+ border:0 none !important;
+}
+.x-dlg-focus{
+ -moz-outline:0 none;
+ outline:0 none;
+ width:0;
+ height:0;
+ overflow:hidden;
+ position:absolute;
+ top:0;
+ left:0;
+}
+.x-dlg-mask{
+ z-index:10000;
+ display:none;
+ position:absolute;
+ top:0;
+ left:0;
+ -moz-opacity: 0.5;
+ opacity:.50;
+ filter: alpha(opacity=50);
+}
+body.ext-ie6.x-body-masked select {
+ visibility:hidden;
+}
+body.ext-ie6.x-body-masked .x-window select {
+ visibility:visible;
+}
+.x-window-plain .x-window-mc {
+ border: 1px solid;
+}
+.x-window-plain .x-window-body {
+ border: 1px solid;
+ background:transparent !important;
+}
+.x-html-editor-wrap {
+ border:1px solid;
+}
+
+.x-html-editor-tb .x-btn-text {
+ background:transparent no-repeat;
+}
+
+.x-html-editor-tip .x-tip-bd .x-tip-bd-inner {
+ padding:5px;
+ padding-bottom:1px;
+}
+
+.x-html-editor-tb .x-toolbar {
+ position:static !important;
+}.x-panel-noborder .x-panel-body-noborder {
+ border-width:0;
+}
+.x-panel-noborder .x-panel-header-noborder {
+ border-width:0 0 1px;
+ border-style:solid;
+}
+.x-panel-noborder .x-panel-tbar-noborder .x-toolbar {
+ border-width:0 0 1px;
+ border-style:solid;
+}
+.x-panel-noborder .x-panel-bbar-noborder .x-toolbar {
+ border-width:1px 0 0 0;
+ border-style:solid;
+}
+.x-window-noborder .x-window-mc {
+ border-width:0;
+}
+.x-window-plain .x-window-body-noborder {
+ border-width:0;
+}
+.x-tab-panel-noborder .x-tab-panel-body-noborder {
+ border-width:0;
+}
+.x-tab-panel-noborder .x-tab-panel-header-noborder {
+ border-width: 0 0 1px 0;
+}
+.x-tab-panel-noborder .x-tab-panel-footer-noborder {
+ border-width: 1px 0 0 0;
+}
+.x-tab-panel-bbar-noborder .x-toolbar {
+ border-width: 1px 0 0 0;
+ border-style:solid;
+}
+.x-tab-panel-tbar-noborder .x-toolbar {
+ border-width:0 0 1px;
+ border-style:solid;
+}
+.x-border-panel {
+ position:absolute !important;
+ left:0;
+ top:0;
+}
+.x-tool-collapse-south {
+ background-position:0 -195px;
+}
+.x-tool-collapse-south-over {
+ background-position:-15px -195px;
+}
+.x-tool-collapse-north {
+ background-position:0 -210px;
+}
+.x-tool-collapse-north-over {
+ background-position:-15px -210px;
+}
+.x-tool-collapse-west {
+ background-position:0 -180px;
+}
+.x-tool-collapse-west-over {
+ background-position:-15px -180px;
+}
+.x-tool-collapse-east {
+ background-position:0 -165px;
+}
+.x-tool-collapse-east-over {
+ background-position:-15px -165px;
+}
+.x-tool-expand-south {
+ background-position:0 -210px;
+}
+.x-tool-expand-south-over {
+ background-position:-15px -210px;
+}
+.x-tool-expand-north {
+ background-position:0 -195px;
+}
+.x-tool-expand-north-over {
+ background-position:-15px -195px;
+}
+.x-tool-expand-west {
+ background-position:0 -165px;
+}
+.x-tool-expand-west-over {
+ background-position:-15px -165px;
+}
+.x-tool-expand-east {
+ background-position:0 -180px;
+}
+.x-tool-expand-east-over {
+ background-position:-15px -180px;
+}
+.x-tool-expand-north, .x-tool-expand-south {
+ float:right;
+ margin:3px;
+}
+.x-tool-expand-east, .x-tool-expand-west {
+ float:none;
+ margin:3px auto;
+}
+.x-accordion-hd .x-tool-toggle {
+ background-position:0 -255px;
+}
+.x-accordion-hd .x-tool-toggle-over {
+ background-position:-15px -255px;
+}
+.x-panel-collapsed .x-accordion-hd .x-tool-toggle {
+ background-position:0 -240px;
+}
+.x-panel-collapsed .x-accordion-hd .x-tool-toggle-over {
+ background-position:-15px -240px;
+}
+.x-accordion-hd {
+ padding-top:4px;
+ padding-bottom:3px;
+ border-top:0 none;
+ background: transparent repeat-x 0 -9px;
+}
+.x-layout-collapsed{
+ position:absolute;
+ left:-10000px;
+ top:-10000px;
+ visibility:hidden;
+ width:20px;
+ height:20px;
+ overflow:hidden;
+ border:1px solid;
+ z-index:20;
+}
+.ext-border-box .x-layout-collapsed{
+ width:22px;
+ height:22px;
+}
+.x-layout-collapsed-over{
+ cursor:pointer;
+}
+.x-layout-collapsed-west .x-layout-collapsed-tools, .x-layout-collapsed-east .x-layout-collapsed-tools{
+ position:absolute;
+ top:0;
+ left:0;
+ width:20px;
+ height:20px;
+}
+.x-layout-split{
+ position:absolute;
+ height:5px;
+ width:5px;
+ line-height:1px;
+ font-size:1px;
+ z-index:3;
+ background-color:transparent;
+}
+.ext-strict .ext-ie6 .x-layout-split{
+ background-color: #fff !important;
+ filter: alpha(opacity=1);
+}
+.x-layout-split-h{
+ background-image:url(../images/default/s.gif);
+ background-position: left;
+}
+.x-layout-split-v{
+ background-image:url(../images/default/s.gif);
+ background-position: top;
+}
+.x-column-layout-ct {
+ overflow:hidden;
+ zoom:1;
+}
+.x-column {
+ float:left;
+ padding:0;
+ margin:0;
+ overflow:hidden;
+ zoom:1;
+}
+.x-column-inner {
+ overflow:hidden;
+ zoom:1;
+}
+.x-layout-mini {
+ position:absolute;
+ top:0;
+ left:0;
+ display:block;
+ width:5px;
+ height:35px;
+ cursor:pointer;
+ opacity:.5;
+ -moz-opacity:.5;
+ filter:alpha(opacity=50);
+}
+.x-layout-mini-over, .x-layout-collapsed-over .x-layout-mini{
+ opacity:1;
+ -moz-opacity:1;
+ filter:none;
+}
+.x-layout-split-west .x-layout-mini {
+ top:48%;
+}
+.x-layout-split-east .x-layout-mini {
+ top:48%;
+}
+.x-layout-split-north .x-layout-mini {
+ left:48%;
+ height:5px;
+ width:35px;
+}
+.x-layout-split-south .x-layout-mini {
+ left:48%;
+ height:5px;
+ width:35px;
+}
+.x-layout-cmini-west .x-layout-mini {
+ top:48%;
+}
+.x-layout-cmini-east .x-layout-mini {
+ top:48%;
+}
+.x-layout-cmini-north .x-layout-mini {
+ left:48%;
+ height:5px;
+ width:35px;
+}
+.x-layout-cmini-south .x-layout-mini {
+ left:48%;
+ height:5px;
+ width:35px;
+}
+.x-layout-cmini-west, .x-layout-cmini-east {
+ border:0 none;
+ width:5px !important;
+ padding:0;
+ background:transparent;
+}
+.x-layout-cmini-north, .x-layout-cmini-south {
+ border:0 none;
+ height:5px !important;
+ padding:0;
+ background:transparent;
+}
+.x-viewport, .x-viewport body {
+ margin: 0;
+ padding: 0;
+ border: 0 none;
+ overflow: hidden;
+ height: 100%;
+}
+.x-abs-layout-item {
+ position:absolute !important;
+ left:0;
+ top:0;
+}
+.x-abs-layout-container {
+ position:relative;
+}
+.ext-ie input.x-abs-layout-item, .ext-ie textarea.x-abs-layout-item {
+ margin:0;
+}
+.x-box-layout-ct {
+ overflow:hidden;
+ zoom:1;
+}
+.x-box-inner {
+ overflow:hidden;
+ zoom:1;
+ position:relative;
+ left:0;
+ top:0;
+}
+.x-box-item {
+ position:absolute !important;
+ left:0;
+ top:0;
+}
+.x-border-layout-ct {
+ position: relative;
+}
+.x-progress-wrap {
+ border:1px solid;
+ overflow:hidden;
+}
+.x-progress-inner {
+ height:18px;
+ background:repeat-x;
+ position:relative;
+}
+.x-progress-bar {
+ height:18px;
+ float:left;
+ width:0;
+ background: repeat-x left center;
+ border-top:1px solid;
+ border-bottom:1px solid;
+ border-right:1px solid;
+}
+.x-progress-text {
+ padding:1px 5px;
+ overflow:hidden;
+ position:absolute;
+ left:0;
+ text-align:center;
+}
+.x-progress-text-back {
+ line-height:16px;
+}
+.ext-ie .x-progress-text-back {
+ line-height:15px;
+}
+.x-slider {
+ zoom:1;
+ -moz-outline: none;
+ outline: 0 none;
+}
+.x-slider-thumb {
+ line-height: 0px;
+ font-size: 0px;
+ position: absolute;
+ background:transparent no-repeat 0 0;
+}
+.x-slider-inner {
+ position:relative;
+ left:0;
+ top:0;
+ overflow:visible;
+ zoom:1;
+}
+.x-slider-focus {
+ position:absolute;
+ left:0;
+ top:0;
+ width:1px;
+ height:1px;
+ line-height:1px;
+ font-size:1px;
+ -moz-outline:0 none;
+ outline:0 none;
+ -moz-user-select: none;
+ -khtml-user-select: none;
+ -webkit-user-select: ignore
+ display:block;
+ overflow:hidden;
+}
+.x-slider-horz {
+ padding-left:7px;
+ background:transparent no-repeat 0 -22px;
+}
+.x-slider-horz .x-slider-end {
+ padding-right:7px;
+ zoom:1;
+ background:transparent no-repeat right -44px;
+}
+.x-slider-horz .x-slider-inner {
+ background:transparent repeat-x 0 0;
+ height:22px;
+}
+.x-slider-horz .x-slider-thumb {
+ width:14px;
+ height:15px;
+ left:0;
+ top:3px;
+}
+.x-slider-horz .x-slider-thumb-over {
+ background-position: -14px -15px;
+}
+.x-slider-horz .x-slider-thumb-drag {
+ background-position: -28px -30px;
+}
+.x-slider-vert {
+ padding-top:7px;
+ background:transparent no-repeat -44px 0;
+ width:22px;
+}
+.x-slider-vert .x-slider-end {
+ padding-bottom:7px;
+ zoom:1;
+ background:transparent no-repeat -22px bottom;
+}
+.x-slider-vert .x-slider-inner {
+ background:transparent repeat-y 0 0;
+}
+.x-slider-vert .x-slider-thumb {
+ width:15px;
+ height:14px;
+ left:3px;
+ bottom:0;
+}
+.x-slider-vert .x-slider-thumb-over {
+ background-position: -15px -14px;
+}
+.x-slider-vert .x-slider-thumb-drag {
+ background-position: -30px -28px;
+}
+.x-window-dlg .x-window-body {
+ border:0 none !important;
+ padding:5px 10px;
+ overflow:hidden !important;
+}
+.x-window-dlg .x-window-mc {
+ border:0 none !important;
+}
+.x-window-dlg .ext-mb-input {
+ margin-top:4px;
+ width:95%;
+}
+.x-window-dlg .ext-mb-textarea {
+ margin-top:4px;
+}
+.x-window-dlg .x-progress-wrap {
+ margin-top:4px;
+}
+.ext-ie .x-window-dlg .x-progress-wrap {
+ margin-top:6px;
+}
+.x-window-dlg .x-msg-box-wait {
+ background:transparent no-repeat left;
+ display:block;
+ width:300px;
+ padding-left:18px;
+ line-height:18px;
+}
+.x-window-dlg .ext-mb-icon {
+ float:left;
+ width:47px;
+ height:32px;
+}
+.ext-ie .x-window-dlg .ext-mb-icon {
+ width:44px;
+}
+.x-window-dlg .x-dlg-icon .ext-mb-content{
+ zoom: 1; margin-left: 47px;
+}
+.x-window-dlg .ext-mb-info, .x-window-dlg .ext-mb-warning, .x-window-dlg .ext-mb-question, .x-window-dlg .ext-mb-error {
+ background:transparent no-repeat top left;
+}
+.ext-gecko2 .ext-mb-fix-cursor {
+ overflow:auto;
+}
+.arrow-top {
+ background: url(../images/gxt/icons/top2.gif) no-repeat center left !important;
+}
+.arrow-bottom {
+ background: url(../images/gxt/icons/bottom2.gif) no-repeat center left !important;
+}
+.arrow-up {
+ background: url(../images/gxt/icons/up2.gif) no-repeat center left !important;
+}
+.arrow-down {
+ background: url(../images/gxt/icons/down2.gif) no-repeat center left !important;
+}
+.arrow-left {
+ background: url(../images/gxt/icons/left2.gif) no-repeat center left !important;
+}
+.arrow-double-left {
+ background: url(../images/gxt/icons/doubleleft2.gif) no-repeat center left !important;
+}
+.arrow-right {
+ background: url(../images/gxt/icons/right2.gif) no-repeat center left !important;
+}
+.arrow-double-right {
+ background: url(../images/gxt/icons/doubleright2.gif) no-repeat center left !important;
+}
+.x-info {
+ border-style: solid;
+ border-color: #99bbe8;
+ border-width: 0;
+ z-index: 99999999;
+}
+
+.x-info-header {
+ overflow: hidden;
+ zoom: 1;
+ color: black;
+ font: bold 13px tahoma, arial, verdana, sans-serif;
+ padding: 5px 3px 4px 5px;
+ line-height: 15px;
+ background: transparent url(../images/default/panel/white-top-bottom.gif) repeat-x 0 -1px;
+}
+
+.x-info-body {
+ border-top: 0 none;
+ overflow: hidden;
+ background: white;
+ position: relative; /* added for item scroll positioning */
+}
+
+.x-info-header {
+ overflow: hidden;
+ zoom: 1;
+}
+
+.x-info-tl .x-info-header {
+ color: #555555;
+ font-family: tahoma, arial, sans-serif;
+ font-size: 13px;
+ font-size-adjust: none;
+ font-stretch: normal;
+ font-style: normal;
+ font-variant: normal;
+ font-weight: bold;
+ line-height: normal;
+ padding: 5px 0 4px 0;
+ border: 0 none;
+ background: transparent;
+}
+
+.x-info-tl .x-info-icon,.x-window-tl .x-info-icon {
+ padding-left: 20px !important;
+ background-repeat: no-repeat;
+ background-position: 0 4px;
+ zoom: 1;
+}
+
+.x-info-inline-icon {
+ width: 16px;
+ height: 16px;
+ background-repeat: no-repeat;
+ background-position: 0 0;
+ vertical-align: middle;
+ margin-right: 4px;
+ margin-top: -1px;
+ margin-bottom: -1px;
+}
+
+.x-info-tc {
+ background: transparent url(../images/gxt/info/top-bottom.gif) repeat-x 0 0;
+ overflow: hidden;
+}
+
+/* fix ie7 strict mode bug */
+.ext-ie7 .x-info-tc {
+ overflow: visible;
+}
+
+.x-info-tl {
+ background: transparent url(../images/gxt/info/corners-sprite.gif) no-repeat 0 0;
+ padding-left: 6px;
+ zoom: 1;
+}
+
+.x-info-tr {
+ background: transparent url(../images/gxt/info/corners-sprite.gif) no-repeat right 0;
+ zoom: 1;
+ padding-right: 6px;
+}
+
+.x-info-bc {
+ background: transparent url(../images/default/panel/top-bottom.gif) repeat-x 0 bottom;
+ zoom: 1;
+ font-size: 0px;
+}
+
+.x-info-bc .x-info-footer {
+ zoom: 1;
+}
+
+.x-info-bl {
+ background: transparent url(../images/default/panel/corners-sprite.gif) no-repeat 0 bottom;
+ padding-left: 6px;
+ zoom: 1;
+}
+
+.x-info-br {
+ background: transparent url(../images/default/panel/corners-sprite.gif) no-repeat right bottom;
+ padding-right: 6px;
+ zoom: 1;
+}
+
+.x-info-mc {
+ border: 0 none;
+ padding: 0;
+ margin: 0;
+ font: normal 11px tahoma, arial, helvetica, sans-serif;
+ background: #dfe8f6;
+}
+
+.x-info-mc .x-info-body {
+ background: transparent;
+ border: 0 none;
+}
+
+.x-info-ml {
+ background: #fff url(../images/default/panel/left-right.gif) repeat-y 0 0;
+ padding-left: 6px;
+ zoom: 1;
+}
+
+.x-info-mr {
+ background: transparent url(../images/default/panel/left-right.gif) repeat-y right 0;
+ padding-right: 6px;
+ zoom: 1;
+}
+
+.x-info-bc .x-info-footer {
+ padding-bottom: 6px;
+}
+
+.x-info-nofooter .x-info-bc,.x-panel-nofooter .x-info-bc {
+ height: 6px;
+ font-size: 0;
+ line-height: 0;
+}
+
+.x-info-bwrap {
+ overflow: hidden;
+ zoom: 1;
+}
+
+.x-info-body {
+ overflow: hidden;
+ zoom: 1;
+ color: #555555;
+ font-family: tahoma, arial, sans-serif;
+ font-size: 12px;
+ font-size-adjust: none;
+ font-style: normal;
+ font-variant: normal;
+ font-weight: normal;
+}.x-combo-over {
+ border: 1px dotted #B5B4B4 !important;
+ background: #F1F1F1;
+ cursor: pointer;
+}
+
+.my-list {
+ border: 1px solid #99BBE8;
+ -moz-outline: none;
+ outline: 0 none;
+ -moz-user-focus: normal;
+ background-color: white;
+ font-family: "Myriad Pro", "Myriad Web", "Tahoma", "Helvetica", "Arial", sans-serif;
+}
+
+.my-list-notchecked {
+ background: url(../images/gxt/tree/notchecked.gif) no-repeat 0px 0px !important;
+ margin: 3px 0pt 0pt 0px;
+}
+
+.my-list-checked {
+ background: url(../images/gxt/tree/checked.gif) no-repeat 0px 0px !important;
+ margin: 3px 0pt 0pt 0px;
+}
+
+.ext-ie .my-list-notchecked {
+ margin: 2px 0pt 0pt 0px;
+}
+
+.ext-ie .my-list-checked {
+ margin: 2px 0pt 0pt 0px;
+}
+
+.my-list-flat {
+ border: 1px solid #6593cf;
+ -moz-outline: none;
+ outline: 0 none;
+ -moz-user-focus: normal;
+ background-color: white;
+ cursor: default;
+}
+
+.my-list-item {
+ cursor: pointer;
+ -moz-outline: none;
+ outline: 0 none;
+ -moz-user-focus: normal;
+}
+
+.my-list-flat .my-list-item {
+ height: 19px;
+ border: 1px solid white;
+}
+
+.my-list-flat .my-list-item-over {
+ background-color: #F1F1F1;
+ border: 1px dotted #B5B4B4;
+}
+
+.my-list-flat .my-list-item-sel {
+ background-color: #DFE8F6;
+ border: 1px dotted #9EB8ED;
+}
+
+.my-list-flat .my-list-item-over .my-list-item-l {
+ background: none;
+}
+
+.my-list-flat .my-list-item-over .my-list-item-icon,.my-list-flat .my-list-item-over .my-list-item-ml,.my-list-flat .my-list-item-over .my-list-item-c
+ {
+ background: none;
+}
+
+.my-list-flat .my-list-item-over .my-list-item-r {
+ background: none;
+}
+
+.my-list-flat .my-list-item-sel .my-list-item-l {
+ background: none;
+}
+
+.my-list-flat .my-list-item-sel .my-list-item-icon,.my-list-flat .my-list-item-sel .my-list-item-ml,.my-list-flat .my-list-item-sel .my-list-item-c
+ {
+ background: none;
+}
+
+.my-list-flat .my-list-item-sel .my-list-item-r {
+ background: none;
+}
+
+.my-list-item-text {
+ font-size: 11px;
+ padding-top: 3px;
+ padding-left: 2px;
+ white-space: nowrap;
+ overflow: hidden;
+ line-height: 19px;
+}
+
+.my-list-item-l div {
+ width: 5px;
+}
+
+.my-list-item-ml {
+ width: 18px;
+}
+
+.my-list-item-c {
+ width: 100%;
+}
+
+.my-list-item-r div {
+ width: 3px;
+}
+
+.my-list-item-over .my-list-item-l {
+ background: url(../images/gxt/shared/select-19-bg.gif) no-repeat left -57px;
+}
+
+.my-list-item-over .my-list-item-icon,.my-list-item-over .my-list-item-check,.my-list-item-over .my-list-item-c
+ {
+ background: url(../images/gxt/shared/select-19-bg.gif) repeat-x left -95px;
+}
+
+.my-list-item-over .my-list-item-r {
+ background: url(../images/gxt/shared/select-19-bg.gif) no-repeat right -76px;
+}
+
+.my-list-item-sel .my-list-item-l {
+ background: url(../images/gxt/shared/select-19-bg.gif) no-repeat left 0px;
+}
+
+.my-list-item-sel .my-list-item-icon,.my-list-item-sel .my-list-item-check,.my-list-item-sel .my-list-item-c
+ {
+ background: url(../images/gxt/shared/select-19-bg.gif) left -38px;
+}
+
+.my-list-item-sel .my-list-item-r {
+ background: url(../images/gxt/shared/select-19-bg.gif) no-repeat right -19px;
+}.x-view {
+ -moz-outline: none;
+ -moz-user-focus: normal;
+ outline: 0 none;
+ background-color: white;
+ cursor: default;
+ border: 1px solid #98C0F4;
+ overflow: auto;
+ padding: 0px;
+ zoom: 1;
+}
+
+.x-view-item {
+ border: 1px solid #FFFFFF;
+ font-family: tahoma, arial, helvetica, sans-serif;
+ font-size: 12px;
+ font-size-adjust: none;
+ font-stretch: normal;
+ font-style: normal;
+ font-variant: normal;
+ font-weight: normal;
+ line-height: normal;
+ overflow: hidden;
+ padding: 2px;
+ white-space: nowrap;
+}
+
+.x-view-highlightrow {
+ border: 1px dotted #545352 !important;
+}
+
+.x-view-item-over {
+ background: #efefef url(../images/default/grid/row-over.gif) repeat-x left top;
+ border: 1px dotted #dddddd !important;
+ cursor: pointer;
+}
+
+.x-view-item-sel {
+ background: #DFE8F6 none repeat scroll 0%;
+ border: 1px dotted #A3BAE9 !important;
+ cursor: pointer;
+}
+.x-view-item-check {
+ padding: 0px;
+}
+.x-view-item-check td {
+ font-family: tahoma, arial, helvetica, sans-serif;
+ font-size: 12px;
+ font-size-adjust: none;
+ font-stretch: normal;
+ font-style: normal;
+ font-variant: normal;
+ font-weight: normal;
+ line-height: normal;
+ white-space: nowrap;
+ vertical-align: middle;
+ padding-left: 1px;
+}
+
+.x-splitbar-shim {
+ filter: alpha(opacity = 1);
+ opacity: 0;
+ position: absolute;
+ width: 100%;
+ height: 100%;
+ z-index: 10;
+ background-color: white;
+ -moz-user-select: none;
+ -khtml-user-select: none;
+ user-select: none;
+ -moz-outline: none;
+ -moz-user-focus: normal;
+ outline: 0 none;
+}
+
+.x-vsplitbar {
+ background: url(../images/default/s.gif);
+ position: absolute;
+ z-index: 3;
+ cursor: e-resize;
+ cursor: col-resize;
+}
+
+.x-hsplitbar {
+ background: url(../images/default/s.gif);
+ position: absolute;
+ font-size: 1px;
+ line-height: 1px;
+ z-index: 3;
+ cursor: s-resize;
+ cursor: row-resize;
+}
+
+.x-splitbar-proxy {
+ position: absolute;
+ background-color: #929090;
+ font-size: 1px;
+ line-height: 1px;
+ z-index: 200;
+}
+
+.my-splitbar-shim {
+ filter: alpha(opacity = 1);
+ opacity: 0;
+ position: absolute;
+ width: 100%;
+ height: 100%;
+ z-index: 10;
+ background-color: white;
+ -moz-user-select: none;
+ -khtml-user-select: none;
+ user-select: none;
+ -moz-outline: none;
+ -moz-user-focus: normal;
+ outline: 0 none;
+}
+
+.my-splitbar-transparent {
+ background: none;
+ font-size: 1px;
+ line-height: 1px;
+ z-index: 2000;
+}
+
+.my-splitbar-proxy {
+ position: absolute;
+ background-color: #929090;
+ font-size: 1px;
+ line-height: 1px;
+ z-index: 200;
+}.x-status {
+ padding: 0 4px;
+ height: 21px;
+ line-height: 21px !important;
+ cursor: default;
+}
+.x-status .x-status-text{
+ padding: 2px;
+ line-height: 21px !important;
+}
+.x-status-icon {
+ padding-left: 25px !important;
+ background: transparent no-repeat left center;
+}
+.x-status-busy {
+ background-image: url(../images/default/grid/loading.gif);
+}
+.x-status-text-panel {
+ border: 1px solid;
+ border-color: #99bbe8 #fff #fff #99bbe8;
+}
+.my-tbl {
+ border: 1px solid #99BBE8;
+ cursor: default;
+ background-color: white;
+ overflow: hidden;
+ -moz-outline: none;
+ -moz-user-focus: normal;
+ outline: 0 none;
+ font-family: arial, tahoma, helvetica, sans-serif;
+ font-size: 11px;
+ table-layout: fixed;
+}
+
+.my-tbl-col-overflow {
+ overflow: hidden;
+}
+
+.ext-ie .my-tbl-col-overflow {
+
+}
+
+.my-tbl-col-text {
+ color: black;
+ padding: 5px 4px 0 4px;
+ display: block;
+ white-space: nowrap;
+ font-family: arial, tahoma, helvetica, sans-serif;
+ font-size: 11px;
+}
+
+.my-tbl-col {
+ border-right: 1px solid #D5D5D5;
+ background: url(../images/gxt/table/vs-column-bg.gif) repeat-x;
+}
+
+.my-tbl-col-splitter {
+ position: absolute;
+ top: 0;
+ width: 6px;
+ z-index: 100;
+ height: 100%;
+ right: 0px;
+}
+
+.my-tbl-col-over {
+ background: url(../images/gxt/table/vs-column-bg.gif) repeat-x 0px -24px;
+}
+
+.my-tbl-col-sort {
+ background-position: 0px -48px;
+}
+
+.my-icon-asc {
+ background-image: url(../images/gxt/icons/hmenu-asc.gif) !important;
+}
+
+.my-icon-desc {
+ background-image: url(../images/gxt/icons/hmenu-desc.gif) !important;
+}
+
+.my-tbl-col-asc {
+ background: url(../images/gxt/table/vsort-asc.gif) no-repeat 50% top;
+}
+
+.my-tbl-col-desc {
+ background: url(../images/gxt/table/vsort-desc.gif) no-repeat 50% top;
+}
+
+.my-tbl-col-splitter {
+ background: none;
+}
+
+.my-tbl-data {
+ background-color: white;
+ overflow: hidden;
+ -moz-outline: none;
+ -moz-user-focus: normal;
+ outline: 0 none;
+}
+
+.my-tbl-item {
+ border-top: 1px solid white;
+ border-bottom: 1px solid white;
+ border-bottom: 1px solid #EDEDED;
+ cursor: default;
+ -moz-outline: none;
+ -moz-user-focus: normal;
+ outline: 0 none;
+}
+
+.my-tbl-item table {
+ -moz-outline: none;
+ -moz-user-focus: normal;
+ table-layout: fixed;
+ outline: 0 none;
+}
+
+.my-tbl-data .my-tbl-item-cell {
+ -moz-outline: none;
+ -moz-user-focus: normal;
+ outline: 0 none;
+}
+
+.my-tbl-item td {
+ -moz-user-select: none;
+ -moz-outline: none;
+ -moz-user-focus: normal;
+ outline: 0 none;
+}
+
+.my-tbl-vlines .my-tbl-data .my-tbl-item-cell-overflow {
+ border-right: 1px solid #EDEDED;
+}
+
+.my-tbl-data .my-tbl-item-cell-overflow {
+ white-space: nowrap;
+ overflow: hidden;
+ -moz-outline: none;
+ -moz-user-focus: normal;
+ outline: 0 none;
+}
+
+.my-tbl-data .my-tbl-item-cell-text {
+ padding: 3px 4px;
+ font-family: arial, tahoma, helvetica, sans-serif;
+ font-size: 11px;
+ -moz-outline: none;
+ -moz-user-focus: normal;
+ outline: 0 none;
+}
+
+.my-tbl-data .my-tbl-item-cell-widget {
+ padding: 1px 4px;
+}
+
+.my-tbl-data tr {
+ overflow: hidden;
+}
+
+.my-tbl-item-over {
+ border-top: 1px solid #dddddd;
+ border-bottom: 1px solid #dddddd;
+ background: #efefef url(../images/default/grid/row-over.gif) repeat-x left top;
+}
+
+.my-tbl-item-sel {
+ background-image: none !important;
+ background-color: #D9E1ED !important;
+ border-top: 1px dotted #9EB8ED !important;
+ border-bottom: 1px dotted #9EB8ED !important;
+}
+
+.ext-ie .my-tbl TD .x-form-text {
+ POSITION: static;
+ TOP: 0px;
+}.tree-folder {
+ background: url(../images/gxt/icons/folder-closed.gif) no-repeat -1px -1px;
+}
+
+.tree-folder-open {
+ background: url(../images/gxt/icons/folder.gif) no-repeat -1px -1px;
+}
+
+.my-treetbl-tree {
+ cursor: default;
+}
+
+.my-treetblitem,.my-treetblitem table,.my-treetblitem table td {
+ -moz-outline: none;
+ -moz-user-focus: normal;
+ outline: 0 none;
+}
+
+.my-treetblitem td {
+ height: 19px;
+}
+
+.my-treetbl-indent {
+ line-height: 1px;
+ font-size: 1px;
+}
+
+.my-treetbl-joint div {
+ width: 15px;
+ height: 19px;
+ line-height: 1px;
+ font-size: 1px;
+}
+
+.my-treetbl-left,.my-treetbl-left div,.my-treetbl-right {
+ line-height: 1px;
+ font-size: 1px;
+ width: 3px;
+}
+
+.my-treetbl-left div,.my-treetbl-right div {
+ width: 3px;
+}
+
+.my-treetbl-check div {
+ width: 17px;
+ height: 19px;
+ line-height: 1px;
+ font-size: 1px;
+ display: block;
+}
+
+.my-treetbl-icon div {
+ width: 16px;
+ height: 16px;
+ margin-top: 1px;
+ cursor: pointer;
+ background-repeat: no-repeat;
+ background-position: center;
+}
+
+.my-ie .my-treetbl-icon {
+ padding-top: 2px;
+}
+
+.my-ie .my-treetbl-icon div {
+ position: static;
+}
+
+.my-treetbl-item-text span {
+ font-family: arial, tahoma, helvetica, sans-serif;
+ font-size: 12px;
+ white-space: nowrap;
+ padding-left: 3px;
+ padding-right: 3px;
+ display: block;
+ height: 15px;
+ cursor: pointer;
+}
+
+.my-treetbl-over .my-treetbl-left {
+ background: url(../images/gxt/shared/select-19-bg.gif) no-repeat left -57px;
+}
+
+.my-treetbl-over .my-treetbl-right {
+ background: url(../images/gxt/shared/select-19-bg.gif) no-repeat right -76px;
+}
+
+.my-treetbl-over .my-treetbl-check,.my-treetbl-over .my-treetbl-icon,.my-treetbl-over .my-treetbl-item-text
+ {
+ background: url(../images/gxt/shared/select-19-bg.gif) left -95px;
+}
+
+.my-treetbl-sel .my-treetbl-left {
+ background: url(../images/gxt/shared/select-19-bg.gif) no-repeat left 0px;
+}
+
+.my-treetbl-sel .my-treetbl-right {
+ background: url(../images/gxt/shared/select-19-bg.gif) no-repeat right -19px;
+}
+
+.my-treetbl-sel .my-treetbl-check,.my-treetbl-sel .my-treetbl-icon,.my-treetbl-sel .my-treetbl-item-text
+ {
+ background: url(../images/gxt/shared/select-19-bg.gif) left -38px;
+}
+
+.my-treetbl-close {
+ background: url(../images/gxt/tree/vnode_transparent.gif) no-repeat 0px 1px;
+}
+
+.my-treetbl-open {
+ background: url(../images/gxt/tree/vnode_transparent.gif) no-repeat 0px -32px;
+}
+
+.my-treetbl-joint-over .my-treetbl-open {
+ background: url(../images/gxt/tree/vnode_transparent.gif) no-repeat 0px -48px;
+}
+
+.my-treetbl-joint-over .my-treetbl-close {
+ background: url(../images/gxt/tree/vnode_transparent.gif) no-repeat 0px -15px;
+}
+
+.my-treetbl-notchecked {
+ background: url(../images/gxt/tree/notchecked.gif) no-repeat 0px 50%;
+}
+
+.my-treetbl-checked {
+ background: url(../images/gxt/tree/checked.gif) no-repeat 0px 50%;
+}
+
+.my-treetbl-loading .tree-folder {
+ background: url(../images/gxt/icons/wait.gif) no-repeat 0px -1px;
+}
+
+.my-treetbl-loading .my-treetbl-item-text span {
+ font-style: italic;
+}
+
+.my-treetbl {
+ border: 1px solid #99BBE8;
+ cursor: default;
+ background-color: white;
+ overflow: hidden;
+ -moz-outline: none;
+ -moz-user-focus: normal;
+ outline: 0 none;
+}
+
+.my-treetbl-col-overflow {
+ overflow: hidden;
+ -moz-outline: none;
+ -moz-user-focus: normal;
+ outline: 0 none;
+}
+
+.my-treetbl-col-text {
+ color: black;
+ padding: 5px 4px 0 4px;
+ display: block;
+ white-space: nowrap;
+ font-family: arial, tahoma, helvetica, sans-serif;
+ font-size: 12px;
+}
+
+.my-treetbl-col {
+ border-right: 1px solid #D5D5D5;
+ background: url(../images/gxt/table/vs-column-bg.gif) repeat-x;
+}
+
+.my-treetbl-col-splitter {
+ position: absolute;
+ top: 0;
+ width: 6px;
+ z-index: 100;
+ height: 100%;
+ right: 0px;
+}
+
+.my-treetbl-col-over {
+ background: url(../images/gxt/table/vs-column-bg.gif) repeat-x 0px -24px;
+}
+
+.my-treetbl-col-sort {
+ background-position: 0px -48px;
+}
+
+.my-treetbl-col-asc {
+ background: url(../images/gxt/table/vsort-asc.gif) no-repeat 50% top;
+}
+
+.my-treetbl-col-desc {
+ background: url(../images/gxt/table/vsort-desc.gif) no-repeat 50% top;
+}
+
+.my-treetbl-col-splitter {
+ background: none;
+}
+
+.my-treetbl-data {
+ background-color: white;
+ overflow: hidden;
+}
+
+.my-treetbl-data .my-treetbl-cell {
+ height: 20px;
+ -moz-outline: none;
+ -moz-user-focus: normal;
+ outline: 0 none;
+}
+
+.my-treetbl-data .my-treetbl-cell-overflow {
+ white-space: nowrap;
+ overflow: hidden;
+}
+
+.my-treetbl-data .my-treetbl-cell-text {
+ padding: 0px 0px;
+ font-family: arial, tahoma, helvetica, sans-serif;
+ font-size: 12px;
+}
+
+.my-treetbl-data tr {
+ overflow: hidden;
+}
+
+.my-treetbl-item {
+ border-top: 1px solid white;
+ border-bottom: 1px solid white;
+ border-bottom: 1px solid #EDEDED;
+ cursor: default;
+ -moz-outline: none;
+ -moz-user-focus: normal;
+ outline: 0 none;
+}
+
+.my-treetbl-item-over {
+ border-top: 1px solid #dddddd;
+ border-bottom: 1px solid #dddddd;
+ background: #efefef url(../images/default/grid/row-over.gif) repeat-x left top;
+}
+
+.my-treetbl-item-sel {
+ background-image: none;
+ background-color: #D9E1ED;
+ border-top: 1px dotted #9EB8ED;
+ border-bottom: 1px dotted #9EB8ED;
+}
+
+.my-treetbl .x-grid3-td-numberer {
+ background: transparent url(../images/gxt/tree/tree-table-special-col.gif) repeat-y
+ scroll left center;
+ height: 19px;
+ line-height: normal;
+ padding-left: 0px;
+ margin-left: 0px;
+}
+
+.x-grid3-td-numberer div {
+ font-size: 11px;
+ font-family: "segoe ui", tahoma, arial, sans-serif;
+ color: #444444;
+ padding: 3px 0px 0 5px !important;
+}
+
+.ext-ie .my-treetbl .x-grid3-td-numberer {
+ height: 20px;
+}
+
+.my-treetbl-item-sel .x-grid3-td-numberer {
+ background: transparent url(../images/gxt/tree/tree-table-special-col-sel.gif) repeat-y
+ scroll left center;
+}.ext-el-mask {
+ background-color: #ccc;
+}
+.ext-el-mask-msg {
+ border-color:#6593cf;
+ background-color:#c3daf9;
+ background-image:url(../images/default/box/tb-blue.gif);
+}
+.ext-el-mask-msg div {
+ background-color: white;
+ border-color:#a3bad9;
+ color:#222;
+ font:normal 11px tahoma, arial, helvetica, sans-serif;
+}
+.x-mask-loading div {
+ background-color:#fbfbfb;
+ background-image:url(../images/default/grid/loading.gif);
+}
+.x-item-disabled {
+ color: gray;
+}
+.x-item-disabled * {
+ color: gray !important;
+}
+.x-splitbar-proxy {
+ background-color: #aaa;
+}
+.x-color-palette a {
+ border-color:#fff;
+}
+.x-color-palette a.x-color-palette-hover, .x-color-palette a.x-color-palette-sel {
+ border-color:#8bb8f3;
+ background-color: #deecfd;
+}
+.x-color-palette em {
+ border-color:#aca899;
+}
+.x-ie-shadow {
+ background-color:#777;
+}
+.x-shadow .xsmc {
+ background-image: url(../images/default/shadow-c.png);
+}
+.x-shadow .xsml, .x-shadow .xsmr {
+ background-image: url(../images/default/shadow-lr.png);
+}
+.x-shadow .xstl, .x-shadow .xstc, .x-shadow .xstr, .x-shadow .xsbl, .x-shadow .xsbc, .x-shadow .xsbr{
+ background-image: url(../images/default/shadow.png);
+}
+.loading-indicator {
+ font-size: 11px;
+ background-image: url(../images/default/grid/loading.gif);
+}
+.x-spotlight {
+ background-color: #ccc;
+}
+.x-aria-focusframe-side {
+ background-color: #15428B;
+ line-height: 2px;
+ font-size: 2px;
+}
+.x-tab-panel-header, .x-tab-panel-footer {
+ background-color: #deecfd;
+ border-color:#8db2e3;
+ overflow:hidden;
+ zoom:1;
+}
+.x-tab-panel-header, .x-tab-panel-footer {
+ border-color:#8db2e3;
+}
+ul.x-tab-strip-top{
+ background-color:#cedff5;
+ background-image: url(../images/default/tabs/tab-strip-bg.gif);
+ border-bottom-color:#8db2e3;
+}
+ul.x-tab-strip-bottom{
+ background-color:#cedff5;
+ background-image: url(../images/default/tabs/tab-strip-btm-bg.gif);
+ border-top-color:#8db2e3;
+}
+.x-tab-panel-header-plain .x-tab-strip-spacer,
+.x-tab-panel-footer-plain .x-tab-strip-spacer {
+ border-color:#8db2e3;
+ background-color: #deecfd;
+}
+.x-tab-strip span.x-tab-strip-text {
+ font:normal 11px tahoma,arial,helvetica;
+ color:#416aa3;
+}
+.x-tab-strip-over span.x-tab-strip-text {
+ color:#15428b;
+}
+.x-tab-strip-active span.x-tab-strip-text {
+ color:#15428b;
+ font-weight:bold;
+}
+.x-tab-strip-disabled .x-tabs-text {
+ color:#aaaaaa;
+}
+.x-tab-strip-top .x-tab-right, .x-tab-strip-top .x-tab-left, .x-tab-strip-top .x-tab-strip-inner{
+ background-image: url(../images/default/tabs/tabs-sprite.gif);
+}
+.x-tab-strip-bottom .x-tab-right {
+ background-image: url(../images/default/tabs/tab-btm-inactive-right-bg.gif);
+}
+.x-tab-strip-bottom .x-tab-left {
+ background-image: url(../images/default/tabs/tab-btm-inactive-left-bg.gif);
+}
+.x-tab-strip-bottom .x-tab-strip-active .x-tab-right {
+ background-image: url(../images/default/tabs/tab-btm-right-bg.gif);
+}
+.x-tab-strip-bottom .x-tab-strip-active .x-tab-left {
+ background-image: url(../images/default/tabs/tab-btm-left-bg.gif);
+}
+.x-tab-strip .x-tab-strip-closable a.x-tab-strip-close {
+ background-image:url(../images/default/tabs/tab-close.gif);
+}
+.x-tab-strip .x-tab-strip-closable a.x-tab-strip-close:hover{
+ background-image:url(../images/default/tabs/tab-close.gif);
+}
+.x-tab-panel-body {
+ border-color:#8db2e3;
+ background-color:#fff;
+}
+.x-tab-panel-body-top {
+ border-top: 0 none;
+}
+.x-tab-panel-body-bottom {
+ border-bottom: 0 none;
+}
+.x-tab-scroller-left {
+ background-image:url(../images/default/tabs/scroll-left.gif);
+ border-bottom-color:#8db2e3;
+}
+.x-tab-scroller-left-over {
+ background-position: 0 0;
+}
+.x-tab-scroller-left-disabled {
+ background-position: -18px 0;
+ opacity:.5;
+ -moz-opacity:.5;
+ filter:alpha(opacity=50);
+ cursor:default;
+}
+.x-tab-scroller-right {
+ background-image:url(../images/default/tabs/scroll-right.gif);
+ border-bottom-color:#8db2e3;
+}
+.x-tab-panel-bbar .x-toolbar, .x-tab-panel-tbar .x-toolbar {
+ border-color:#99bbe8;
+}
+.x-form-field {
+ font: normal 12px tahoma, arial, helvetica, sans-serif;
+}
+
+.x-form-text,textarea.x-form-field {
+ background-color: #fff;
+ background-image: url(../images/default/form/text-bg.gif);
+ border-color: #b5b8c8;
+}
+
+.x-form-select-one {
+ background-color: #fff;
+ border-color: #b5b8c8;
+}
+
+.x-form-check-group-label {
+ border-bottom: 1px solid #99bbe8;
+ color: #15428b;
+}
+
+.x-editor .x-form-check-wrap {
+ background-color: #fff;
+}
+
+.x-form-field-wrap .x-form-trigger {
+ background-image: url(../images/default/form/trigger.gif);
+ border-bottom-color: #b5b8c8;
+}
+
+.x-form-field-wrap .x-form-date-trigger {
+ background-image: url(../images/default/form/date-trigger.gif);
+}
+
+.x-form-field-wrap .x-form-clear-trigger {
+ background-image: url(../images/default/form/clear-trigger.gif);
+}
+
+.x-form-field-wrap .x-form-search-trigger {
+ background-image: url(../images/default/form/search-trigger.gif);
+}
+
+.x-trigger-wrap-focus .x-form-trigger {
+ border-bottom-color: #7eadd9;
+}
+
+.x-item-disabled .x-form-trigger-over {
+ border-bottom-color: #b5b8c8;
+}
+
+.x-item-disabled .x-form-trigger-click {
+ border-bottom-color: #b5b8c8;
+}
+
+.x-form-focus,textarea.x-form-focus {
+ border-color: #7eadd9;
+}
+
+.x-form-invalid,textarea.x-form-invalid {
+ background-color: #fff;
+ background-image: url(../images/default/grid/invalid_line.gif);
+ border-color: #c30;
+}
+
+.ext-safari .x-form-invalid {
+ background-color: #fee;
+ border-color: #ff7870;
+}
+
+.x-form-inner-invalid,textarea.x-form-inner-invalid {
+ background-color: #fff;
+ background-image: url(../images/default/grid/invalid_line.gif);
+}
+
+.x-form-grow-sizer {
+ font: normal 12px tahoma, arial, helvetica, sans-serif;
+}
+
+.x-form-item {
+ font: normal 12px tahoma, arial, helvetica, sans-serif;
+}
+
+.x-form-invalid-msg {
+ color: #c0272b;
+ font: normal 11px tahoma, arial, helvetica, sans-serif;
+ background-image: url(../images/default/shared/warning.gif);
+}
+
+.x-form-empty-field {
+ color: gray;
+}
+
+.x-small-editor .x-form-field {
+ font: normal 11px arial, tahoma, helvetica, sans-serif;
+}
+
+.ext-safari .x-small-editor .x-form-field {
+ font: normal 12px arial, tahoma, helvetica, sans-serif;
+}
+
+.x-form-invalid-icon {
+ background-image: url(../images/default/form/exclamation.gif);
+}
+
+.x-fieldset {
+ border-color: #b5b8c8;
+}
+
+.x-fieldset legend {
+ font: bold 11px tahoma, arial, helvetica, sans-serif;
+ color: #15428b;
+}
+
+.x-editor .x-form-check-wrap {
+ border-color: #7eadd9;
+}
+
+.x-spinner-field .x-form-spinner-up {
+ background-image: url('../images/default/form/spinner.gif');
+}
+.x-spinner-field .x-form-spinner-down {
+ background-image: url('../images/default/form/spinner.gif');
+}.x-btn{
+ font:normal 11px tahoma, verdana, helvetica;
+}
+.x-btn button{
+ font:normal 11px arial,tahoma,verdana,helvetica;
+ color:#333;
+}
+.x-btn em {
+ font-style:normal;
+ font-weight:normal;
+}
+.x-btn-tl, .x-btn-tr, .x-btn-tc, .x-btn-ml, .x-btn-mr, .x-btn-mc, .x-btn-bl, .x-btn-br, .x-btn-bc{
+ background-image:url(../images/default/button/btn.gif);
+}
+.x-btn-click .x-btn-text, .x-btn-menu-active .x-btn-text, .x-btn-pressed .x-btn-text{
+ color:#000;
+}
+.x-btn-disabled *{
+ color:gray !important;
+}
+.x-btn-mc em.x-btn-arrow {
+ background-image:url(../images/default/button/arrow.gif);
+}
+.x-btn-mc em.x-btn-split {
+ background-image:url(../images/default/button/s-arrow.gif);
+}
+.x-btn-over .x-btn-mc em.x-btn-split, .x-btn-click .x-btn-mc em.x-btn-split, .x-btn-menu-active .x-btn-mc em.x-btn-split, .x-btn-pressed .x-btn-mc em.x-btn-split {
+ background-image:url(../images/default/button/s-arrow-o.gif);
+}
+.x-btn-mc em.x-btn-arrow-bottom {
+ background-image:url(../images/default/button/s-arrow-b-noline.gif);
+}
+.x-btn-mc em.x-btn-split-bottom {
+ background-image:url(../images/default/button/s-arrow-b.gif);
+}
+.x-btn-over .x-btn-mc em.x-btn-split-bottom, .x-btn-click .x-btn-mc em.x-btn-split-bottom, .x-btn-menu-active .x-btn-mc em.x-btn-split-bottom, .x-btn-pressed .x-btn-mc em.x-btn-split-bottom {
+ background-image:url(../images/default/button/s-arrow-bo.gif);
+}
+.x-btn-group-header {
+ color: #3e6aaa;
+}
+.x-btn-group-tc {
+ background-image: url(../images/default/button/group-tb.gif);
+}
+.x-btn-group-tl {
+ background-image: url(../images/default/button/group-cs.gif);
+}
+.x-btn-group-tr {
+ background-image: url(../images/default/button/group-cs.gif);
+}
+.x-btn-group-bc {
+ background-image: url(../images/default/button/group-tb.gif);
+}
+.x-btn-group-bl {
+ background-image: url(../images/default/button/group-cs.gif);
+}
+.x-btn-group-br {
+ background-image: url(../images/default/button/group-cs.gif);
+}
+.x-btn-group-ml {
+ background-image: url(../images/default/button/group-lr.gif);
+}
+.x-btn-group-mr {
+ background-image: url(../images/default/button/group-lr.gif);
+}
+.x-btn-group-notitle .x-btn-group-tc {
+ background-image: url(../images/default/button/group-tb.gif);
+}
+.x-toolbar {
+ border-color: #a9bfd3;
+ background-color: #d0def0;
+ background-image: url(../images/default/toolbar/bg.gif);
+}
+
+.x-toolbar td,.x-toolbar span,.x-toolbar input,.x-toolbar div,.x-toolbar select,.x-toolbar label {
+ font: normal 11px arial, tahoma, helvetica, sans-serif;
+}
+
+.x-toolbar .x-item-disabled {
+ color: gray;
+}
+
+.x-toolbar .x-item-disabled * {
+ color: gray;
+}
+
+.x-toolbar .x-btn-mc em.x-btn-split {
+ background-image: url(../images/default/button/s-arrow-noline.gif);
+}
+
+.x-toolbar .x-btn-over .x-btn-mc em.x-btn-split,.x-toolbar .x-btn-click .x-btn-mc em.x-btn-split,.x-toolbar .x-btn-menu-active .x-btn-mc em.x-btn-split,.x-toolbar .x-btn-pressed .x-btn-mc em.x-btn-split
+ {
+ background-image: url(../images/default/button/s-arrow-o.gif);
+}
+
+.x-toolbar .x-btn-mc em.x-btn-split-bottom {
+ background-image: url(../images/default/button/s-arrow-b-noline.gif);
+}
+
+.x-toolbar .x-btn-over .x-btn-mc em.x-btn-split-bottom,.x-toolbar .x-btn-click .x-btn-mc em.x-btn-split-bottom,.x-toolbar .x-btn-menu-active .x-btn-mc em.x-btn-split-bottom,.x-toolbar .x-btn-pressed .x-btn-mc em.x-btn-split-bottom
+ {
+ background-image: url(../images/default/button/s-arrow-bo.gif);
+}
+
+.x-toolbar .xtb-sep {
+ background-image: url(../images/default/grid/grid-blue-split.gif);
+}
+
+.x-tbar-page-first {
+ background-image: url(../images/default/grid/page-first.gif) !important;
+}
+
+.x-tbar-refresh {
+ background-image: url(../images/default/grid/refresh.gif) !important;
+}
+
+.x-tbar-page-last {
+ background-image: url(../images/default/grid/page-last.gif) !important;
+}
+
+.x-tbar-page-next {
+ background-image: url(../images/default/grid/page-next.gif) !important;
+}
+
+.x-tbar-page-prev {
+ background-image: url(../images/default/grid/page-prev.gif) !important;
+}
+
+.x-tbar-loading {
+ background-image: url(../images/default/grid/loading.gif) !important;
+}
+
+.x-item-disabled .x-tbar-page-first {
+ background-image: url(../images/default/grid/page-first-disabled.gif) !important;
+}
+
+.x-item-disabled .x-tbar-page-last {
+ background-image: url(../images/default/grid/page-last-disabled.gif) !important;
+}
+
+.x-item-disabled .x-tbar-page-next {
+ background-image: url(../images/default/grid/page-next-disabled.gif) !important;
+}
+
+.x-item-disabled .x-tbar-page-prev {
+ background-image: url(../images/default/grid/page-prev-disabled.gif) !important;
+}
+
+.x-paging-info {
+ color: #444;
+}
+
+.x-toolbar-more-icon {
+ background-image: url(../images/default/toolbar/more.gif) !important;
+}.x-resizable-handle {
+ background-color:#fff;
+}
+.x-resizable-over .x-resizable-handle-east, .x-resizable-pinned .x-resizable-handle-east,
+.x-resizable-over .x-resizable-handle-west, .x-resizable-pinned .x-resizable-handle-west
+{
+ background-image:url(../images/default/sizer/e-handle.gif);
+}
+.x-resizable-over .x-resizable-handle-south, .x-resizable-pinned .x-resizable-handle-south,
+.x-resizable-over .x-resizable-handle-north, .x-resizable-pinned .x-resizable-handle-north
+{
+ background-image:url(../images/default/sizer/s-handle.gif);
+}
+.x-resizable-over .x-resizable-handle-north, .x-resizable-pinned .x-resizable-handle-north{
+ background-image:url(../images/default/sizer/s-handle.gif);
+}
+.x-resizable-over .x-resizable-handle-southeast, .x-resizable-pinned .x-resizable-handle-southeast{
+ background-image:url(../images/default/sizer/se-handle.gif);
+}
+.x-resizable-over .x-resizable-handle-northwest, .x-resizable-pinned .x-resizable-handle-northwest{
+ background-image:url(../images/default/sizer/nw-handle.gif);
+}
+.x-resizable-over .x-resizable-handle-northeast, .x-resizable-pinned .x-resizable-handle-northeast{
+ background-image:url(../images/default/sizer/ne-handle.gif);
+}
+.x-resizable-over .x-resizable-handle-southwest, .x-resizable-pinned .x-resizable-handle-southwest{
+ background-image:url(../images/default/sizer/sw-handle.gif);
+}
+.x-resizable-proxy{
+ border-color:#3b5a82;
+}
+.x-resizable-overlay{
+ background-color:#fff;
+}
+.x-grid3 {
+ background-color: #fff;
+}
+
+.x-grid-panel .x-panel-mc .x-panel-body {
+ border-color: #99bbe8;
+}
+
+.x-grid3-hd-row .x-grid3-hd,.x-grid3-row .x-grid3-cell,.x-grid3-summary-row .x-grid3-cell {
+ font: normal 11px arial, tahoma, helvetica, sans-serif;
+}
+
+.x-grid3-hd-row .x-grid3-hd {
+ border-left-color: #eee;
+ border-right-color: #d0d0d0;
+}
+
+.x-grid-row-loading {
+ background-color: #fff;
+ background-image: url(../images/default/shared/loading-balls.gif);
+}
+
+.x-grid3-row {
+ border-color: #ededed;
+ border-top-color: #fff;
+}
+
+.x-grid3-row-alt {
+ background-color: #fafafa;
+}
+
+.x-grid3-row-over {
+ border-color: #ddd;
+ background-color: #efefef;
+ background-image: url(../images/default/grid/row-over.gif);
+}
+
+.x-grid3-resize-proxy {
+ background-color: #777;
+}
+
+.x-grid3-resize-marker {
+ background-color: #777;
+}
+
+.x-grid3-header {
+ background-color: #f9f9f9;
+ background-image: url(../images/default/grid/grid3-hrow.gif);
+}
+
+.x-grid3-header-pop {
+ border-left-color: #d0d0d0;
+}
+
+.x-grid3-header-pop-inner {
+ border-left-color: #eee;
+ background-image: url(../images/default/grid/hd-pop.gif);
+}
+
+td.x-grid3-hd-over,td.sort-desc,td.sort-asc,td.x-grid3-hd-menu-open {
+ border-left-color: #aaccf6;
+ border-right-color: #aaccf6;
+}
+
+td.x-grid3-hd-over .x-grid3-hd-inner,td.sort-desc .x-grid3-hd-inner,td.sort-asc .x-grid3-hd-inner,td.x-grid3-hd-menu-open .x-grid3-hd-inner
+ {
+ background-color: #ebf3fd;
+ background-image: url(../images/default/grid/grid3-hrow-over.gif);
+}
+
+.sort-asc .x-grid3-sort-icon {
+ background-image: url(../images/default/grid/sort_asc.gif);
+}
+
+.sort-desc .x-grid3-sort-icon {
+ background-image: url(../images/default/grid/sort_desc.gif);
+}
+
+.x-grid3-cell-text,.x-grid3-hd-text {
+ color: #000;
+}
+
+.x-grid3-split {
+ background-image: url(../images/default/grid/grid-split.gif);
+}
+
+.x-grid3-hd-text {
+ color: #15428b;
+}
+
+.x-dd-drag-proxy .x-grid3-hd-inner {
+ background-color: #ebf3fd;
+ background-image: url(../images/default/grid/grid3-hrow-over.gif);
+ border-color: #aaccf6;
+}
+
+.col-move-top {
+ background-image: url(../images/default/grid/col-move-top.gif);
+}
+
+.col-move-bottom {
+ background-image: url(../images/default/grid/col-move-bottom.gif);
+}
+
+.x-grid3-highlightrow {
+ border: 1px dotted #545352;
+}
+
+.x-grid3-row-selected {
+ background-image: none !important;
+ background-color: #dfe8f6 !important;
+ border-color: #a3bae9;
+}
+
+.x-grid3-cell-selected {
+ background-color: #b8cfee !important;
+ color: #000;
+}
+
+.x-grid3-group-selected {
+ background-color: #b8cfee !important;
+}
+
+.x-grid3-cell-selected span {
+ color: #000 !important;
+}
+
+.x-grid3-cell-selected .x-grid3-cell-text {
+ color: #000;
+}
+
+.x-grid3-locked td.x-grid3-row-marker,.x-grid3-locked .x-grid3-row-selected td.x-grid3-row-marker {
+ background-color: #ebeadb !important;
+ background-image: url(../images/default/grid/grid-hrow.gif) !important;
+ color: #000;
+ border-top-color: #fff;
+ border-right-color: #6fa0df !important;
+}
+
+.x-grid3-locked td.x-grid3-row-marker div,.x-grid3-locked .x-grid3-row-selected td.x-grid3-row-marker div {
+ color: #15428b !important;
+}
+
+.x-grid3-dirty-cell {
+ background-image: url(../images/default/grid/dirty.gif);
+}
+
+.x-grid3-invalid-cell {
+ background-image: url(../images/default/grid/invalid_line.gif);
+}
+
+.x-grid3-topbar,.x-grid3-bottombar {
+ font: normal 11px arial, tahoma, helvetica, sans-serif;
+}
+
+.x-grid3-bottombar .x-toolbar {
+ border-top-color: #a9bfd3;
+}
+
+.x-props-grid .x-grid3-td-name .x-grid3-cell-inner {
+ background-image: url(../images/default/grid/grid3-special-col-bg.gif) !important;
+ color: #000 !important;
+}
+
+.x-props-grid .x-grid3-body .x-grid3-td-name {
+ background-color: #fff !important;
+ border-right-color: #eee;
+}
+
+.xg-hmenu-sort-asc .x-menu-item-icon {
+ background-image: url(../images/default/grid/hmenu-asc.gif);
+}
+
+.xg-hmenu-sort-desc .x-menu-item-icon {
+ background-image: url(../images/default/grid/hmenu-desc.gif);
+}
+
+.xg-hmenu-lock .x-menu-item-icon {
+ background-image: url(../images/default/grid/hmenu-lock.gif);
+}
+
+.xg-hmenu-unlock .x-menu-item-icon {
+ background-image: url(../images/default/grid/hmenu-unlock.gif);
+}
+
+.x-grid3-hd-btn {
+ background-color: #c3daf9;
+ background-image: url(../images/default/grid/grid3-hd-btn.gif);
+}
+
+.x-grid3-body .x-grid3-td-expander {
+ background-image: url(../images/default/grid/grid3-special-col-bg.gif);
+}
+
+.x-grid3-row-expander {
+ background-image: url(../images/default/grid/row-expand-sprite.gif);
+}
+
+.x-grid3-body .x-grid3-td-checker {
+ background-image: url(../images/default/grid/grid3-special-col-bg.gif);
+}
+
+.x-grid3-row-checker,.x-grid3-hd-checker {
+ background-image: url(../images/default/grid/row-check-sprite.gif);
+}
+
+.x-grid3-body .x-grid3-td-numberer {
+ background-image: url(../images/default/grid/grid3-special-col-bg.gif);
+}
+
+.x-grid3-body .x-grid3-td-numberer .x-grid3-cell-inner {
+ color: #444;
+}
+
+.x-grid3-body .x-grid3-td-row-icon {
+ background-image: url(../images/default/grid/grid3-special-col-bg.gif);
+}
+
+.x-grid3-body .x-grid3-row-selected .x-grid3-td-numberer,.x-grid3-body .x-grid3-row-selected .x-grid3-td-checker,.x-grid3-body .x-grid3-row-selected .x-grid3-td-expander
+ {
+ background-image: url(../images/default/grid/grid3-special-col-sel-bg.gif);
+}
+
+.x-grid3-check-col {
+ background-image: url(../images/default/menu/unchecked.gif);
+}
+
+.x-grid3-check-col-on {
+ background-image: url(../images/default/menu/checked.gif);
+}
+
+.x-grid-group,.x-grid-group-body,.x-grid-group-hd {
+ zoom: 1;
+}
+
+.x-grid-group-hd {
+ border-bottom-color: #99bbe8;
+}
+
+.x-grid-group-hd .x-grid-group-div {
+ background-image: url(../images/default/grid/group-expand-sprite.gif);
+ color: #3764a0;
+ font: bold 11px tahoma, arial, helvetica, sans-serif;
+}
+
+.x-group-by-icon {
+ background-image: url(../images/default/grid/group-by.gif);
+}
+
+.x-cols-icon {
+ background-image: url(../images/default/grid/columns.gif);
+}
+
+.x-show-groups-icon {
+ background-image: url(../images/default/grid/group-by.gif);
+}
+
+.x-grid-empty {
+ color: gray;
+ font: normal 11px tahoma, arial, helvetica, sans-serif;
+}
+
+.x-grid-with-col-lines .x-grid3-row td.x-grid3-cell {
+ border-right-color: #ededed;
+}
+
+.x-grid-with-col-lines .x-grid3-row-selected {
+ border-top-color: #a3bae9;
+}
+
+.x-grid3-check-col-disabled {
+ background-color: transparent;
+ background-image: url(../images/gxt/menu/disabledcheck.gif);
+}
+
+.x-row-editor-header {
+ background: transparent url(../images/gxt/grid/row-editor-bg.gif) repeat-x 0 0;
+}
+
+.x-row-editor-footer {
+ background: transparent url(../images/gxt/grid/row-editor-bg.gif) repeat-x 0 -2px;
+}
+
+.x-row-editor-body {
+ background: #ebf2fb;
+}
+
+.x-row-editor .x-btns {
+ background: transparent url(../images/gxt/grid/row-editor-btns.gif) no-repeat 0 0;
+}
+
+.x-row-editor .x-btns .x-plain-bwrap {
+ background: transparent url(../images/gxt/grid/row-editor-btns.gif) no-repeat right -31px;
+}
+
+.x-row-editor .x-btns .x-plain-body {
+ background: transparent url(../images/gxt/grid/row-editor-btns.gif) repeat-x 0 -62px;
+}.x-dd-drag-ghost{
+ color:#000;
+ font: normal 11px arial, helvetica, sans-serif;
+ border-color: #ddd #bbb #bbb #ddd;
+ background-color:#fff;
+}
+.x-dd-drop-nodrop .x-dd-drop-icon{
+ background-image: url(../images/default/dd/drop-no.gif);
+}
+.x-dd-drop-ok .x-dd-drop-icon{
+ background-image: url(../images/default/dd/drop-yes.gif);
+}
+.x-dd-drop-ok-add .x-dd-drop-icon{
+ background-image: url(../images/default/dd/drop-add.gif);
+}
+.x-view-selector {
+ background-color:#c3daf9;
+ border-color:#3399bb;
+}
+.x-tree-drop-ok-append .x-dd-drop-icon {
+ background-image: url(../images/default/tree/drop-add.gif);
+}
+
+.x-tree-drop-ok-above .x-dd-drop-icon {
+ background-image: url(../images/default/tree/drop-over.gif);
+}
+
+.x-tree-drop-ok-below .x-dd-drop-icon {
+ background-image: url(../images/default/tree/drop-under.gif);
+}
+
+.x-tree-drop-ok-between .x-dd-drop-icon {
+ background-image: url(../images/default/tree/drop-between.gif);
+}
+
+.x-tree3-loading {
+ background-image: url(../images/default/tree/loading.gif);
+}
+
+.x-tree3-node-text {
+ font: normal 11px arial, tahoma, helvetica, sans-serif;
+ color: black;
+}.x-date-picker {
+ border-color: #1b376c;
+ background-color:#fff;
+}
+.x-date-middle,.x-date-left,.x-date-right {
+ background-image: url(../images/default/shared/hd-sprite.gif);
+ color:#fff;
+ font:bold 11px "sans serif", tahoma, verdana, helvetica;
+}
+.x-date-middle .x-btn .x-btn-text {
+ color:#fff;
+}
+.x-date-middle .x-btn-mc em.x-btn-arrow {
+ background-image:url(../images/default/toolbar/btn-arrow-light.gif);
+}
+.x-date-right a {
+ background-image: url(../images/default/shared/right-btn.gif);
+}
+.x-date-left a{
+ background-image: url(../images/default/shared/left-btn.gif);
+}
+.x-date-inner th {
+ background-color:#dfecfb;
+ background-image:url(../images/default/shared/glass-bg.gif);
+ border-bottom-color:#a3bad9;
+ font:normal 10px arial, helvetica,tahoma,sans-serif;
+ color:#233d6d;
+}
+.x-date-inner td {
+ border-color:#fff;
+}
+.x-date-inner a {
+ font:normal 11px arial, helvetica,tahoma,sans-serif;
+ color:#000;
+}
+.x-date-inner .x-date-active{
+ color:#000;
+}
+.x-date-inner .x-date-selected a{
+ background-color:#dfecfb;
+ background-image:url(../images/default/shared/glass-bg.gif);
+ border-color:#8db2e3;
+}
+.x-date-inner .x-date-today a{
+ border-color:darkred;
+}
+.x-date-inner .x-date-selected span{
+ font-weight:bold;
+}
+.x-date-inner .x-date-prevday a,.x-date-inner .x-date-nextday a {
+ color:#aaa;
+}
+.x-date-bottom {
+ border-top-color:#a3bad9;
+ background-color:#dfecfb;
+ background-image:url(../images/default/shared/glass-bg.gif);
+}
+.x-date-inner .x-date-disabled a {
+ background-color:#eee;
+ color:#bbb;
+}
+.x-date-mmenu{
+ background-color:#eee !important;
+}
+.x-date-mmenu .x-menu-item {
+ font-size:10px;
+ color:#000;
+}
+.x-date-mp {
+ background-color:#fff;
+}
+.x-date-mp td {
+ font:normal 11px arial, helvetica,tahoma,sans-serif;
+}
+.x-date-mp-btns button {
+ background-color:#083772;
+ color:#fff;
+ border-color: #3366cc #000055 #000055 #3366cc;
+ font:normal 11px arial, helvetica,tahoma,sans-serif;
+}
+.x-date-mp-btns {
+ background-color: #dfecfb;
+ background-image: url(../images/default/shared/glass-bg.gif);
+}
+.x-date-mp-btns td {
+ border-top-color: #c5d2df;
+}
+td.x-date-mp-month a,td.x-date-mp-year a {
+ color:#15428b;
+}
+td.x-date-mp-sel a {
+ background-color: #dfecfb;
+ background-image: url(../images/default/shared/glass-bg.gif);
+ border-color:#8db2e3;
+}
+.x-date-mp-ybtn a {
+ background-image:url(../images/default/panel/tool-sprites.gif);
+}
+td.x-date-mp-sep {
+ border-right-color:#c5d2df;
+}
+.x-tip .x-tip-close{
+ background-image: url(../images/default/qtip/close.gif);
+}
+.x-tip .x-tip-tc, .x-tip .x-tip-tl, .x-tip .x-tip-tr, .x-tip .x-tip-bc, .x-tip .x-tip-bl, .x-tip .x-tip-br, .x-tip .x-tip-ml, .x-tip .x-tip-mr {
+ background-image: url(../images/default/qtip/tip-sprite.gif);
+}
+.x-tip .x-tip-mc {
+ font: normal 11px tahoma,arial,helvetica,sans-serif;
+}
+.x-tip .x-tip-ml {
+ background-color: #fff;
+}
+.x-tip .x-tip-header-text {
+ font: bold 11px tahoma,arial,helvetica,sans-serif;
+ color:#444;
+}
+.x-tip .x-tip-body {
+ font: normal 11px tahoma,arial,helvetica,sans-serif;
+ color:#444;
+}
+.x-form-invalid-tip .x-tip-tc, .x-form-invalid-tip .x-tip-tl, .x-form-invalid-tip .x-tip-tr, .x-form-invalid-tip .x-tip-bc,
+.x-form-invalid-tip .x-tip-bl, .x-form-invalid-tip .x-tip-br, .x-form-invalid-tip .x-tip-ml, .x-form-invalid-tip .x-tip-mr
+{
+ background-image: url(../images/default/form/error-tip-corners.gif);
+}
+.x-form-invalid-tip .x-tip-body {
+ background-image:url(../images/default/form/exclamation.gif);
+}
+.x-tip-anchor {
+ background-image:url(../images/default/qtip/tip-anchor-sprite.gif);
+}
+.x-menu {
+ border-color:#718bb7;
+ background-color:#f0f0f0;
+ background-image:url(../images/default/menu/menu.gif);
+}
+.x-menu-nosep {
+ background-image:none;
+}
+.x-menu-list-item{
+ font:normal 11px tahoma,arial, sans-serif;
+}
+.x-menu-item-arrow{
+ background-image:url(../images/default/menu/menu-parent.gif);
+}
+.x-menu-sep {
+ background-color:#e0e0e0;
+ border-bottom-color:#fff;
+}
+a.x-menu-item {
+ color:#222;
+}
+.x-menu-item-active {
+ background:#ebf3fd url(../images/default/menu/item-over.gif) repeat-x left bottom;
+ border:1px solid #aaccf6;
+ padding:0;
+}
+.x-menu-item-active a.x-menu-item {
+ color:#233d6d;
+}
+
+.x-menu-plain {
+ background-color:#fff !important;
+}
+.x-menu .x-date-picker{
+ border-color:#a3bad9;
+}
+.x-cycle-menu .x-menu-item-checked {
+ border-color:#a3bae9 !important;
+ background-color:#def8f6;
+}
+.x-menu-scroller-top {
+ background-image:url(../images/default/layout/mini-top.gif);
+}
+.x-menu-scroller-bottom {
+ background-image:url(../images/default/layout/mini-bottom.gif);
+}
+
+.x-menu-scroller{
+ border-width: 1px 0;
+}
+.x-box-tl {
+ background-image: url(../images/default/box/corners.gif);
+}
+.x-box-tc {
+ background-image: url(../images/default/box/tb.gif);
+}
+.x-box-tr {
+ background-image: url(../images/default/box/corners.gif);
+}
+.x-box-ml {
+ background-image: url(../images/default/box/l.gif);
+}
+.x-box-mc {
+ background-color: #eee;
+ background-image: url(../images/default/box/tb.gif);
+ font-family: "Myriad Pro","Myriad Web","Tahoma","Helvetica","Arial",sans-serif;
+ color: #393939;
+ font-size: 12px;
+}
+.x-box-mc h3 {
+ font-size: 14px;
+ font-weight: bold;
+}
+.x-box-mr {
+ background-image: url(../images/default/box/r.gif);
+}
+.x-box-bl {
+ background-image: url(../images/default/box/corners.gif);
+}
+.x-box-bc {
+ background-image: url(../images/default/box/tb.gif);
+}
+.x-box-br {
+ background-image: url(../images/default/box/corners.gif);
+}
+.x-box-blue .x-box-bl, .x-box-blue .x-box-br, .x-box-blue .x-box-tl, .x-box-blue .x-box-tr {
+ background-image: url(../images/default/box/corners-blue.gif);
+}
+.x-box-blue .x-box-bc, .x-box-blue .x-box-mc, .x-box-blue .x-box-tc {
+ background-image: url(../images/default/box/tb-blue.gif);
+}
+.x-box-blue .x-box-mc {
+ background-color: #c3daf9;
+}
+.x-box-blue .x-box-mc h3 {
+ color: #17385b;
+}
+.x-box-blue .x-box-ml {
+ background-image: url(../images/default/box/l-blue.gif);
+}
+.x-box-blue .x-box-mr {
+ background-image: url(../images/default/box/r-blue.gif);
+}
+.x-combo-list {
+ border-color:#98c0f4;
+ background-color:#ddecfe;
+ font:normal 12px tahoma, arial, helvetica, sans-serif;
+}
+.x-combo-list-inner {
+ background-color:#fff;
+}
+.x-combo-list-hd {
+ font:bold 11px tahoma, arial, helvetica, sans-serif;
+ color:#15428b;
+ background-image: url(../images/default/layout/panel-title-light-bg.gif);
+ border-bottom-color:#98c0f4;
+}
+.x-resizable-pinned .x-combo-list-inner {
+ border-bottom-color:#98c0f4;
+}
+.x-combo-list-item {
+ border-color:#fff;
+}
+.x-combo-list .x-combo-selected{
+ border-color:#a3bae9 !important;
+ background-color:#dfe8f6;
+}
+.x-combo-list .x-toolbar {
+ border-top-color:#98c0f4;
+}
+.x-combo-list-small {
+ font:normal 11px tahoma, arial, helvetica, sans-serif;
+}
+.x-panel {
+ border-color: #99bbe8;
+}
+.x-panel-header {
+ color:#15428b;
+ font-weight:bold;
+ font-size: 11px;
+ font-family: tahoma,arial,verdana,sans-serif;
+ border-color:#99bbe8;
+ background-image: url(../images/default/panel/white-top-bottom.gif);
+}
+.x-panel-body {
+ border-color:#99bbe8;
+ background-color:#fff;
+}
+.x-panel-bbar .x-toolbar, .x-panel-tbar .x-toolbar {
+ border-color:#99bbe8;
+}
+.x-panel-tbar-noheader .x-toolbar, .x-panel-mc .x-panel-tbar .x-toolbar {
+ border-top-color:#99bbe8;
+}
+.x-panel-body-noheader, .x-panel-mc .x-panel-body {
+ border-top-color:#99bbe8;
+}
+.x-panel-tl .x-panel-header {
+ color:#15428b;
+ font-weight:bold;
+ font-size: 11px;
+ font-family: tahoma,arial,verdana,sans-serif;
+}
+.x-panel-tc {
+ background-image: url(../images/default/panel/top-bottom.gif);
+}
+.x-panel-tl, .x-panel-tr, .x-panel-bl, .x-panel-br{
+ background-image: url(../images/default/panel/corners-sprite.gif);
+ border-bottom-color:#99bbe8;
+}
+.x-panel-bc {
+ background-image: url(../images/default/panel/top-bottom.gif);
+}
+.x-panel-mc {
+ font: normal 11px tahoma,arial,helvetica,sans-serif;
+ background-color:#dfe8f6;
+}
+.x-panel-ml {
+ background-color: #fff;
+ background-image:url(../images/default/panel/left-right.gif);
+}
+.x-panel-mr {
+ background-image: url(../images/default/panel/left-right.gif);
+}
+.x-tool {
+ background-image:url(../images/default/panel/tool-sprites.gif);
+}
+.x-panel-ghost {
+ background-color:#cbddf3;
+}
+.x-panel-ghost ul {
+ border-color:#99bbe8;
+}
+.x-panel-dd-spacer {
+ border-color:#99bbe8;
+}
+.x-panel-fbar td,.x-panel-fbar span,.x-panel-fbar input,.x-panel-fbar div,.x-panel-fbar select,.x-panel-fbar label{
+ font:normal 11px arial,tahoma, helvetica, sans-serif;
+}
+.x-window-proxy {
+ background-color:#c7dffc;
+ border-color:#99bbe8;
+}
+.x-window-tl .x-window-header {
+ color:#15428b;
+ font:bold 11px tahoma,arial,verdana,sans-serif;
+}
+.x-window-tc {
+ background-image: url(../images/default/window/top-bottom.png);
+}
+.x-window-tl {
+ background-image: url(../images/default/window/left-corners.png);
+}
+.x-window-tr {
+ background-image: url(../images/default/window/right-corners.png);
+}
+.x-window-bc {
+ background-image: url(../images/default/window/top-bottom.png);
+}
+.x-window-bl {
+ background-image: url(../images/default/window/left-corners.png);
+}
+.x-window-br {
+ background-image: url(../images/default/window/right-corners.png);
+}
+.x-window-mc {
+ border-color:#99bbe8;
+ font: normal 11px tahoma,arial,helvetica,sans-serif;
+ background-color:#dfe8f6;
+}
+.x-window-ml {
+ background-image: url(../images/default/window/left-right.png);
+}
+.x-window-mr {
+ background-image: url(../images/default/window/left-right.png);
+}
+.x-window-maximized .x-window-tc {
+ background-color:#fff;
+}
+.x-window-bbar .x-toolbar {
+ border-top-color:#99bbe8;
+}
+.x-panel-ghost .x-window-tl {
+ border-bottom-color:#99bbe8;
+}
+.x-panel-collapsed .x-window-tl {
+ border-bottom-color:#84a0c4;
+}
+.x-dlg-mask{
+ background-color:#ccc;
+}
+.x-window-plain .x-window-mc {
+ background-color: #ccd9e8;
+ border-color: #a3bae9 #dfe8f6 #dfe8f6 #a3bae9;
+}
+.ext-ie .x-window-plain .x-window-mc {
+ background-color: #c9d5e4;
+}
+.x-window-plain .x-window-body {
+ border-color: #dfe8f6 #a3bae9 #a3bae9 #dfe8f6;
+}
+body.x-body-masked .x-window-plain .x-window-mc {
+ background-color: #ccd9e8;
+}
+.x-html-editor-wrap {
+ border-color:#a9bfd3;
+ background-color:#fff;
+}
+
+.x-html-editor-tb .x-edit-bold, .x-menu-item .x-edit-bold {
+ background-position:0 0;
+ background-image:url(../images/default/editor/tb-sprite.gif);
+}
+
+.x-html-editor-tb .x-edit-italic, .x-menu-item .x-edit-italic {
+ background-position:-16px 0;
+ background-image:url(../images/default/editor/tb-sprite.gif);
+}
+
+.x-html-editor-tb .x-edit-underline, .x-menu-item .x-edit-underline {
+ background-position:-32px 0;
+ background-image:url(../images/default/editor/tb-sprite.gif);
+}
+
+.x-html-editor-tb .x-edit-forecolor, .x-menu-item .x-edit-forecolor {
+ background-position:-160px 0;
+ background-image:url(../images/default/editor/tb-sprite.gif);
+}
+
+.x-html-editor-tb .x-edit-backcolor, .x-menu-item .x-edit-backcolor {
+ background-position:-176px 0;
+ background-image:url(../images/default/editor/tb-sprite.gif);
+}
+
+.x-html-editor-tb .x-edit-justifyleft, .x-menu-item .x-edit-justifyleft {
+ background-position:-112px 0;
+ background-image:url(../images/default/editor/tb-sprite.gif);
+}
+
+.x-html-editor-tb .x-edit-justifycenter, .x-menu-item .x-edit-justifycenter {
+ background-position:-128px 0;
+ background-image:url(../images/default/editor/tb-sprite.gif);
+}
+
+.x-html-editor-tb .x-edit-justifyright, .x-menu-item .x-edit-justifyright {
+ background-position:-144px 0;
+ background-image:url(../images/default/editor/tb-sprite.gif);
+}
+
+.x-html-editor-tb .x-edit-insertorderedlist, .x-menu-item .x-edit-insertorderedlist {
+ background-position:-80px 0;
+ background-image:url(../images/default/editor/tb-sprite.gif);
+}
+
+.x-html-editor-tb .x-edit-insertunorderedlist, .x-menu-item .x-edit-insertunorderedlist {
+ background-position:-96px 0;
+ background-image:url(../images/default/editor/tb-sprite.gif);
+}
+
+.x-html-editor-tb .x-edit-increasefontsize, .x-menu-item .x-edit-increasefontsize {
+ background-position:-48px 0;
+ background-image:url(../images/default/editor/tb-sprite.gif);
+}
+
+.x-html-editor-tb .x-edit-decreasefontsize, .x-menu-item .x-edit-decreasefontsize {
+ background-position:-64px 0;
+ background-image:url(../images/default/editor/tb-sprite.gif);
+}
+
+.x-html-editor-tb .x-edit-sourceedit, .x-menu-item .x-edit-sourceedit {
+ background-position:-192px 0;
+ background-image:url(../images/default/editor/tb-sprite.gif);
+}
+
+.x-html-editor-tb .x-edit-createlink, .x-menu-item .x-edit-createlink {
+ background-position:-208px 0;
+ background-image:url(../images/default/editor/tb-sprite.gif);
+}.x-panel-noborder .x-panel-header-noborder {
+ border-bottom-color:#99bbe8;
+}
+.x-panel-noborder .x-panel-tbar-noborder .x-toolbar {
+ border-bottom-color:#99bbe8;
+}
+.x-panel-noborder .x-panel-bbar-noborder .x-toolbar {
+ border-top-color:#99bbe8;
+}
+.x-tab-panel-bbar-noborder .x-toolbar {
+ border-top-color:#99bbe8;
+}
+.x-tab-panel-tbar-noborder .x-toolbar {
+ border-bottom-color:#99bbe8;
+}
+.x-border-layout-ct {
+ background-color:#dfe8f6;
+}
+.x-accordion-hd {
+ color:#222;
+ font-weight:normal;
+ background-image: url(../images/default/panel/light-hd.gif);
+}
+.x-layout-collapsed{
+ background-color:#d2e0f2;
+ border-color:#98c0f4;
+}
+.x-layout-collapsed-over{
+ background-color:#d9e8fb;
+}
+.x-layout-split-west .x-layout-mini {
+ background-image:url(../images/default/layout/mini-left.gif);
+}
+.x-layout-split-east .x-layout-mini {
+ background-image:url(../images/default/layout/mini-right.gif);
+}
+.x-layout-split-north .x-layout-mini {
+ background-image:url(../images/default/layout/mini-top.gif);
+}
+.x-layout-split-south .x-layout-mini {
+ background-image:url(../images/default/layout/mini-bottom.gif);
+}
+.x-layout-cmini-west .x-layout-mini {
+ background-image:url(../images/default/layout/mini-right.gif);
+}
+.x-layout-cmini-east .x-layout-mini {
+ background-image:url(../images/default/layout/mini-left.gif);
+}
+.x-layout-cmini-north .x-layout-mini {
+ background-image:url(../images/default/layout/mini-bottom.gif);
+}
+.x-layout-cmini-south .x-layout-mini {
+ background-image:url(../images/default/layout/mini-top.gif);
+}
+.x-progress-wrap {
+ border-color:#6593cf;
+}
+.x-progress-inner {
+ background-color:#e0e8f3;
+ background-image:url(../images/default/qtip/bg.gif);
+}
+.x-progress-bar {
+ background-color:#9cbfee;
+ background-image:url(../images/default/progress/progress-bg.gif);
+ border-top-color:#d1e4fd;
+ border-bottom-color:#7fa9e4;
+ border-right-color:#7fa9e4;
+}
+.x-progress-text {
+ font-size:11px;
+ font-weight:bold;
+ color:#fff;
+}
+.x-progress-text-back {
+ color:#396095;
+}
+.x-slider-horz, .x-slider-horz .x-slider-end, .x-slider-horz .x-slider-inner {
+ background-image:url(../images/default/slider/slider-bg.png);
+}
+.x-slider-horz .x-slider-thumb {
+ background-image:url(../images/default/slider/slider-thumb.png);
+}
+.x-slider-vert, .x-slider-vert .x-slider-end, .x-slider-vert .x-slider-inner {
+ background-image:url(../images/default/slider/slider-v-bg.png);
+}
+.x-slider-vert .x-slider-thumb {
+ background-image:url(../images/default/slider/slider-v-thumb.png);
+}
+.x-window-dlg .ext-mb-text,
+.x-window-dlg .x-window-header-text {
+ font-size:12px;
+}
+.x-window-dlg .ext-mb-textarea {
+ font:normal 12px tahoma,arial,helvetica,sans-serif;
+}
+.x-window-dlg .x-msg-box-wait {
+ background-image:url(../images/default/grid/loading.gif);
+}
+.x-window-dlg .ext-mb-info {
+ background-image:url(../images/default/window/icon-info.gif);
+}
+.x-window-dlg .ext-mb-warning {
+ background-image:url(../images/default/window/icon-warning.gif);
+}
+.x-window-dlg .ext-mb-question {
+ background-image:url(../images/default/window/icon-question.gif);
+}
+.x-window-dlg .ext-mb-error {
+ background-image:url(../images/default/window/icon-error.gif);
+}
diff --git a/src/main/webapp/gxt/css/gxt-gray.css b/src/main/webapp/gxt/css/gxt-gray.css
new file mode 100755
index 0000000..c6d7df5
--- /dev/null
+++ b/src/main/webapp/gxt/css/gxt-gray.css
@@ -0,0 +1,490 @@
+.x-panel {
+ border-style: solid;
+ border-color: #d0d0d0;
+}
+.x-panel-header {
+ color:#333;
+ border:1px solid #d0d0d0;
+ background-image:url(../images/gray/panel/white-top-bottom.gif);
+}
+
+.x-panel-body {
+ border-color:#d0d0d0;
+}
+
+.x-panel-bbar .x-toolbar {
+ border-color:#d0d0d0;
+}
+
+.x-panel-tbar .x-toolbar {
+ border-color:#d0d0d0;
+}
+
+.x-panel-tbar-noheader .x-toolbar, .x-panel-mc .x-panel-tbar .x-toolbar {
+ border-color:#d0d0d0;
+}
+.x-panel-body-noheader, .x-panel-mc .x-panel-body {
+ border-color:#d0d0d0;
+}
+.x-panel-tl .x-panel-header {
+ color:#333;
+}
+.x-panel-tc {
+ background-image:url(../images/gray/panel/top-bottom.gif);
+}
+.x-panel-tl {
+ background-image:url(../images/gray/panel/corners-sprite.gif);
+ border-color:#d0d0d0;
+}
+.x-panel-tr {
+ background-image:url(../images/gray/panel/corners-sprite.gif);
+}
+.x-panel-bc {
+ background-image:url(../images/gray/panel/top-bottom.gif);
+}
+.x-panel-bl {
+ background-image:url(../images/gray/panel/corners-sprite.gif);
+}
+.x-panel-br {
+ background-image:url(../images/gray/panel/corners-sprite.gif);
+}
+.x-panel-mc {
+ background:#f1f1f1;
+}
+.x-panel-mc .x-panel-body {
+ background:transparent;
+ border: 0 none;
+}
+.x-panel-ml {
+ background-image:url(../images/gray/panel/left-right.gif);
+}
+.x-panel-mr {
+ background-image:url(../images/gray/panel/left-right.gif);
+}
+
+/* Tools */
+.x-tool {
+ background-image:url(../images/gray/panel/tool-sprites.gif);
+}
+
+/* Ghosting */
+.x-panel-ghost {
+ background:#e0e0e0;
+}
+
+.x-panel-ghost ul {
+ border-color:#b0b0b0;
+}
+
+.x-grid-panel .x-panel-mc .x-panel-body {
+ border:1px solid #d0d0d0;
+}
+
+/* Buttons */
+
+.x-btn-left{
+ background-image:url(../images/gray/button/btn-sprite.gif);
+}
+.x-btn-right{
+ background-image:url(../images/gray/button/btn-sprite.gif);
+}
+.x-btn-center{
+ background-image:url(../images/gray/button/btn-sprite.gif);
+}
+
+.x-btn-group-header {
+ color: #333333;
+}
+.x-btn-group-tc {
+ background-image: url(../images/gray/button/group-tb.gif);
+}
+.x-btn-group-tl {
+ background-image: url(../images/gray/button/group-cs.gif);
+}
+.x-btn-group-tr {
+ background-image: url(../images/gray/button/group-cs.gif);
+}
+.x-btn-group-bc {
+ background-image: url(../images/gray/button/group-tb.gif);
+}
+.x-btn-group-bl {
+ background-image: url(../images/gray/button/group-cs.gif);
+}
+.x-btn-group-br {
+ background-image: url(../images/gray/button/group-cs.gif);
+}
+.x-btn-group-ml {
+ background-image: url(../images/gray/button/group-lr.gif);
+}
+.x-btn-group-mr {
+ background-image: url(../images/gray/button/group-lr.gif);
+}
+.x-btn-group-notitle .x-btn-group-tc {
+ background-image: url(../images/gray/button/group-tb.gif);
+}
+
+/* Layout classes */
+
+.x-border-layout-ct {
+ background:#f0f0f0;
+}
+
+.x-accordion-hd {
+ background-image:url(../images/gray/panel/light-hd.gif);
+}
+
+.x-layout-collapsed{
+ background-color:#eee;
+ border-color:#e0e0e0;
+}
+.x-layout-collapsed-over{
+ background-color:#fbfbfb;
+}
+
+
+/* qtips */
+.x-tip .x-tip-top {
+ background-image:url(../images/gray/qtip/tip-sprite.gif);
+}
+.x-tip .x-tip-top-left {
+ background-image:url(../images/gray/qtip/tip-sprite.gif);
+}
+.x-tip .x-tip-top-right {
+ background-image:url(../images/gray/qtip/tip-sprite.gif);
+}
+.x-tip .x-tip-ft {
+ background-image:url(../images/gray/qtip/tip-sprite.gif);
+}
+.x-tip .x-tip-ft-left {
+ background-image:url(../images/gray/qtip/tip-sprite.gif);
+}
+.x-tip .x-tip-ft-right {
+ background-image:url(../images/gray/qtip/tip-sprite.gif);
+}
+.x-tip .x-tip-bd-left {
+ background-image:url(../images/gray/qtip/tip-sprite.gif);
+}
+.x-tip .x-tip-bd-right {
+ background-image:url(../images/gray/qtip/tip-sprite.gif);
+}
+
+/* Toolbars */
+
+.x-toolbar{
+ border-color:#d0d0d0;
+ background:#f0f4f5 url(../images/gray/toolbar/bg.gif) repeat-x top left;
+}
+.x-toolbar button {
+ color:#444;
+}
+.x-toolbar .x-btn-menu-arrow-wrap .x-btn-center button {
+ background-image:url(../images/gray/toolbar/btn-arrow.gif);
+}
+.x-toolbar .x-btn-text-icon .x-btn-menu-arrow-wrap .x-btn-center button {
+ background-image:url(../images/gray/toolbar/btn-arrow.gif);
+}
+.x-toolbar .x-btn-over .x-btn-left{
+ background-image:url(../images/gray/toolbar/tb-btn-sprite.gif);
+}
+.x-toolbar .x-btn-over .x-btn-right{
+ background-image:url(../images/gray/toolbar/tb-btn-sprite.gif);
+}
+.x-toolbar .x-btn-over .x-btn-center{
+ background-image:url(../images/gray/toolbar/tb-btn-sprite.gif);
+}
+.x-toolbar .x-btn-over button {
+ color:#111;
+}
+.x-toolbar .x-btn-click .x-btn-left, .x-toolbar .x-btn-pressed .x-btn-left, .x-toolbar .x-btn-menu-active .x-btn-left{
+ background-image:url(../images/gray/toolbar/tb-btn-sprite.gif);
+}
+.x-toolbar .x-btn-click .x-btn-right, .x-toolbar .x-btn-pressed .x-btn-right, .x-toolbar .x-btn-menu-active .x-btn-right{
+ background-image:url(../images/gray/toolbar/tb-btn-sprite.gif);
+}
+
+.x-toolbar .x-btn-click .x-btn-center, .x-toolbar .x-btn-pressed .x-btn-center, .x-toolbar .x-btn-menu-active .x-btn-center{
+ background-image:url(../images/gray/toolbar/tb-btn-sprite.gif);
+}
+.x-toolbar .xtb-sep {
+ background-image: url(../images/gray/grid/grid-split.gif);
+}
+
+/* Tabs */
+
+.x-tab-panel-header, .x-tab-panel-footer {
+ background: #EAEAEA;
+ border-color:#d0d0d0;
+}
+
+
+.x-tab-panel-header {
+ border-color:#d0d0d0;
+}
+
+.x-tab-panel-footer {
+ border-color:#d0d0d0;
+}
+
+ul.x-tab-strip-top{
+ background:#dbdbdb url(../images/gray/tabs/tab-strip-bg.gif) repeat-x left top;
+ border-color:#d0d0d0;
+ padding-top: 2px;
+}
+
+ul.x-tab-strip-bottom{
+ background-image:url(../images/gray/tabs/tab-strip-btm-bg.gif);
+ border-color:#d0d0d0;
+}
+
+.x-tab-strip span.x-tab-strip-text {
+ color:#333;
+}
+.x-tab-strip-over span.x-tab-strip-text {
+ color:#111;
+}
+
+.x-tab-strip-active span.x-tab-strip-text {
+ color:#333;
+}
+
+.x-tab-strip-disabled .x-tabs-text {
+ color:#aaaaaa;
+}
+
+.x-tab-strip-top .x-tab-right {
+ background-image:url(../images/gray/tabs/tabs-sprite.gif);
+}
+
+.x-tab-strip-top .x-tab-left {
+ background-image:url(../images/gray/tabs/tabs-sprite.gif);
+}
+.x-tab-strip-top .x-tab-strip-inner {
+ background-image:url(../images/gray/tabs/tabs-sprite.gif);
+}
+
+.x-tab-strip-bottom .x-tab-right {
+ background-image:url(../images/gray/tabs/tab-btm-inactive-right-bg.gif);
+}
+
+.x-tab-strip-bottom .x-tab-left {
+ background-image:url(../images/gray/tabs/tab-btm-inactive-left-bg.gif);
+}
+
+.x-tab-strip-bottom .x-tab-strip-active .x-tab-right {
+ background-image:url(../images/gray/tabs/tab-btm-right-bg.gif);
+}
+
+.x-tab-strip-bottom .x-tab-strip-active .x-tab-left {
+ background-image:url(../images/gray/tabs/tab-btm-left-bg.gif);
+}
+
+.x-tab-strip .x-tab-strip-closable a.x-tab-strip-close {
+ background-image:url(../images/gray/tabs/tab-close.gif);
+}
+.x-tab-strip .x-tab-strip-closable a.x-tab-strip-close:hover{
+ background-image:url(../images/gray/tabs/tab-close.gif);
+}
+
+.x-tab-panel-body {
+ border-color:#d0d0d0;
+ background:#fff;
+}
+.x-tab-panel-bbar .x-toolbar {
+ border-color: #d0d0d0;
+}
+
+.x-tab-panel-tbar .x-toolbar {
+ border-color: #d0d0d0;
+}
+
+.x-tab-panel-header-plain .x-tab-strip-spacer {
+ border-color:#d0d0d0;
+ background: #eaeaea;
+}
+
+.x-tab-scroller-left {
+ background-image: url(../images/gray/tabs/scroll-left.gif);
+ border-color:#aeaeae;
+}
+.x-tab-scroller-right {
+ background-image: url(../images/gray/tabs/scroll-right.gif);
+ border-color:#aeaeae;
+}
+
+/* Window */
+
+.x-window-proxy {
+ background:#e0e0e0;
+ border-color:#b0b0b0;
+}
+
+.x-window-tl .x-window-header {
+ color:#555;
+}
+.x-window-tc {
+ background-image:url(../images/gray/window/top-bottom.png);
+}
+.x-window-tl {
+ background-image:url(../images/gray/window/left-corners.png);
+}
+.x-window-tr {
+ background-image:url(../images/gray/window/right-corners.png);
+}
+.x-window-bc {
+ background-image:url(../images/gray/window/top-bottom.png);
+}
+.x-window-bl {
+ background-image:url(../images/gray/window/left-corners.png);
+}
+.x-window-br {
+ background-image:url(../images/gray/window/right-corners.png);
+}
+.x-window-mc {
+ border:1px solid #d0d0d0;
+ background:#e8e8e8;
+}
+
+.x-window-ml {
+ background-image:url(../images/gray/window/left-right.png);
+}
+.x-window-mr {
+ background-image:url(../images/gray/window/left-right.png);
+}
+.x-panel-ghost .x-window-tl {
+ border-color:#d0d0d0;
+}
+.x-panel-collapsed .x-window-tl {
+ border-color:#d0d0d0;
+}
+
+.x-window-plain .x-window-mc {
+ background: #e8e8e8;
+ border-right:1px solid #eee;
+ border-bottom:1px solid #eee;
+ border-top:1px solid #d0d0d0;
+ border-left:1px solid #d0d0d0;
+}
+
+.x-window-plain .x-window-body {
+ border-left:1px solid #eee;
+ border-top:1px solid #eee;
+ border-bottom:1px solid #d0d0d0;
+ border-right:1px solid #d0d0d0;
+ background:transparent !important;
+}
+
+body.x-body-masked .x-window-mc, body.x-body-masked .x-window-plain .x-window-mc {
+ background-color: #e4e4e4;
+}
+
+
+/* misc */
+.x-html-editor-wrap {
+ border-color:#d0d0d0;
+}
+
+/* Borders go last for specificity */
+.x-panel-noborder .x-panel-body-noborder {
+ border-width:0;
+}
+
+.x-panel-noborder .x-panel-header-noborder {
+ border-width:0;
+ border-bottom:1px solid #d0d0d0;
+}
+
+.x-panel-noborder .x-panel-tbar-noborder .x-toolbar {
+ border-width:0;
+ border-bottom:1px solid #d0d0d0;
+}
+
+.x-panel-noborder .x-panel-bbar-noborder .x-toolbar {
+ border-width:0;
+ border-top:1px solid #d0d0d0;
+}
+
+.x-window-noborder .x-window-mc {
+ border-width:0;
+}
+.x-window-plain .x-window-body-noborder {
+ border-width:0;
+}
+
+.x-tab-panel-noborder .x-tab-panel-body-noborder {
+ border-width:0;
+}
+
+.x-tab-panel-noborder .x-tab-panel-header-noborder {
+ border-top-width:0;
+ border-left-width:0;
+ border-right-width:0;
+}
+
+.x-tab-panel-noborder .x-tab-panel-footer-noborder {
+ border-bottom-width:0;
+ border-left-width:0;
+ border-right-width:0;
+}
+
+
+.x-tab-panel-bbar-noborder .x-toolbar {
+ border-width:0;
+ border-top:1px solid #d0d0d0;
+}
+
+.x-tab-panel-tbar-noborder .x-toolbar {
+ border-width:0;
+ border-bottom:1px solid #d0d0d0;
+}
+
+.x-spinner-field .x-form-spinner-up {
+ background-image: url('../images/gray/form/spinner.gif');
+}
+.x-spinner-field .x-form-spinner-down {
+ background-image: url('../images/gray/form/spinner.gif');
+}.x-accordion-hd {
+ background-color: #e5e5e5;
+}.x-border {
+ border: 1px solid #D0D0D0;
+}
+
+.x-layout-popup {
+ background-color: #F0F0F0;
+ border: 1px solid #D0D0D0;
+}
+
+.my-list {
+ border: 1px solid #D0D0D0;
+}
+
+.x-view {
+ border:1px solid #D0D0D0;
+}
+
+.x-menubar {
+ border-color: #D0D0D0;
+ background-color: #F0F0F0;
+ background-image: url(../images/gray/toolbar/bg.gif);
+}
+
+.x-menubar-item-active {
+ background-color: #D9E8FB;
+}
+
+.x-menubar-item-active {
+ background-color: #D9E8FB;
+}.x-date-right-icon {
+ background-image: url(../images/default/shared/right-btn.gif);
+ margin-right: 2px;
+ text-decoration: none !important;
+}
+
+.x-date-left-icon {
+ background-image: url(../images/default/shared/left-btn.gif);
+ margin-right: 2px;
+ text-decoration: none !important;
+}.my-tbl {
+ border: 1px solid #C6C5C5;
+}.my-treetbl {
+ border: 1px solid #C6C5C5;
+}
\ No newline at end of file
diff --git a/src/main/webapp/gxt/desktop/css/desktop.css b/src/main/webapp/gxt/desktop/css/desktop.css
new file mode 100755
index 0000000..0013ed9
--- /dev/null
+++ b/src/main/webapp/gxt/desktop/css/desktop.css
@@ -0,0 +1,638 @@
+/*
+ * Ext JS Library 2.1
+ * Copyright(c) 2006-2008, Ext JS, LLC.
+ * licensing@extjs.com
+ *
+ * http://extjs.com/license
+ */
+html,body {
+ background: #3d71b8 url(../wallpapers/desktop.jpg) no-repeat left top;
+ font: normal 12px tahoma, arial, verdana, sans-serif;
+ margin: 0;
+ padding: 0;
+ border: 0 none;
+ overflow: hidden;
+ height: 100%;
+}
+
+.start {
+ background-image: url( ../images/taskbar/black/startbutton-icon.gif ) !important;
+}
+
+.bogus {
+ background-image: url( ../images/bogus.png ) !important;
+}
+
+.logout {
+ background-image: url( ../images/logout.gif ) !important;
+}
+
+.settings {
+ background-image: url( ../images/gears.gif ) !important;
+}
+
+#dpanels {
+ width: 250px;
+ float: right;
+}
+
+#dpanels .x-panel {
+ margin: 15px;
+}
+
+#dpanels .x-date-picker {
+ border: 0 none;
+ border-top: 0 none;
+ background: transparent;
+}
+
+#dpanels .x-date-picker td.x-date-active {
+ background: #ffffff;
+}
+
+#dpanels .x-date-picker {
+ width: 100% !important;
+}
+
+#x-desktop {
+ width: 100%;
+ height: 100%;
+ border: 0 none;
+ position: relative;
+ overflow: hidden;
+ zoom: 1;
+}
+
+#ux-taskbar .x-btn {
+ float: left;
+ margin: 1px 0 0 1px;
+ position: relative;
+}
+
+#ux-taskbar-start .x-btn {
+ float: left;
+ margin: 0;
+ position: relative;
+}
+
+#ux-taskbar button { /* width: 150px;
+ overflow: hidden; */
+ text-align: left;
+ color: #ffffff;
+}
+
+#title-bar-wrapper {
+ height: 35px;
+}
+
+#title-bar {
+ color: #225599;
+ padding: 9px 7px;
+ font: bold 16px tahoma, arial, verdana, sans-serif;
+ float: left;
+}
+
+#x-logout {
+ float: right;
+ padding: 6px 7px;
+}
+
+.x-btn-text-icon .x-btn-center .logout {
+ background-position: 0pt 3px;
+ background-repeat: no-repeat;
+ padding: 3px 0pt 3px 18px;
+}
+
+#ux-taskbar {
+ background: transparent none;
+ height: 30px;
+ margin: 0;
+ padding: 0;
+ position: relative;
+ z-index: 12001;
+}
+
+.x-btn-icon .ux-taskbutton-center .x-btn-text {
+ background-position: center;
+ background-repeat: no-repeat;
+ height: 16px;
+ width: 16px;
+ cursor: pointer;
+ white-space: nowrap;
+ padding: 0;
+}
+
+.x-btn-icon .ux-taskbutton-center {
+ padding: 1px;
+}
+
+.ux-startbutton-center .x-btn-text {
+ color: #000000 !important;
+ font-weight: bold;
+}
+
+.ux-taskbutton-left,.ux-taskbutton-right {
+ font-size: 1px;
+ line-height: 1px;
+}
+
+.ux-taskbutton-left {
+ width: 4px;
+ height: 28px;
+ background: url( ../images/taskbar/black/taskbutton.gif ) no-repeat 0 0;
+}
+
+.ux-taskbutton-right {
+ width: 4px;
+ height: 28px;
+ background: url( ../images/taskbar/black/taskbutton.gif ) no-repeat 0 -28px;
+}
+
+.ux-taskbutton-left i,.ux-taskbutton-right i {
+ display: block;
+ width: 4px;
+ overflow: hidden;
+ font-size: 1px;
+ line-height: 1px;
+}
+
+.ux-taskbutton-center {
+ background: url( ../images/taskbar/black/taskbutton.gif ) repeat-x 0 -56px;
+ vertical-align: middle;
+ text-align: center;
+ padding: 0 5px;
+ cursor: pointer;
+ white-space: nowrap;
+}
+
+#ux-taskbar .ux-taskbutton-left {
+ background-position: 0 0;
+}
+
+#ux-taskbar .ux-taskbutton-right {
+ background-position: 0 -28px;
+}
+
+#ux-taskbar .ux-taskbutton-center {
+ background-position: 0 -56px;
+}
+
+#ux-taskbar .x-btn-over .ux-taskbutton-left {
+ background-position: 0 -252px;
+}
+
+#ux-taskbar .x-btn-over .ux-taskbutton-right {
+ background-position: 0 -280px;
+}
+
+#ux-taskbar .x-btn-over .ux-taskbutton-center {
+ background-position: 0 -308px;
+}
+
+#ux-taskbar .x-btn-click .ux-taskbutton-left {
+ background-position: 0 -168px;
+}
+
+#ux-taskbar .x-btn-click .ux-taskbutton-right {
+ background-position: 0 -196px;
+}
+
+#ux-taskbar .x-btn-click .ux-taskbutton-center {
+ background-position: 0 -224px;
+}
+
+#ux-taskbar .active-win .ux-taskbutton-left {
+ background-position: 0 -84px;
+}
+
+#ux-taskbar .active-win .ux-taskbutton-right {
+ background: url( ../images/taskbar/black/taskbutton.gif ) no-repeat 0 -112px;
+}
+
+#ux-taskbar .active-win .ux-taskbutton-center {
+ background: url( ../images/taskbar/black/taskbutton.gif ) repeat-x 0 -140px;
+}
+
+#ux-taskbar .active-win .ux-taskbutton-center button {
+ color: #fff;
+}
+
+#spacer {
+ height: 25px;
+ float: left;
+ width: 0;
+ overflow: hidden;
+ margin-top: 2px;
+}
+
+.x-window-body p,.x-panel-body p {
+ padding: 10px;
+ margin: 0;
+}
+
+.x-window-maximized .x-window-bc {
+ height: 0;
+}
+
+.add {
+ background-image: url(../../shared/icons/fam/add.gif) !important;
+}
+
+.option {
+ background-image: url(../../shared/icons/fam/plugin.gif) !important;
+}
+
+.remove {
+ background-image: url(../../shared/icons/fam/delete.gif) !important;
+}
+
+.tabs {
+ background-image: url(../images/tabs.gif) !important;
+}
+
+.ux-start-menu {
+ background: transparent none;
+ border: 0px none;
+ padding: 0;
+}
+
+.ux-start-menu-tl .x-window-header {
+ color: #f1f1f1;
+ font: bold 11px tahoma, arial, verdana, sans-serif;
+ padding: 5px 0 4px 0;
+}
+
+.x-panel-tl .x-panel-icon,.ux-start-menu-tl .x-panel-icon {
+ background-position: 0pt 4px;
+ background-repeat: no-repeat;
+ padding-left: 20px !important;
+}
+
+.ux-start-menu-tl {
+ background: transparent url( ../images/taskbar/black/start-menu-left-corners.png ) no-repeat 0 0;
+ padding-left: 6px;
+ zoom: 1;
+ z-index: 1;
+ position: relative;
+}
+
+.ux-start-menu-tr {
+ background: transparent url( ../images/taskbar/black/start-menu-right-corners.png ) no-repeat right
+ 0;
+ padding-right: 6px;
+}
+
+.ux-start-menu-tc {
+ background: transparent url( ../images/taskbar/black/start-menu-top-bottom.png ) repeat-x 0 0;
+ overflow: hidden;
+ zoom: 1;
+}
+
+.ux-start-menu-ml {
+ background: transparent url( ../images/taskbar/black/start-menu-left-right.png ) repeat-y 0 0;
+ padding-left: 6px;
+ zoom: 1;
+}
+
+.ux-start-menu-bc {
+ background: transparent url( ../images/taskbar/black/start-menu-top-bottom.png ) repeat-x 0 bottom;
+ zoom: 1;
+}
+
+.ux-start-menu-bc .x-window-footer {
+ padding-bottom: 6px;
+ zoom: 1;
+ font-size: 0;
+ line-height: 0;
+}
+
+.ux-start-menu-bl {
+ background: transparent url( ../images/taskbar/black/start-menu-left-corners.png ) no-repeat 0
+ bottom;
+ padding-left: 6px;
+ zoom: 1;
+}
+
+.ux-start-menu-br {
+ background: transparent url( ../images/taskbar/black/start-menu-right-corners.png ) no-repeat right
+ bottom;
+ padding-right: 6px;
+ zoom: 1;
+}
+
+.x-panel-nofooter .ux-start-menu-bc {
+ height: 6px;
+}
+
+.ux-start-menu-splitbar-h {
+ background-color: #d0d0d0;
+}
+
+.ux-start-menu-bwrap {
+ background: transparent none;
+ border: 0px none;
+}
+
+.ux-start-menu-body {
+ background: transparent none;
+ border: 0px none;
+}
+
+.ux-start-menu-apps-panel {
+ background: #ffffff none;
+ border: 1px solid #1e2124;
+}
+
+.ux-start-menu-tools-panel {
+ border: 0px none;
+ background: transparent url( ../images/taskbar/black/start-menu-right.png ) repeat-y scroll right
+ 0pt;
+}
+
+#ux-taskbar-start {
+ background: #000000 url( ../images/taskbar/black/taskbar-start-panel-bg.gif ) repeat-x left top;
+ left: 0px;
+ padding: 0;
+ position: absolute;
+}
+
+#ux-taskbar-start .x-toolbar {
+ background: none;
+ padding: 0px;
+ border: 0px none;
+}
+
+#ux-taskbuttons-panel {
+ background: #000000 url( ../images/taskbar/black/taskbuttons-panel-bg.gif ) repeat-x left top;
+ padding-top: 0;
+ position: relative;
+}
+
+.ux-taskbuttons-strip-wrap { /* overflow:hidden;
+ position:relative;
+ width:100%; */
+ width: 100%;
+ overflow: hidden;
+ position: relative;
+ zoom: 1;
+}
+
+ul.ux-taskbuttons-strip {
+ display: block;
+ width: 5000px;
+ zoom: 1;
+}
+
+ul.ux-taskbuttons-strip li {
+ float: left;
+ margin-left: 2px;
+}
+
+ul.ux-taskbuttons-strip li.ux-taskbuttons-edge {
+ float: left;
+ margin: 0 !important;
+ padding: 0 !important;
+ border: 0 none !important;
+ font-size: 1px !important;
+ line-height: 1px !important;
+ overflow: hidden;
+ zoom: 1;
+ background: transparent !important;
+ width: 1px;
+}
+
+.x-clear {
+ clear: both;
+ height: 0;
+ overflow: hidden;
+ line-height: 0;
+ font-size: 0;
+}
+
+.x-taskbuttons-scrolling {
+ position: relative;
+}
+
+.x-taskbuttons-scrolling .ux-taskbuttons-strip-wrap {
+ margin-left: 18px;
+ margin-right: 18px;
+}
+
+td.ux-taskButtons-edge { /*float:left;*/
+ margin: 0 !important;
+ padding: 0 !important;
+ border: 0 none !important;
+ font-size: 1px !important;
+ line-height: 1px !important;
+ overflow: hidden;
+ zoom: 1;
+ background: transparent !important;
+ width: 1px;
+}
+
+.ux-taskbuttons-scroller-left {
+ background: transparent url( ../images/taskbar/black/scroll-left.gif ) no-repeat -18px 0;
+ width: 18px;
+ position: absolute;
+ left: 1px;
+ top: 0px;
+ z-index: 10;
+ cursor: pointer;
+}
+
+.ux-taskbuttons-scroller-left-over {
+ background-position: 0 0;
+}
+
+.ux-taskbuttons-scroller-left-disabled {
+ background-position: -18px 0;
+ opacity: .5;
+ -moz-opacity: .5;
+ filter: alpha(opacity = 50);
+ cursor: default;
+}
+
+.ux-taskbuttons-scroller-right {
+ background: transparent url( ../images/taskbar/black/scroll-right.gif ) no-repeat 0 0;
+ width: 18px;
+ position: absolute;
+ right: 0;
+ top: 0px;
+ z-index: 10;
+ cursor: pointer;
+}
+
+.ux-taskbuttons-scroller-right-over {
+ background-position: -18px 0;
+}
+
+.ux-taskbuttons-scroller-right-disabled {
+ background-position: 0 0;
+ opacity: .5;
+ -moz-opacity: .5;
+ filter: alpha(opacity = 50);
+ cursor: default;
+}
+
+.ux-toolmenu-sep {
+ background-color: #18191a;
+ border-bottom: 1px solid #858789;
+ display: block;
+ font-size: 1px;
+ line-height: 1px;
+ margin: 2px 3px;
+}
+
+.ux-start-menu-tools-panel ul.x-menu-list li.x-menu-list-item a.x-menu-item {
+ color: #ffffff;
+}
+
+.ux-start-menu-tools-panel ul.x-menu-list li.x-menu-list-item .x-menu-item-active a.x-menu-item {
+ color: #000000;
+}
+
+.ux-start-menu-tools-panel .x-menu-item-active {
+ background: #525456 url( ../images/taskbar/black/item-over.gif ) repeat-x left bottom;
+ border: 1px solid #000000;
+ padding: 0;
+}
+
+#ux-taskbar .x-splitbar-h {
+ background: #000000 url( ../images/taskbar/black/taskbar-split-h.gif ) no-repeat 0 0;
+ width: 8px;
+}
+
+.x-window-header-text {
+ cursor: default;
+}
+
+/*
+ * Begin Start button
+ */
+.ux-startbutton-left,.ux-startbutton-right {
+ font-size: 1px;
+ line-height: 1px;
+}
+
+.ux-startbutton-left {
+ width: 10px;
+ height: 28px;
+ background: url( ../images/taskbar/black/startbutton.gif ) no-repeat 0 0;
+}
+
+.ux-startbutton-right {
+ width: 10px;
+ height: 30px;
+ background: url( ../images/taskbar/black/startbutton.gif ) no-repeat 0 -28px;
+}
+
+.ux-startbutton-left i,.ux-startbutton-right i {
+ display: block;
+ width: 10px;
+ overflow: hidden;
+ font-size: 1px;
+ line-height: 1px;
+}
+
+.ux-startbutton-center {
+ background: url( ../images/taskbar/black/startbutton.gif ) repeat-x 0 -56px;
+ vertical-align: middle;
+ text-align: center;
+ padding: 0;
+ cursor: pointer;
+ white-space: nowrap;
+}
+
+#ux-taskbar .ux-startbutton-left {
+ background-position: 0 0;
+}
+
+#ux-taskbar .ux-startbutton-right {
+ background-position: 0 -30px;
+}
+
+#ux-taskbar .ux-startbutton-center {
+ background-position: 0 -60px;
+}
+
+#ux-taskbar .x-btn-over .ux-startbutton-left {
+ background-position: 0 -270px;
+}
+
+#ux-taskbar .x-btn-over .ux-startbutton-right {
+ background-position: 0 -300px;
+}
+
+#ux-taskbar .x-btn-over .ux-startbutton-center {
+ background-position: 0 -330px;
+}
+
+#ux-taskbar .x-btn-click .ux-startbutton-left {
+ background-position: 0 -180px;
+}
+
+#ux-taskbar .x-btn-click .ux-startbutton-right {
+ background-position: 0 -210px;
+}
+
+#ux-taskbar .x-btn-click .ux-startbutton-center {
+ background-position: 0 -240px;
+}
+
+#ux-taskbar .active-win .ux-startbutton-left {
+ background-position: 0 -90px;
+}
+
+#ux-taskbar .active-win .ux-startbutton-right {
+ background: url( ../images/taskbar/black/startbutton.gif ) no-repeat 0 -120px;
+}
+
+#ux-taskbar .active-win .ux-startbutton-center {
+ background: url( ../images/taskbar/black/startbutton.gif ) repeat-x 0 -150px;
+}
+
+#ux-taskbar .active-win .ux-startbutton-center button {
+ color: #fff;
+}
+
+/*
+ * End Start button
+ */
+.x-resizable-proxy {
+ background: #C7DFFC;
+ opacity: .5;
+ -moz-opacity: .5;
+ filter: alpha(opacity = 50);
+ border: 1px solid #3b5a82;
+}
+
+/* Desktop Shortcuts */
+#x-shortcuts dt {
+ float: left;
+ margin: 15px 0 0 15px;
+ clear: left;
+ width: 64px;
+ font: normal 10px tahoma, arial, verdana, sans-serif;
+ text-align: center;
+ zoom: 1;
+ display: block;
+}
+
+#x-shortcuts dt a {
+ width: 64px;
+ display: block;
+ color: white;
+ text-decoration: none;
+}
+
+#x-shortcuts dt div {
+ width: 100%;
+ color: white;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ cursor: pointer;
+}
+
+#x-shortcuts dt a:hover {
+ text-decoration: underline;
+}
diff --git a/src/main/webapp/gxt/desktop/images/desktop.gif b/src/main/webapp/gxt/desktop/images/desktop.gif
new file mode 100755
index 0000000..f305cb6
Binary files /dev/null and b/src/main/webapp/gxt/desktop/images/desktop.gif differ
diff --git a/src/main/webapp/gxt/desktop/images/desktop3.jpg b/src/main/webapp/gxt/desktop/images/desktop3.jpg
new file mode 100755
index 0000000..daca8bc
Binary files /dev/null and b/src/main/webapp/gxt/desktop/images/desktop3.jpg differ
diff --git a/src/main/webapp/gxt/desktop/images/gears.gif b/src/main/webapp/gxt/desktop/images/gears.gif
new file mode 100755
index 0000000..2bf6bd7
Binary files /dev/null and b/src/main/webapp/gxt/desktop/images/gears.gif differ
diff --git a/src/main/webapp/gxt/desktop/images/gears.png b/src/main/webapp/gxt/desktop/images/gears.png
new file mode 100755
index 0000000..6acdc98
Binary files /dev/null and b/src/main/webapp/gxt/desktop/images/gears.png differ
diff --git a/src/main/webapp/gxt/desktop/images/grid.png b/src/main/webapp/gxt/desktop/images/grid.png
new file mode 100755
index 0000000..c4da495
Binary files /dev/null and b/src/main/webapp/gxt/desktop/images/grid.png differ
diff --git a/src/main/webapp/gxt/desktop/images/hatch.gif b/src/main/webapp/gxt/desktop/images/hatch.gif
new file mode 100755
index 0000000..6a044a8
Binary files /dev/null and b/src/main/webapp/gxt/desktop/images/hatch.gif differ
diff --git a/src/main/webapp/gxt/desktop/images/hd-bg.gif b/src/main/webapp/gxt/desktop/images/hd-bg.gif
new file mode 100755
index 0000000..f35a53f
Binary files /dev/null and b/src/main/webapp/gxt/desktop/images/hd-bg.gif differ
diff --git a/src/main/webapp/gxt/desktop/images/hd-tb-bg.gif b/src/main/webapp/gxt/desktop/images/hd-tb-bg.gif
new file mode 100755
index 0000000..f800edb
Binary files /dev/null and b/src/main/webapp/gxt/desktop/images/hd-tb-bg.gif differ
diff --git a/src/main/webapp/gxt/desktop/images/icon_padlock.png b/src/main/webapp/gxt/desktop/images/icon_padlock.png
new file mode 100755
index 0000000..92625ff
Binary files /dev/null and b/src/main/webapp/gxt/desktop/images/icon_padlock.png differ
diff --git a/src/main/webapp/gxt/desktop/images/icons-bg.png b/src/main/webapp/gxt/desktop/images/icons-bg.png
new file mode 100755
index 0000000..6557cbb
Binary files /dev/null and b/src/main/webapp/gxt/desktop/images/icons-bg.png differ
diff --git a/src/main/webapp/gxt/desktop/images/launcher-bg.gif b/src/main/webapp/gxt/desktop/images/launcher-bg.gif
new file mode 100755
index 0000000..c7cfd83
Binary files /dev/null and b/src/main/webapp/gxt/desktop/images/launcher-bg.gif differ
diff --git a/src/main/webapp/gxt/desktop/images/launcher-btn.gif b/src/main/webapp/gxt/desktop/images/launcher-btn.gif
new file mode 100755
index 0000000..a9a72d7
Binary files /dev/null and b/src/main/webapp/gxt/desktop/images/launcher-btn.gif differ
diff --git a/src/main/webapp/gxt/desktop/images/logout.gif b/src/main/webapp/gxt/desktop/images/logout.gif
new file mode 100755
index 0000000..a4f3738
Binary files /dev/null and b/src/main/webapp/gxt/desktop/images/logout.gif differ
diff --git a/src/main/webapp/gxt/desktop/images/logout.png b/src/main/webapp/gxt/desktop/images/logout.png
new file mode 100755
index 0000000..1fcb386
Binary files /dev/null and b/src/main/webapp/gxt/desktop/images/logout.png differ
diff --git a/src/main/webapp/gxt/desktop/images/member.gif b/src/main/webapp/gxt/desktop/images/member.gif
new file mode 100755
index 0000000..216c839
Binary files /dev/null and b/src/main/webapp/gxt/desktop/images/member.gif differ
diff --git a/src/main/webapp/gxt/desktop/images/member.png b/src/main/webapp/gxt/desktop/images/member.png
new file mode 100755
index 0000000..0f3657f
Binary files /dev/null and b/src/main/webapp/gxt/desktop/images/member.png differ
diff --git a/src/main/webapp/gxt/desktop/images/powered.gif b/src/main/webapp/gxt/desktop/images/powered.gif
new file mode 100755
index 0000000..8ce74b8
Binary files /dev/null and b/src/main/webapp/gxt/desktop/images/powered.gif differ
diff --git a/src/main/webapp/gxt/desktop/images/powered.png b/src/main/webapp/gxt/desktop/images/powered.png
new file mode 100755
index 0000000..5b2a0b8
Binary files /dev/null and b/src/main/webapp/gxt/desktop/images/powered.png differ
diff --git a/src/main/webapp/gxt/desktop/images/s.gif b/src/main/webapp/gxt/desktop/images/s.gif
new file mode 100755
index 0000000..1d11fa9
Binary files /dev/null and b/src/main/webapp/gxt/desktop/images/s.gif differ
diff --git a/src/main/webapp/gxt/desktop/images/taskbar/black/item-over.gif b/src/main/webapp/gxt/desktop/images/taskbar/black/item-over.gif
new file mode 100755
index 0000000..26c1fc2
Binary files /dev/null and b/src/main/webapp/gxt/desktop/images/taskbar/black/item-over.gif differ
diff --git a/src/main/webapp/gxt/desktop/images/taskbar/black/scroll-left.gif b/src/main/webapp/gxt/desktop/images/taskbar/black/scroll-left.gif
new file mode 100755
index 0000000..94fea48
Binary files /dev/null and b/src/main/webapp/gxt/desktop/images/taskbar/black/scroll-left.gif differ
diff --git a/src/main/webapp/gxt/desktop/images/taskbar/black/scroll-right.gif b/src/main/webapp/gxt/desktop/images/taskbar/black/scroll-right.gif
new file mode 100755
index 0000000..94b5669
Binary files /dev/null and b/src/main/webapp/gxt/desktop/images/taskbar/black/scroll-right.gif differ
diff --git a/src/main/webapp/gxt/desktop/images/taskbar/black/start-menu-left-corners.png b/src/main/webapp/gxt/desktop/images/taskbar/black/start-menu-left-corners.png
new file mode 100755
index 0000000..d6e5196
Binary files /dev/null and b/src/main/webapp/gxt/desktop/images/taskbar/black/start-menu-left-corners.png differ
diff --git a/src/main/webapp/gxt/desktop/images/taskbar/black/start-menu-left-right.png b/src/main/webapp/gxt/desktop/images/taskbar/black/start-menu-left-right.png
new file mode 100755
index 0000000..a577d1b
Binary files /dev/null and b/src/main/webapp/gxt/desktop/images/taskbar/black/start-menu-left-right.png differ
diff --git a/src/main/webapp/gxt/desktop/images/taskbar/black/start-menu-right-corners.png b/src/main/webapp/gxt/desktop/images/taskbar/black/start-menu-right-corners.png
new file mode 100755
index 0000000..b683301
Binary files /dev/null and b/src/main/webapp/gxt/desktop/images/taskbar/black/start-menu-right-corners.png differ
diff --git a/src/main/webapp/gxt/desktop/images/taskbar/black/start-menu-right.png b/src/main/webapp/gxt/desktop/images/taskbar/black/start-menu-right.png
new file mode 100755
index 0000000..e5fa2b8
Binary files /dev/null and b/src/main/webapp/gxt/desktop/images/taskbar/black/start-menu-right.png differ
diff --git a/src/main/webapp/gxt/desktop/images/taskbar/black/start-menu-top-bottom.png b/src/main/webapp/gxt/desktop/images/taskbar/black/start-menu-top-bottom.png
new file mode 100755
index 0000000..fbea3cb
Binary files /dev/null and b/src/main/webapp/gxt/desktop/images/taskbar/black/start-menu-top-bottom.png differ
diff --git a/src/main/webapp/gxt/desktop/images/taskbar/black/startbutton-icon.gif b/src/main/webapp/gxt/desktop/images/taskbar/black/startbutton-icon.gif
new file mode 100755
index 0000000..8dcd2d1
Binary files /dev/null and b/src/main/webapp/gxt/desktop/images/taskbar/black/startbutton-icon.gif differ
diff --git a/src/main/webapp/gxt/desktop/images/taskbar/black/startbutton.gif b/src/main/webapp/gxt/desktop/images/taskbar/black/startbutton.gif
new file mode 100755
index 0000000..683313e
Binary files /dev/null and b/src/main/webapp/gxt/desktop/images/taskbar/black/startbutton.gif differ
diff --git a/src/main/webapp/gxt/desktop/images/taskbar/black/taskbar-split-h.gif b/src/main/webapp/gxt/desktop/images/taskbar/black/taskbar-split-h.gif
new file mode 100755
index 0000000..13564ad
Binary files /dev/null and b/src/main/webapp/gxt/desktop/images/taskbar/black/taskbar-split-h.gif differ
diff --git a/src/main/webapp/gxt/desktop/images/taskbar/black/taskbar-start-panel-bg.gif b/src/main/webapp/gxt/desktop/images/taskbar/black/taskbar-start-panel-bg.gif
new file mode 100755
index 0000000..9794880
Binary files /dev/null and b/src/main/webapp/gxt/desktop/images/taskbar/black/taskbar-start-panel-bg.gif differ
diff --git a/src/main/webapp/gxt/desktop/images/taskbar/black/taskbutton.gif b/src/main/webapp/gxt/desktop/images/taskbar/black/taskbutton.gif
new file mode 100755
index 0000000..df13974
Binary files /dev/null and b/src/main/webapp/gxt/desktop/images/taskbar/black/taskbutton.gif differ
diff --git a/src/main/webapp/gxt/desktop/images/taskbar/black/taskbuttons-panel-bg.gif b/src/main/webapp/gxt/desktop/images/taskbar/black/taskbuttons-panel-bg.gif
new file mode 100755
index 0000000..0865c45
Binary files /dev/null and b/src/main/webapp/gxt/desktop/images/taskbar/black/taskbuttons-panel-bg.gif differ
diff --git a/src/main/webapp/gxt/desktop/images/winbar-bg.gif b/src/main/webapp/gxt/desktop/images/winbar-bg.gif
new file mode 100755
index 0000000..45295a6
Binary files /dev/null and b/src/main/webapp/gxt/desktop/images/winbar-bg.gif differ
diff --git a/src/main/webapp/gxt/desktop/images/winbar-btn.gif b/src/main/webapp/gxt/desktop/images/winbar-btn.gif
new file mode 100755
index 0000000..2c8c024
Binary files /dev/null and b/src/main/webapp/gxt/desktop/images/winbar-btn.gif differ
diff --git a/src/main/webapp/gxt/desktop/images/windows-bg.gif b/src/main/webapp/gxt/desktop/images/windows-bg.gif
new file mode 100755
index 0000000..396471e
Binary files /dev/null and b/src/main/webapp/gxt/desktop/images/windows-bg.gif differ
diff --git a/src/main/webapp/gxt/desktop/wallpapers/desktop.jpg b/src/main/webapp/gxt/desktop/wallpapers/desktop.jpg
new file mode 100755
index 0000000..8e1fcb0
Binary files /dev/null and b/src/main/webapp/gxt/desktop/wallpapers/desktop.jpg differ
diff --git a/src/main/webapp/gxt/flash/swfobject.js b/src/main/webapp/gxt/flash/swfobject.js
new file mode 100755
index 0000000..4b704c5
--- /dev/null
+++ b/src/main/webapp/gxt/flash/swfobject.js
@@ -0,0 +1,5 @@
+/* SWFObject v2.1
+ Copyright (c) 2007-2008 Geoff Stearns, Michael Williams, and Bobby van der Sluis
+ This software is released under the MIT License
+*/
+var swfobject=function(){var b="undefined",Q="object",n="Shockwave Flash",p="ShockwaveFlash.ShockwaveFlash",P="application/x-shockwave-flash",m="SWFObjectExprInst",j=window,K=document,T=navigator,o=[],N=[],i=[],d=[],J,Z=null,M=null,l=null,e=false,A=false;var h=function(){var v=typeof K.getElementById!=b&&typeof K.getElementsByTagName!=b&&typeof K.createElement!=b,AC=[0,0,0],x=null;if(typeof T.plugins!=b&&typeof T.plugins[n]==Q){x=T.plugins[n].description;if(x&&!(typeof T.mimeTypes!=b&&T.mimeTypes[P]&&!T.mimeTypes[P].enabledPlugin)){x=x.replace(/^.*\s+(\S+\s+\S+$)/,"$1");AC[0]=parseInt(x.replace(/^(.*)\..*$/,"$1"),10);AC[1]=parseInt(x.replace(/^.*\.(.*)\s.*$/,"$1"),10);AC[2]=/r/.test(x)?parseInt(x.replace(/^.*r(.*)$/,"$1"),10):0}}else{if(typeof j.ActiveXObject!=b){var y=null,AB=false;try{y=new ActiveXObject(p+".7")}catch(t){try{y=new ActiveXObject(p+".6");AC=[6,0,21];y.AllowScriptAccess="always"}catch(t){if(AC[0]==6){AB=true}}if(!AB){try{y=new ActiveXObject(p)}catch(t){}}}if(!AB&&y){try{x=y.GetVariable("$version");if(x){x=x.split(" ")[1].split(",");AC=[parseInt(x[0],10),parseInt(x[1],10),parseInt(x[2],10)]}}catch(t){}}}}var AD=T.userAgent.toLowerCase(),r=T.platform.toLowerCase(),AA=/webkit/.test(AD)?parseFloat(AD.replace(/^.*webkit\/(\d+(\.\d+)?).*$/,"$1")):false,q=false,z=r?/win/.test(r):/win/.test(AD),w=r?/mac/.test(r):/mac/.test(AD);/*@cc_on q=true;@if(@_win32)z=true;@elif(@_mac)w=true;@end@*/return{w3cdom:v,pv:AC,webkit:AA,ie:q,win:z,mac:w}}();var L=function(){if(!h.w3cdom){return }f(H);if(h.ie&&h.win){try{K.write("