← Back to team overview

dhis2-devs team mailing list archive

[Branch ~dhis2-devs-core/dhis2/trunk] Rev 5492: (DV) Favorites implemented. Work in progress.

 

Merge authors:
  Jan Henrik Øverland (janhenrik-overland)
------------------------------------------------------------
revno: 5492 [merge]
committer: Jan Henrik Overland <janhenrik.overland@xxxxxxxxx>
branch nick: dhis2
timestamp: Mon 2011-12-19 23:32:46 +0100
message:
  (DV) Favorites implemented. Work in progress.
removed:
  dhis-2/dhis-web/dhis-web-visualizer/src/main/java/org/hisp/dhis/visualizer/action/GetAggregatedDataValuesAction.java
  dhis-2/dhis-web/dhis-web-visualizer/src/main/java/org/hisp/dhis/visualizer/action/GetAggregatedDataValuesPluginAction.java
  dhis-2/dhis-web/dhis-web-visualizer/src/main/java/org/hisp/dhis/visualizer/action/GetAggregatedIndicatorValuesAction.java
  dhis-2/dhis-web/dhis-web-visualizer/src/main/java/org/hisp/dhis/visualizer/action/GetAggregatedIndicatorValuesPluginAction.java
  dhis-2/dhis-web/dhis-web-visualizer/src/main/webapp/dhis-web-visualizer/jsonminAggregatedDataValues.vm
  dhis-2/dhis-web/dhis-web-visualizer/src/main/webapp/dhis-web-visualizer/jsonminAggregatedDataValuesPlugin.vm
  dhis-2/dhis-web/dhis-web-visualizer/src/main/webapp/dhis-web-visualizer/jsonminAggregatedIndicatorValues.vm
  dhis-2/dhis-web/dhis-web-visualizer/src/main/webapp/dhis-web-visualizer/jsonminAggregatedIndicatorValuesPlugin.vm
added:
  dhis-2/dhis-web/dhis-web-visualizer/src/main/java/org/hisp/dhis/visualizer/action/AddOrUpdateChartAction.java
  dhis-2/dhis-web/dhis-web-visualizer/src/main/java/org/hisp/dhis/visualizer/action/DeleteChartsAction.java
  dhis-2/dhis-web/dhis-web-visualizer/src/main/webapp/dhis-web-visualizer/app/images/datatable2.png
  dhis-2/dhis-web/dhis-web-visualizer/src/main/webapp/dhis-web-visualizer/app/images/edit.png
  dhis-2/dhis-web/dhis-web-visualizer/src/main/webapp/dhis-web-visualizer/app/images/favorite.png
  dhis-2/dhis-web/dhis-web-visualizer/src/main/webapp/dhis-web-visualizer/app/images/pdf2.png
  dhis-2/dhis-web/dhis-web-visualizer/src/main/webapp/dhis-web-visualizer/app/images/png2.png
modified:
  dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/startup/TableAlteror.java
  dhis-2/dhis-services/dhis-service-reporting/src/main/resources/org/hisp/dhis/chart/hibernate/Chart.hbm.xml
  dhis-2/dhis-web/dhis-web-visualizer/src/main/java/org/hisp/dhis/visualizer/action/InitializeAction.java
  dhis-2/dhis-web/dhis-web-visualizer/src/main/resources/META-INF/dhis/beans.xml
  dhis-2/dhis-web/dhis-web-visualizer/src/main/resources/struts.xml
  dhis-2/dhis-web/dhis-web-visualizer/src/main/webapp/dhis-web-visualizer/app/app.js
  dhis-2/dhis-web/dhis-web-visualizer/src/main/webapp/dhis-web-visualizer/app/css/style.css
  dhis-2/dhis-web/dhis-web-visualizer/src/main/webapp/dhis-web-visualizer/app/images/datatable.png
  dhis-2/dhis-web/dhis-web-visualizer/src/main/webapp/dhis-web-visualizer/app/images/pdf.png
  dhis-2/dhis-web/dhis-web-visualizer/src/main/webapp/dhis-web-visualizer/app/images/png.png
  dhis-2/dhis-web/dhis-web-visualizer/src/main/webapp/dhis-web-visualizer/app/lib/ext/resources/themes/images/gray/form/text-bg.gif
  dhis-2/dhis-web/dhis-web-visualizer/src/main/webapp/dhis-web-visualizer/jsonInitialize.vm


--
lp:dhis2
https://code.launchpad.net/~dhis2-devs-core/dhis2/trunk

Your team DHIS 2 developers is subscribed to branch lp:dhis2.
To unsubscribe from this branch go to https://code.launchpad.net/~dhis2-devs-core/dhis2/trunk/+edit-subscription
=== modified file 'dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/startup/TableAlteror.java'
--- dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/startup/TableAlteror.java	2011-12-15 11:34:43 +0000
+++ dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/startup/TableAlteror.java	2011-12-19 19:04:38 +0000
@@ -262,6 +262,7 @@
         executeSql( "ALTER TABLE chart DROP COLUMN individualmonthsthisyear" );
         executeSql( "ALTER TABLE chart DROP COLUMN individualquartersthisyear" );
         executeSql( "ALTER TABLE chart RENAME COLUMN title TO name" );
+        executeSql( "ALTER TABLE chart ALTER COLUMN dimension DROP NOT NULL" );
 
         executeSql( "ALTER TABLE datamartexport DROP COLUMN last3months" );
         executeSql( "ALTER TABLE datamartexport DROP COLUMN last6months" );

=== modified file 'dhis-2/dhis-services/dhis-service-reporting/src/main/resources/org/hisp/dhis/chart/hibernate/Chart.hbm.xml'
--- dhis-2/dhis-services/dhis-service-reporting/src/main/resources/org/hisp/dhis/chart/hibernate/Chart.hbm.xml	2011-12-06 17:41:41 +0000
+++ dhis-2/dhis-services/dhis-service-reporting/src/main/resources/org/hisp/dhis/chart/hibernate/Chart.hbm.xml	2011-12-15 11:07:16 +0000
@@ -91,12 +91,19 @@
 
     <component name="relatives">
       <property name="reportingMonth" />
+      <property name="reportingBimonth" />
+      <property name="reportingQuarter" />
       <property name="monthsThisYear" />
       <property name="quartersThisYear" />
       <property name="thisYear" />
       <property name="monthsLastYear" />
       <property name="quartersLastYear" />
       <property name="lastYear" />
+      <property name="last5Years" />
+      <property name="last12Months" />
+      <property name="last6BiMonths" />
+      <property name="last4Quarters" />
+      <property name="last2SixMonths" />
     </component>
 
     <property name="userOrganisationUnit" not-null="true" />

=== added file 'dhis-2/dhis-web/dhis-web-visualizer/src/main/java/org/hisp/dhis/visualizer/action/AddOrUpdateChartAction.java'
--- dhis-2/dhis-web/dhis-web-visualizer/src/main/java/org/hisp/dhis/visualizer/action/AddOrUpdateChartAction.java	1970-01-01 00:00:00 +0000
+++ dhis-2/dhis-web/dhis-web-visualizer/src/main/java/org/hisp/dhis/visualizer/action/AddOrUpdateChartAction.java	2011-12-19 21:47:47 +0000
@@ -0,0 +1,285 @@
+package org.hisp.dhis.visualizer.action;
+
+/*
+ * Copyright (c) 2004-2010, University of Oslo
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ * * Redistributions of source code must retain the above copyright notice, this
+ *   list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright notice,
+ *   this list of conditions and the following disclaimer in the documentation
+ *   and/or other materials provided with the distribution.
+ * * Neither the name of the HISP project nor the names of its contributors may
+ *   be used to endorse or promote products derived from this software without
+ *   specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+ * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+import java.util.ArrayList;
+import java.util.Collection;
+
+import org.hisp.dhis.chart.Chart;
+import org.hisp.dhis.chart.ChartService;
+import org.hisp.dhis.dataelement.DataElement;
+import org.hisp.dhis.dataelement.DataElementService;
+import org.hisp.dhis.indicator.Indicator;
+import org.hisp.dhis.indicator.IndicatorService;
+import org.hisp.dhis.organisationunit.OrganisationUnit;
+import org.hisp.dhis.organisationunit.OrganisationUnitService;
+import org.hisp.dhis.period.RelativePeriods;
+
+import com.opensymphony.xwork2.Action;
+
+/**
+ * @author Jan Henrik Overland
+ */
+public class AddOrUpdateChartAction
+    implements Action
+{
+    // -------------------------------------------------------------------------
+    // Dependencies
+    // -------------------------------------------------------------------------
+
+    private ChartService chartService;
+
+    public void setChartService( ChartService chartService )
+    {
+        this.chartService = chartService;
+    }
+
+    private IndicatorService indicatorService;
+
+    public void setIndicatorService( IndicatorService indicatorService )
+    {
+        this.indicatorService = indicatorService;
+    }
+
+    private DataElementService dataElementService;
+
+    public void setDataElementService( DataElementService dataElementService )
+    {
+        this.dataElementService = dataElementService;
+    }
+
+    private OrganisationUnitService organisationUnitService;
+
+    public void setOrganisationUnitService( OrganisationUnitService organisationUnitService )
+    {
+        this.organisationUnitService = organisationUnitService;
+    }
+
+    // -------------------------------------------------------------------------
+    // Input
+    // -------------------------------------------------------------------------
+
+    private String uid;
+
+    public void setUid( String uid )
+    {
+        this.uid = uid;
+    }
+
+    private String name;
+
+    public void setName( String name )
+    {
+        this.name = name;
+    }
+
+    private String type;
+
+    public void setType( String type )
+    {
+        this.type = type;
+    }
+
+    private String series;
+
+    public void setSeries( String series )
+    {
+        this.series = series;
+    }
+
+    private String category;
+
+    public void setCategory( String category )
+    {
+        this.category = category;
+    }
+
+    private String filter;
+
+    public void setFilter( String filter )
+    {
+        this.filter = filter;
+    }
+
+    private Collection<Integer> indicatorIds;
+
+    public void setIndicatorIds( Collection<Integer> indicatorIds )
+    {
+        this.indicatorIds = indicatorIds;
+    }
+
+    private Collection<Integer> dataElementIds;
+
+    public void setDataElementIds( Collection<Integer> dataElementIds )
+    {
+        this.dataElementIds = dataElementIds;
+    }
+
+    private boolean lastMonth;
+
+    public void setLastMonth( boolean lastMonth )
+    {
+        this.lastMonth = lastMonth;
+    }
+
+    private boolean last12Months;
+
+    public void setLast12Months( boolean last12Months )
+    {
+        this.last12Months = last12Months;
+    }
+
+    private boolean lastQuarter;
+
+    public void setLastQuarter( boolean lastQuarter )
+    {
+        this.lastQuarter = lastQuarter;
+    }
+
+    private boolean last4Quarters;
+
+    public void setLast4Quarters( boolean last4Quarters )
+    {
+        this.last4Quarters = last4Quarters;
+    }
+
+    private boolean lastSixMonth;
+
+    public void setLastSixMonth( boolean lastSixMonth )
+    {
+        this.lastSixMonth = lastSixMonth;
+    }
+
+    private boolean last2SixMonths;
+
+    public void setLast2SixMonths( boolean last2SixMonths )
+    {
+        this.last2SixMonths = last2SixMonths;
+    }
+
+    private boolean thisYear;
+
+    public void setThisYear( boolean thisYear )
+    {
+        this.thisYear = thisYear;
+    }
+
+    private boolean last5Years;
+
+    public void setLast5Years( boolean last5Years )
+    {
+        this.last5Years = last5Years;
+    }
+
+    private Collection<Integer> organisationUnitIds;
+
+    public void setOrganisationUnitIds( Collection<Integer> organisationUnitIds )
+    {
+        this.organisationUnitIds = organisationUnitIds;
+    }
+
+    // -------------------------------------------------------------------------
+    // Action implementation
+    // -------------------------------------------------------------------------
+
+    public String execute()
+        throws Exception
+    {
+        Chart chart = null;
+
+        if ( uid != null )
+        {
+            chart = chartService.getChart( uid );
+        }
+        else
+        {
+            chart = new Chart();
+        }
+
+        if ( name != null )
+        {
+            chart.setName( name );
+        }
+
+        if ( type != null )
+        {
+            chart.setType( type );
+        }
+
+        if ( series != null )
+        {
+            chart.setSeries( series );
+        }
+
+        if ( category != null )
+        {
+            chart.setCategory( category );
+        }
+
+        if ( filter != null )
+        {
+            chart.setFilter( filter );
+        }
+
+        if ( indicatorIds != null )
+        {
+            chart.setIndicators( new ArrayList<Indicator>( indicatorService.getIndicators( indicatorIds ) ) );
+        }
+
+        if ( dataElementIds != null )
+        {
+            chart.setDataElements( new ArrayList<DataElement>( dataElementService.getDataElements( dataElementIds ) ) );
+        }
+
+        if ( lastMonth || last12Months || lastQuarter || last4Quarters || lastSixMonth || last2SixMonths
+            || thisYear || last5Years )
+        {
+            RelativePeriods rp = new RelativePeriods();
+            rp.setReportingMonth( lastMonth );
+            rp.setLast12Months( last12Months );
+            rp.setReportingQuarter( lastQuarter );
+            rp.setLast4Quarters( last4Quarters );
+            rp.setLastSixMonth( lastSixMonth );
+            rp.setLast2SixMonths( last2SixMonths );
+            rp.setThisYear( thisYear );
+            rp.setLast5Years( last5Years );
+
+            chart.setRelatives( rp );
+        }
+
+        if ( organisationUnitIds != null )
+        {
+            chart.setOrganisationUnits( new ArrayList<OrganisationUnit>( organisationUnitService
+                .getOrganisationUnits( organisationUnitIds ) ) );
+        }
+
+        chartService.saveOrUpdate( chart );
+
+        return SUCCESS;
+    }
+}

=== added file 'dhis-2/dhis-web/dhis-web-visualizer/src/main/java/org/hisp/dhis/visualizer/action/DeleteChartsAction.java'
--- dhis-2/dhis-web/dhis-web-visualizer/src/main/java/org/hisp/dhis/visualizer/action/DeleteChartsAction.java	1970-01-01 00:00:00 +0000
+++ dhis-2/dhis-web/dhis-web-visualizer/src/main/java/org/hisp/dhis/visualizer/action/DeleteChartsAction.java	2011-12-14 19:46:03 +0000
@@ -0,0 +1,79 @@
+package org.hisp.dhis.visualizer.action;
+
+/*
+ * Copyright (c) 2004-2010, University of Oslo
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ * * Redistributions of source code must retain the above copyright notice, this
+ *   list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright notice,
+ *   this list of conditions and the following disclaimer in the documentation
+ *   and/or other materials provided with the distribution.
+ * * Neither the name of the HISP project nor the names of its contributors may
+ *   be used to endorse or promote products derived from this software without
+ *   specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+ * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+import java.util.Collection;
+import org.hisp.dhis.chart.ChartService;
+import com.opensymphony.xwork2.Action;
+
+/**
+ * @author Jan Henrik Overland
+ */
+public class DeleteChartsAction
+    implements Action
+{
+    // -------------------------------------------------------------------------
+    // Dependencies
+    // -------------------------------------------------------------------------
+    
+    private ChartService chartService;
+
+    public void setChartService( ChartService chartService )
+    {
+        this.chartService = chartService;
+    }
+
+    // -------------------------------------------------------------------------
+    // Input
+    // -------------------------------------------------------------------------
+
+    private Collection<String> uids;
+
+    public void setUids( Collection<String> uids )
+    {
+        this.uids = uids;
+    }
+
+    // -------------------------------------------------------------------------
+    // Action implementation
+    // -------------------------------------------------------------------------
+
+    public String execute()
+        throws Exception
+    {
+        if ( uids != null )
+        {
+            for ( String uid : uids )
+            {
+                chartService.deleteChart( chartService.getChart( uid ) );
+            }
+        }
+
+        return SUCCESS;
+    }
+}

=== removed file 'dhis-2/dhis-web/dhis-web-visualizer/src/main/java/org/hisp/dhis/visualizer/action/GetAggregatedDataValuesAction.java'
--- dhis-2/dhis-web/dhis-web-visualizer/src/main/java/org/hisp/dhis/visualizer/action/GetAggregatedDataValuesAction.java	2011-12-06 17:41:41 +0000
+++ dhis-2/dhis-web/dhis-web-visualizer/src/main/java/org/hisp/dhis/visualizer/action/GetAggregatedDataValuesAction.java	1970-01-01 00:00:00 +0000
@@ -1,105 +0,0 @@
-package org.hisp.dhis.visualizer.action;
-
-/*
- * Copyright (c) 2004-2010, University of Oslo
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- * * Redistributions of source code must retain the above copyright notice, this
- *   list of conditions and the following disclaimer.
- * * Redistributions in binary form must reproduce the above copyright notice,
- *   this list of conditions and the following disclaimer in the documentation
- *   and/or other materials provided with the distribution.
- * * Neither the name of the HISP project nor the names of its contributors may
- *   be used to endorse or promote products derived from this software without
- *   specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
- * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-import java.util.Collection;
-
-import org.hisp.dhis.aggregation.AggregatedDataValue;
-import org.hisp.dhis.aggregation.AggregatedDataValueService;
-
-import com.opensymphony.xwork2.Action;
-
-/**
- * @author Jan Henrik Overland
- */
-public class GetAggregatedDataValuesAction
-    implements Action
-{
-    // -------------------------------------------------------------------------
-    // Dependencies
-    // -------------------------------------------------------------------------
-
-    private AggregatedDataValueService aggregatedDataValueService;
-
-    public void setAggregatedDataValueService( AggregatedDataValueService aggregatedDataValueService )
-    {
-        this.aggregatedDataValueService = aggregatedDataValueService;
-    }
-
-    // -------------------------------------------------------------------------
-    // Input
-    // -------------------------------------------------------------------------
-
-    private Collection<Integer> dataElementIds;
-
-    public void setDataElementIds( Collection<Integer> dataElementIds )
-    {
-        this.dataElementIds = dataElementIds;
-    }
-
-    private Collection<Integer> periodIds;
-
-    public void setPeriodIds( Collection<Integer> periodIds )
-    {
-        this.periodIds = periodIds;
-    }
-
-    private Collection<Integer> organisationUnitIds;
-
-    public void setOrganisationUnitIds( Collection<Integer> organisationUnitIds )
-    {
-        this.organisationUnitIds = organisationUnitIds;
-    }
-
-    // -------------------------------------------------------------------------
-    // Output
-    // -------------------------------------------------------------------------
-
-    private Collection<AggregatedDataValue> object;
-
-    public Collection<AggregatedDataValue> getObject()
-    {
-        return object;
-    }
-
-    // -------------------------------------------------------------------------
-    // Action implementation
-    // -------------------------------------------------------------------------
-
-    public String execute()
-        throws Exception
-    {
-        if ( dataElementIds != null && periodIds != null && organisationUnitIds != null )
-        {
-            object = aggregatedDataValueService
-                .getAggregatedDataValueTotals( dataElementIds, periodIds, organisationUnitIds );
-        }
-
-        return SUCCESS;
-    }
-}

=== removed file 'dhis-2/dhis-web/dhis-web-visualizer/src/main/java/org/hisp/dhis/visualizer/action/GetAggregatedDataValuesPluginAction.java'
--- dhis-2/dhis-web/dhis-web-visualizer/src/main/java/org/hisp/dhis/visualizer/action/GetAggregatedDataValuesPluginAction.java	2011-12-06 15:57:32 +0000
+++ dhis-2/dhis-web/dhis-web-visualizer/src/main/java/org/hisp/dhis/visualizer/action/GetAggregatedDataValuesPluginAction.java	1970-01-01 00:00:00 +0000
@@ -1,227 +0,0 @@
-package org.hisp.dhis.visualizer.action;
-
-/*
- * Copyright (c) 2004-2010, University of Oslo
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- * * Redistributions of source code must retain the above copyright notice, this
- *   list of conditions and the following disclaimer.
- * * Redistributions in binary form must reproduce the above copyright notice,
- *   this list of conditions and the following disclaimer in the documentation
- *   and/or other materials provided with the distribution.
- * * Neither the name of the HISP project nor the names of its contributors may
- *   be used to endorse or promote products derived from this software without
- *   specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
- * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-import java.util.ArrayList;
-import java.util.Collection;
-
-import org.hisp.dhis.aggregation.AggregatedDataValue;
-import org.hisp.dhis.aggregation.AggregatedDataValueService;
-import org.hisp.dhis.dataelement.DataElementService;
-import org.hisp.dhis.i18n.I18nFormat;
-import org.hisp.dhis.organisationunit.OrganisationUnitService;
-import org.hisp.dhis.period.Period;
-import org.hisp.dhis.period.PeriodService;
-import org.hisp.dhis.period.RelativePeriods;
-
-import com.opensymphony.xwork2.Action;
-
-/**
- * @author Jan Henrik Overland
- */
-public class GetAggregatedDataValuesPluginAction
-    implements Action
-{
-    // -------------------------------------------------------------------------
-    // Dependencies
-    // -------------------------------------------------------------------------
-
-    private AggregatedDataValueService aggregatedDataValueService;
-
-    public void setAggregatedDataValueService( AggregatedDataValueService aggregatedDataValueService )
-    {
-        this.aggregatedDataValueService = aggregatedDataValueService;
-    }
-
-    private DataElementService dataElementService;
-
-    public void setDataElementService( DataElementService dataElementService )
-    {
-        this.dataElementService = dataElementService;
-    }
-
-    private PeriodService periodService;
-
-    public void setPeriodService( PeriodService periodService )
-    {
-        this.periodService = periodService;
-    }
-
-    private OrganisationUnitService organisationUnitService;
-
-    public void setOrganisationUnitService( OrganisationUnitService organisationUnitService )
-    {
-        this.organisationUnitService = organisationUnitService;
-    }
-
-    private I18nFormat format;
-
-    public void setFormat( I18nFormat format )
-    {
-        this.format = format;
-    }
-
-    // -------------------------------------------------------------------------
-    // Input
-    // -------------------------------------------------------------------------
-
-    private Collection<Integer> dataElementIds;
-
-    public void setDataElementIds( Collection<Integer> dataElementIds )
-    {
-        this.dataElementIds = dataElementIds;
-    }
-
-    private Collection<Integer> organisationUnitIds;
-
-    public void setOrganisationUnitIds( Collection<Integer> organisationUnitIds )
-    {
-        this.organisationUnitIds = organisationUnitIds;
-    }
-
-    private boolean lastMonth;
-
-    public void setLastMonth( boolean lastMonth )
-    {
-        this.lastMonth = lastMonth;
-    }
-
-    private boolean monthsThisYear;
-
-    public void setMonthsThisYear( boolean monthsThisYear )
-    {
-        this.monthsThisYear = monthsThisYear;
-    }
-
-    private boolean monthsLastYear;
-
-    public void setMonthsLastYear( boolean monthsLastYear )
-    {
-        this.monthsLastYear = monthsLastYear;
-    }
-
-    private boolean lastQuarter;
-
-    public void setLastQuarter( boolean lastQuarter )
-    {
-        this.lastQuarter = lastQuarter;
-    }
-
-    private boolean quartersThisYear;
-
-    public void setQuartersThisYear( boolean quartersThisYear )
-    {
-        this.quartersThisYear = quartersThisYear;
-    }
-
-    private boolean quartersLastYear;
-
-    public void setQuartersLastYear( boolean quartersLastYear )
-    {
-        this.quartersLastYear = quartersLastYear;
-    }
-
-    private boolean thisYear;
-
-    public void setThisYear( boolean thisYear )
-    {
-        this.thisYear = thisYear;
-    }
-
-    private boolean lastYear;
-
-    public void setLastYear( boolean lastYear )
-    {
-        this.lastYear = lastYear;
-    }
-
-    private boolean lastFiveYears;
-
-    public void setLastFiveYears( boolean lastFiveYears )
-    {
-        this.lastFiveYears = lastFiveYears;
-    }
-
-    // -------------------------------------------------------------------------
-    // Output
-    // -------------------------------------------------------------------------
-
-    private Collection<AggregatedDataValue> object;
-
-    public Collection<AggregatedDataValue> getObject()
-    {
-        return object;
-    }
-
-    // -------------------------------------------------------------------------
-    // Action implementation
-    // -------------------------------------------------------------------------
-
-    public String execute()
-        throws Exception
-    {
-        if ( dataElementIds != null
-            && organisationUnitIds != null
-            && (lastMonth || monthsThisYear || monthsLastYear || lastQuarter || quartersThisYear || quartersLastYear
-                || thisYear || lastYear || lastFiveYears) )
-        {
-            RelativePeriods rp = new RelativePeriods();
-            rp.setReportingMonth( lastMonth );
-            rp.setMonthsThisYear( monthsThisYear );
-            rp.setMonthsLastYear( monthsLastYear );
-            rp.setReportingQuarter( lastQuarter );
-            rp.setQuartersThisYear( quartersThisYear );
-            rp.setQuartersLastYear( quartersLastYear );
-            rp.setThisYear( thisYear );
-            rp.setLastYear( lastYear );
-            rp.setLast5Years( lastFiveYears );
-
-            Collection<Period> periods = rp.getRelativePeriods();
-
-            Collection<Integer> periodIds = new ArrayList<Integer>();
-
-            for ( Period period : periods )
-            {
-                periodIds.add( period.getId() );
-            }
-
-            object = aggregatedDataValueService
-                .getAggregatedDataValueTotals( dataElementIds, periodIds, organisationUnitIds );
-
-            for ( AggregatedDataValue value : object )
-            {
-                value.setDataElementName( dataElementService.getDataElement( value.getDataElementId() ).getName() );
-                value.setPeriodName( format.formatPeriod( periodService.getPeriod( value.getPeriodId() ) ) );
-                value.setOrganisationUnitName( organisationUnitService.getOrganisationUnit(
-                    value.getOrganisationUnitId() ).getName() );
-            }
-        }
-
-        return SUCCESS;
-    }
-}

=== removed file 'dhis-2/dhis-web/dhis-web-visualizer/src/main/java/org/hisp/dhis/visualizer/action/GetAggregatedIndicatorValuesAction.java'
--- dhis-2/dhis-web/dhis-web-visualizer/src/main/java/org/hisp/dhis/visualizer/action/GetAggregatedIndicatorValuesAction.java	2011-11-21 12:44:20 +0000
+++ dhis-2/dhis-web/dhis-web-visualizer/src/main/java/org/hisp/dhis/visualizer/action/GetAggregatedIndicatorValuesAction.java	1970-01-01 00:00:00 +0000
@@ -1,105 +0,0 @@
-package org.hisp.dhis.visualizer.action;
-
-/*
- * Copyright (c) 2004-2010, University of Oslo
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- * * Redistributions of source code must retain the above copyright notice, this
- *   list of conditions and the following disclaimer.
- * * Redistributions in binary form must reproduce the above copyright notice,
- *   this list of conditions and the following disclaimer in the documentation
- *   and/or other materials provided with the distribution.
- * * Neither the name of the HISP project nor the names of its contributors may
- *   be used to endorse or promote products derived from this software without
- *   specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
- * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-import java.util.Collection;
-
-import org.hisp.dhis.aggregation.AggregatedDataValueService;
-import org.hisp.dhis.aggregation.AggregatedIndicatorValue;
-
-import com.opensymphony.xwork2.Action;
-
-/**
- * @author Jan Henrik Overland
- */
-public class GetAggregatedIndicatorValuesAction
-    implements Action
-{
-    // -------------------------------------------------------------------------
-    // Dependencies
-    // -------------------------------------------------------------------------
-
-    private AggregatedDataValueService aggregatedDataValueService;
-
-    public void setAggregatedDataValueService( AggregatedDataValueService aggregatedDataValueService )
-    {
-        this.aggregatedDataValueService = aggregatedDataValueService;
-    }
-
-    // -------------------------------------------------------------------------
-    // Input
-    // -------------------------------------------------------------------------
-
-    private Collection<Integer> indicatorIds;
-
-    public void setIndicatorIds( Collection<Integer> indicatorIds )
-    {
-        this.indicatorIds = indicatorIds;
-    }
-
-    private Collection<Integer> periodIds;
-
-    public void setPeriodIds( Collection<Integer> periodIds )
-    {
-        this.periodIds = periodIds;
-    }
-
-    private Collection<Integer> organisationUnitIds;
-
-    public void setOrganisationUnitIds( Collection<Integer> organisationUnitIds )
-    {
-        this.organisationUnitIds = organisationUnitIds;
-    }
-
-    // -------------------------------------------------------------------------
-    // Output
-    // -------------------------------------------------------------------------
-
-    private Collection<AggregatedIndicatorValue> object;
-
-    public Collection<AggregatedIndicatorValue> getObject()
-    {
-        return object;
-    }
-
-    // -------------------------------------------------------------------------
-    // Action implementation
-    // -------------------------------------------------------------------------
-
-    public String execute()
-        throws Exception
-    {
-        if ( indicatorIds != null && periodIds != null && organisationUnitIds != null )
-        {
-            object = aggregatedDataValueService.getAggregatedIndicatorValues( indicatorIds, periodIds,
-                organisationUnitIds );
-        }
-
-        return SUCCESS;
-    }
-}

=== removed file 'dhis-2/dhis-web/dhis-web-visualizer/src/main/java/org/hisp/dhis/visualizer/action/GetAggregatedIndicatorValuesPluginAction.java'
--- dhis-2/dhis-web/dhis-web-visualizer/src/main/java/org/hisp/dhis/visualizer/action/GetAggregatedIndicatorValuesPluginAction.java	2011-11-12 14:18:22 +0000
+++ dhis-2/dhis-web/dhis-web-visualizer/src/main/java/org/hisp/dhis/visualizer/action/GetAggregatedIndicatorValuesPluginAction.java	1970-01-01 00:00:00 +0000
@@ -1,227 +0,0 @@
-package org.hisp.dhis.visualizer.action;
-
-/*
- * Copyright (c) 2004-2010, University of Oslo
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- * * Redistributions of source code must retain the above copyright notice, this
- *   list of conditions and the following disclaimer.
- * * Redistributions in binary form must reproduce the above copyright notice,
- *   this list of conditions and the following disclaimer in the documentation
- *   and/or other materials provided with the distribution.
- * * Neither the name of the HISP project nor the names of its contributors may
- *   be used to endorse or promote products derived from this software without
- *   specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
- * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-import java.util.ArrayList;
-import java.util.Collection;
-
-import org.hisp.dhis.aggregation.AggregatedDataValueService;
-import org.hisp.dhis.aggregation.AggregatedIndicatorValue;
-import org.hisp.dhis.i18n.I18nFormat;
-import org.hisp.dhis.indicator.IndicatorService;
-import org.hisp.dhis.organisationunit.OrganisationUnitService;
-import org.hisp.dhis.period.Period;
-import org.hisp.dhis.period.PeriodService;
-import org.hisp.dhis.period.RelativePeriods;
-
-import com.opensymphony.xwork2.Action;
-
-/**
- * @author Jan Henrik Overland
- */
-public class GetAggregatedIndicatorValuesPluginAction
-    implements Action
-{
-    // -------------------------------------------------------------------------
-    // Dependencies
-    // -------------------------------------------------------------------------
-
-    private AggregatedDataValueService aggregatedDataValueService;
-
-    public void setAggregatedDataValueService( AggregatedDataValueService aggregatedDataValueService )
-    {
-        this.aggregatedDataValueService = aggregatedDataValueService;
-    }
-
-    private IndicatorService indicatorService;
-
-    public void setIndicatorService( IndicatorService indicatorService )
-    {
-        this.indicatorService = indicatorService;
-    }
-
-    private PeriodService periodService;
-
-    public void setPeriodService( PeriodService periodService )
-    {
-        this.periodService = periodService;
-    }
-
-    private OrganisationUnitService organisationUnitService;
-
-    public void setOrganisationUnitService( OrganisationUnitService organisationUnitService )
-    {
-        this.organisationUnitService = organisationUnitService;
-    }
-
-    private I18nFormat format;
-
-    public void setFormat( I18nFormat format )
-    {
-        this.format = format;
-    }
-
-    // -------------------------------------------------------------------------
-    // Input
-    // -------------------------------------------------------------------------
-
-    private Collection<Integer> indicatorIds;
-
-    public void setIndicatorIds( Collection<Integer> indicatorIds )
-    {
-        this.indicatorIds = indicatorIds;
-    }
-
-    private Collection<Integer> organisationUnitIds;
-
-    public void setOrganisationUnitIds( Collection<Integer> organisationUnitIds )
-    {
-        this.organisationUnitIds = organisationUnitIds;
-    }
-
-    private boolean lastMonth;
-
-    public void setLastMonth( boolean lastMonth )
-    {
-        this.lastMonth = lastMonth;
-    }
-
-    private boolean monthsThisYear;
-
-    public void setMonthsThisYear( boolean monthsThisYear )
-    {
-        this.monthsThisYear = monthsThisYear;
-    }
-
-    private boolean monthsLastYear;
-
-    public void setMonthsLastYear( boolean monthsLastYear )
-    {
-        this.monthsLastYear = monthsLastYear;
-    }
-
-    private boolean lastQuarter;
-
-    public void setLastQuarter( boolean lastQuarter )
-    {
-        this.lastQuarter = lastQuarter;
-    }
-
-    private boolean quartersThisYear;
-
-    public void setQuartersThisYear( boolean quartersThisYear )
-    {
-        this.quartersThisYear = quartersThisYear;
-    }
-
-    private boolean quartersLastYear;
-
-    public void setQuartersLastYear( boolean quartersLastYear )
-    {
-        this.quartersLastYear = quartersLastYear;
-    }
-
-    private boolean thisYear;
-
-    public void setThisYear( boolean thisYear )
-    {
-        this.thisYear = thisYear;
-    }
-
-    private boolean lastYear;
-
-    public void setLastYear( boolean lastYear )
-    {
-        this.lastYear = lastYear;
-    }
-
-    private boolean lastFiveYears;
-
-    public void setLastFiveYears( boolean lastFiveYears )
-    {
-        this.lastFiveYears = lastFiveYears;
-    }
-
-    // -------------------------------------------------------------------------
-    // Output
-    // -------------------------------------------------------------------------
-
-    private Collection<AggregatedIndicatorValue> object;
-
-    public Collection<AggregatedIndicatorValue> getObject()
-    {
-        return object;
-    }
-
-    // -------------------------------------------------------------------------
-    // Action implementation
-    // -------------------------------------------------------------------------
-
-    public String execute()
-        throws Exception
-    {
-        if ( indicatorIds != null
-            && organisationUnitIds != null
-            && (lastMonth || monthsThisYear || monthsLastYear || lastQuarter || quartersThisYear || quartersLastYear
-                || thisYear || lastYear || lastFiveYears) )
-        {
-            RelativePeriods rp = new RelativePeriods();
-            rp.setReportingMonth( lastMonth );
-            rp.setMonthsThisYear( monthsThisYear );
-            rp.setMonthsLastYear( monthsLastYear );
-            rp.setReportingQuarter( lastQuarter );
-            rp.setQuartersThisYear( quartersThisYear );
-            rp.setQuartersLastYear( quartersLastYear );
-            rp.setThisYear( thisYear );
-            rp.setLastYear( lastYear );
-            rp.setLast5Years( lastFiveYears );
-
-            Collection<Period> periods = periodService.reloadPeriods( rp.getRelativePeriods() );
-
-            Collection<Integer> periodIds = new ArrayList<Integer>();
-
-            for ( Period period : periods )
-            {
-                periodIds.add( period.getId() );
-            }
-
-            object = aggregatedDataValueService.getAggregatedIndicatorValues( indicatorIds, periodIds,
-                organisationUnitIds );
-
-            for ( AggregatedIndicatorValue value : object )
-            {
-                value.setIndicatorName( indicatorService.getIndicator( value.getIndicatorId() ).getName() );
-                value.setPeriodName( format.formatPeriod( periodService.getPeriod( value.getPeriodId() ) ) );
-                value.setOrganisationUnitName( organisationUnitService.getOrganisationUnit(
-                    value.getOrganisationUnitId() ).getName() );
-            }
-        }
-
-        return SUCCESS;
-    }
-}
\ No newline at end of file

=== modified file 'dhis-2/dhis-web/dhis-web-visualizer/src/main/java/org/hisp/dhis/visualizer/action/InitializeAction.java'
--- dhis-2/dhis-web/dhis-web-visualizer/src/main/java/org/hisp/dhis/visualizer/action/InitializeAction.java	2011-10-11 12:11:00 +0000
+++ dhis-2/dhis-web/dhis-web-visualizer/src/main/java/org/hisp/dhis/visualizer/action/InitializeAction.java	2011-12-19 19:59:45 +0000
@@ -90,18 +90,11 @@
         return lastMonth;
     }
 
-    private List<Period> monthsThisYear;
-
-    public List<Period> getMonthsThisYear()
-    {
-        return monthsThisYear;
-    }
+    private List<Period> last12Months;
     
-    private List<Period> monthsLastYear;
-
-    public List<Period> getMonthsLastYear()
+    public List<Period> getLast12Months()
     {
-        return monthsLastYear;
+        return last12Months;
     }
     
     private List<Period> lastQuarter;
@@ -111,18 +104,25 @@
         return lastQuarter;
     }
     
-    private List<Period> quartersThisYear;
-
-    public List<Period> getQuartersThisYear()
-    {
-        return quartersThisYear;
-    }
-    
-    private List<Period> quartersLastYear;
-
-    public List<Period> getQuartersLastYear()
-    {
-        return quartersLastYear;
+    private List<Period> last4Quarters;
+    
+    public List<Period> getLast4Quarters()
+    {
+        return last4Quarters;
+    }
+    
+    private List<Period> lastSixMonth;
+    
+    public List<Period> getLastSixMonth()
+    {
+        return lastSixMonth;
+    }
+
+    private List<Period> last2SixMonths;
+
+    public List<Period> getLast2SixMonths()
+    {
+        return last2SixMonths;
     }
     
     private List<Period> thisYear;
@@ -132,18 +132,11 @@
         return thisYear;
     }
     
-    private List<Period> lastYear;
-
-    public List<Period> getLastYear()
-    {
-        return lastYear;
-    }
-    
-    private List<Period> lastFiveYears;
-
-    public List<Period> getLastFiveYears()
-    {
-        return lastFiveYears;
+    private List<Period> last5Years;
+
+    public List<Period> getLast5Years()
+    {
+        return last5Years;
     }
 
     // -------------------------------------------------------------------------
@@ -163,29 +156,26 @@
         rp.clear().setReportingMonth( true );
         lastMonth = periodService.reloadPeriods( setNames( rp.getRelativePeriods() ) );
         
-        rp.clear().setMonthsThisYear( true );
-        monthsThisYear = periodService.reloadPeriods( setNames( rp.getRelativePeriods() ) );
-        
-        rp.clear().setMonthsLastYear( true );
-        monthsLastYear = periodService.reloadPeriods( setNames( rp.getRelativePeriods() ) );
+        rp.clear().setLast12Months( true );
+        last12Months = periodService.reloadPeriods( setNames( rp.getRelativePeriods() ) );
         
         rp.clear().setReportingQuarter( true );
         lastQuarter = periodService.reloadPeriods( setNames( rp.getRelativePeriods() ) );
         
-        rp.clear().setQuartersThisYear( true );
-        quartersThisYear = periodService.reloadPeriods( setNames( rp.getRelativePeriods() ) );
-        
-        rp.clear().setQuartersLastYear( true );
-        quartersLastYear = periodService.reloadPeriods( setNames( rp.getRelativePeriods() ) );
+        rp.clear().setLast4Quarters( true );
+        last4Quarters = periodService.reloadPeriods( setNames( rp.getRelativePeriods() ) );
+        
+        rp.clear().setLastSixMonth( true );
+        lastSixMonth = periodService.reloadPeriods( setNames( rp.getRelativePeriods() ) );
+        
+        rp.clear().setLast2SixMonths( true );
+        last2SixMonths = periodService.reloadPeriods( setNames( rp.getRelativePeriods() ) );
         
         rp.clear().setThisYear( true );
         thisYear = periodService.reloadPeriods( setNames( rp.getRelativePeriods() ) );
         
-        rp.clear().setLastYear( true );
-        lastYear = periodService.reloadPeriods( setNames( rp.getRelativePeriods() ) );
-        
         rp.clear().setLast5Years( true );
-        lastFiveYears = periodService.reloadPeriods( setNames( rp.getRelativePeriods() ) );
+        last5Years = periodService.reloadPeriods( setNames( rp.getRelativePeriods() ) );
 
         return SUCCESS;
     }

=== modified file 'dhis-2/dhis-web/dhis-web-visualizer/src/main/resources/META-INF/dhis/beans.xml'
--- dhis-2/dhis-web/dhis-web-visualizer/src/main/resources/META-INF/dhis/beans.xml	2011-12-07 10:12:25 +0000
+++ dhis-2/dhis-web/dhis-web-visualizer/src/main/resources/META-INF/dhis/beans.xml	2011-12-14 19:46:03 +0000
@@ -27,46 +27,6 @@
 			ref="org.hisp.dhis.organisationunit.OrganisationUnitService" />
 	</bean>
     
-    <!-- AggregatedIndicatorValue -->
-
-	<bean id="org.hisp.dhis.visualizer.action.GetAggregatedIndicatorValuesAction"
-		class="org.hisp.dhis.visualizer.action.GetAggregatedIndicatorValuesAction"
-		scope="prototype">
-		<property name="aggregatedDataValueService"
-			ref="org.hisp.dhis.aggregation.AggregatedDataValueService" />
-	</bean>
-
-	<bean id="org.hisp.dhis.visualizer.action.GetAggregatedIndicatorValuesPluginAction"
-		class="org.hisp.dhis.visualizer.action.GetAggregatedIndicatorValuesPluginAction"
-		scope="prototype">
-		<property name="aggregatedDataValueService"
-			ref="org.hisp.dhis.aggregation.AggregatedDataValueService" />
-		<property name="indicatorService" ref="org.hisp.dhis.indicator.IndicatorService" />
-		<property name="periodService" ref="org.hisp.dhis.period.PeriodService" />
-		<property name="organisationUnitService"
-			ref="org.hisp.dhis.organisationunit.OrganisationUnitService" />
-	</bean>
-    
-    <!-- AggregatedDataValue -->
-
-    <bean id="org.hisp.dhis.visualizer.action.GetAggregatedDataValuesAction"
-        class="org.hisp.dhis.visualizer.action.GetAggregatedDataValuesAction"
-        scope="prototype">
-        <property name="aggregatedDataValueService"
-            ref="org.hisp.dhis.aggregation.AggregatedDataValueService" />
-    </bean>
-
-	<bean id="org.hisp.dhis.visualizer.action.GetAggregatedDataValuesPluginAction"
-		class="org.hisp.dhis.visualizer.action.GetAggregatedDataValuesPluginAction"
-		scope="prototype">
-		<property name="aggregatedDataValueService"
-			ref="org.hisp.dhis.aggregation.AggregatedDataValueService" />
-		<property name="dataElementService" ref="org.hisp.dhis.dataelement.DataElementService" />
-		<property name="periodService" ref="org.hisp.dhis.period.PeriodService" />
-		<property name="organisationUnitService"
-			ref="org.hisp.dhis.organisationunit.OrganisationUnitService" />
-	</bean>
-    
     <!-- Aggregated values -->
 
     <bean id="org.hisp.dhis.visualizer.action.GetAggregatedValuesAction"
@@ -87,6 +47,24 @@
 		<property name="organisationUnitService"
 			ref="org.hisp.dhis.organisationunit.OrganisationUnitService" />
     </bean>
+    
+    <!-- Chart -->
+
+    <bean id="org.hisp.dhis.visualizer.action.AddOrUpdateChartAction"
+        class="org.hisp.dhis.visualizer.action.AddOrUpdateChartAction"
+        scope="prototype">
+        <property name="chartService" ref="org.hisp.dhis.chart.ChartService" />
+        <property name="indicatorService" ref="org.hisp.dhis.indicator.IndicatorService" />
+        <property name="dataElementService" ref="org.hisp.dhis.dataelement.DataElementService" />
+        <property name="organisationUnitService" ref="org.hisp.dhis.organisationunit.OrganisationUnitService" />
+    </bean>
+
+    <bean id="org.hisp.dhis.visualizer.action.DeleteChartsAction"
+        class="org.hisp.dhis.visualizer.action.DeleteChartsAction"
+        scope="prototype">
+        <property name="chartService"
+            ref="org.hisp.dhis.chart.ChartService" />
+    </bean>
 
 	<!-- Export -->
 

=== modified file 'dhis-2/dhis-web/dhis-web-visualizer/src/main/resources/struts.xml'
--- dhis-2/dhis-web/dhis-web-visualizer/src/main/resources/struts.xml	2011-12-07 10:12:25 +0000
+++ dhis-2/dhis-web/dhis-web-visualizer/src/main/resources/struts.xml	2011-12-14 13:52:15 +0000
@@ -31,36 +31,6 @@
 				/dhis-web-visualizer/jsonminOrganisationUnitChildren.vm</result>
 		</action>
 
-        <!-- AggregatedIndicatorValue -->
-
-        <action name="getAggregatedIndicatorValues"
-            class="org.hisp.dhis.visualizer.action.GetAggregatedIndicatorValuesAction">
-            <result name="success" type="velocity-json">
-                /dhis-web-visualizer/jsonminAggregatedIndicatorValues.vm</result>
-        </action>
-
-        <action name="getAggregatedIndicatorValuesPlugin"
-            class="org.hisp.dhis.visualizer.action.GetAggregatedIndicatorValuesPluginAction">
-            <result name="success" type="velocity-json">
-                /dhis-web-visualizer/jsonminAggregatedIndicatorValuesPlugin.vm</result>
-        </action>
-
-        <!-- AggregatedDataValue -->
-
-        <action name="getAggregatedDataValues"
-            class="org.hisp.dhis.visualizer.action.GetAggregatedDataValuesAction">
-            <result name="success" type="velocity-json">
-                /dhis-web-visualizer/jsonminAggregatedDataValues.vm</result>
-            <result name="none" type="velocity-json">
-                /dhis-web-visualizer/void.vm</result>
-        </action>
-
-        <action name="getAggregatedDataValuesPlugin"
-            class="org.hisp.dhis.visualizer.action.GetAggregatedDataValuesPluginAction">
-            <result name="success" type="velocity-json">
-                /dhis-web-visualizer/jsonminAggregatedDataValuesPlugin.vm</result>
-        </action>
-
         <!-- Aggregated values -->
 
         <action name="getAggregatedValues"
@@ -79,6 +49,20 @@
                 /dhis-web-visualizer/void.vm</result>
         </action>
 
+        <!-- Chart -->
+
+        <action name="addOrUpdateChart"
+            class="org.hisp.dhis.visualizer.action.AddOrUpdateChartAction">
+            <result name="success" type="velocity-json">
+                /dhis-web-visualizer/void.vm</result>
+        </action>
+
+        <action name="deleteCharts"
+            class="org.hisp.dhis.visualizer.action.DeleteChartsAction">
+            <result name="success" type="velocity-json">
+                /dhis-web-visualizer/void.vm</result>
+        </action>
+
         <!-- Export -->
 
 		<action name="exportImage" class="org.hisp.dhis.visualizer.action.ExportImageAction">

=== modified file 'dhis-2/dhis-web/dhis-web-visualizer/src/main/webapp/dhis-web-visualizer/app/app.js'
--- dhis-2/dhis-web/dhis-web-visualizer/src/main/webapp/dhis-web-visualizer/app/app.js	2011-12-06 17:41:41 +0000
+++ dhis-2/dhis-web/dhis-web-visualizer/src/main/webapp/dhis-web-visualizer/app/app.js	2011-12-19 22:15:46 +0000
@@ -9,12 +9,10 @@
         jsonfy: function(r) {
             r = Ext.JSON.decode(r.responseText);
             var obj = {system: {rootNode: {id: r.rn[0], name: r.rn[1], level: 1}, periods: {}}};
-            var keys1 = ['lastMonth', 'monthsThisYear', 'monthsLastYear', 'lastQuarter', 'quartersThisYear', 'quartersLastYear', 'thisYear', 'lastYear', 'lastFiveYears'];
-            var keys2 = ['lm', 'mty', 'mly', 'lq', 'qty', 'qly', 'ty', 'ly', 'lfy'];
-            for (var i = 0; i < keys1.length; i++) {
-                obj.system.periods[keys1[i]] = [];
-                for (var j = 0; j < r.p[keys2[i]].length; j++) {
-                    obj.system.periods[keys1[i]].push({id: r.p[keys2[i]][j][0], name: r.p[keys2[i]][j][1]});
+            for (var relative in r.p) {
+                obj.system.periods[relative] = [];
+                for (var i = 0; i < r.p[relative].length; i++) {
+                    obj.system.periods[relative].push({id: r.p[relative][i][0], name: r.p[relative][i][1]});
                 }
             }
             return obj;
@@ -22,10 +20,23 @@
     },
     finals: {
         ajax: {
-            url_visualizer: '../',
-            url_commons: '../../dhis-web-commons-ajax-json/',
-            url_portal: '../../dhis-web-portal/',
-            url_data: 'getAggregatedValues.action'
+            path_visualizer: '../',
+            path_commons: '../../dhis-web-commons-ajax-json/',
+            path_api: '../../api/',
+            path_portal: '../../dhis-web-portal/',
+            initialize: 'initialize.action',
+            redirect: 'redirect.action',
+            data_get: 'getAggregatedValues.action',
+            indicator_get: 'getIndicatorsMinified.action',
+            indicatorgroup_get: 'getIndicatorGroupsMinified.action',
+            dataelement_get: 'getDataElementsMinified.action',
+            dataelementgroup_get: 'getDataElementGroupsMinified.action',
+            dataelement_get: 'getDataElementsMinified.action',
+            organisationunitchildren_get: 'getOrganisationUnitChildren.action',
+            favorite_addorupdate: 'addOrUpdateChart.action',
+            favorite_get: 'charts/',
+            favorite_getall: 'charts.json?links=false',
+            favorite_delete: 'deleteCharts.action'
         },        
         dimension: {
             data: {
@@ -65,22 +76,25 @@
         image: {
             png: 'png',
             pdf: 'pdf'
+        },
+        cmd: {
+            init: 'init',
+            id: 'id'
         }
     },
     chart: {
         inset: 30
     },
-    style: {
-        label: {
-            period_group: 'font:bold 11px arial; color:#444; line-height:20px'
-        }
-    },
     layout: {
         west_width: 424,
         west_fieldset_width: 402,
         center_tbar_height: 31,
         east_tbar_height: 31,
-        east_gridcolumn_height: 30
+        east_gridcolumn_height: 30,
+        form_label_width: 45,
+        window_favorite_ypos: 100,
+        window_confirm_width: 250,
+        grid_favorite_width: 420
     }
 };
 
@@ -92,13 +106,13 @@
     Ext.override(Ext.form.FieldSet,{setExpanded:function(a){var b=this,c=b.checkboxCmp,d=b.toggleCmp,e;a=!!a;if(c){c.setValue(a)}if(d){d.setType(a?"up":"down")}if(a){e="expand";b.removeCls(b.baseCls+"-collapsed")}else{e="collapse";b.addCls(b.baseCls+"-collapsed")}b.collapsed=!a;b.doComponentLayout();b.fireEvent(e,b);return b}});
     Ext.QuickTips.init();
     document.body.oncontextmenu = function(){return false;};
-
+    
     Ext.Ajax.request({
-        url: DV.conf.finals.ajax.url_visualizer + 'initialize.action',
+        url: DV.conf.finals.ajax.path_visualizer + DV.conf.finals.ajax.initialize,
         success: function(r) {
             
     DV.init = DV.conf.init.jsonfy(r);
-    DV.init.isInit = true;
+    DV.init.init = DV.conf.finals.cmd.init;
     
     DV.init.initialize = function() {
         DV.util.combobox.filter.category();        
@@ -109,7 +123,7 @@
         DV.store.area = DV.store.defaultChartStore;
         DV.store.pie = DV.store.defaultChartStore;        
         DV.chart.data = DV.conf.init.data;        
-        DV.exe.execute(true, DV.init.isInit);
+        DV.exe.execute(true, DV.init.init);
     };
     
     DV.cmp = {
@@ -125,6 +139,9 @@
         },
         toolbar: {
             menuitem: {}
+        },
+        favorite: {
+            rename: {}
         }
     };
     
@@ -138,6 +155,12 @@
             },
             getXY: function() {
                 return {x: DV.cmp.region.center.x + 15, y: DV.cmp.region.center.y + 43};
+            },
+            getPageCenterX: function(cmp) {
+                return ((screen.width/2)-(cmp.width/2));
+            },
+            getPageCenterY: function(cmp) {
+                return ((screen.height/2)-((cmp.height/2)-100));
             }
         },
         multiselect: {
@@ -146,7 +169,7 @@
                 if (selected.length) {
                     var array = [];
                     Ext.Array.each(selected, function(item) {
-                        array.push({id: item, s: a.store.getAt(a.store.find('id', item)).data.s});
+                        array.push({id: item, s: a.store.getAt(a.store.findExact('id', item)).data.s});
                     });
                     s.store.add(array);
                 }
@@ -164,7 +187,7 @@
                 var selected = s.getValue();
                 if (selected.length) {
                     Ext.Array.each(selected, function(item) {
-                        s.store.remove(s.store.getAt(s.store.find('id', item)));
+                        s.store.remove(s.store.getAt(s.store.findExact('id', item)));
                     });                    
                     this.filterAvailable(a, s);
                 }
@@ -206,26 +229,37 @@
             }
         },
         button: {
-            getValue: function() {
-                for (var i = 0; i < DV.cmp.charttype.length; i++) {
-                    if (DV.cmp.charttype[i].pressed) {
-                        return DV.cmp.charttype[i].name;
-                    }
-                }
-            },
-            toggleHandler: function(b) {
-                if (!b.pressed) {
-                    b.toggle();
+            type: {
+                getValue: function() {
+                    for (var i = 0; i < DV.cmp.charttype.length; i++) {
+                        if (DV.cmp.charttype[i].pressed) {
+                            return DV.cmp.charttype[i].name;
+                        }
+                    }
+                },
+                setValue: function(type) {
+                },
+                toggleHandler: function(b) {
+                    if (!b.pressed) {
+                        b.toggle();
+                    }
                 }
             }
         },
         store: {
-            addToStorage: function(s) {
+            addToStorage: function(s, records) {
                 s.each( function(r) {
                     if (!s.storage[r.data.id]) {
                         s.storage[r.data.id] = {id: r.data.id, s: r.data.s, name: r.data.s, parent: s.parent};
                     }
                 });
+                if (records) {
+                    Ext.Array.each(records, function(r) {
+                        if (!s.storage[r.data.id]) {
+                            s.storage[r.data.id] = {id: r.data.id, s: r.data.s, name: r.data.s, parent: s.parent};
+                        }
+                    });
+                }                        
             },
             loadFromStorage: function(s) {
                 var items = [];
@@ -248,14 +282,43 @@
             }
         },
         dimension: {
+            indicator: {
+                getIds: function(exception) {
+                    var a = [];
+                    DV.cmp.dimension.indicator.selected.store.each( function(r) {
+                        a.push(r.data.id);
+                    });
+                    if (exception && !a.length) {
+                        alert('No indicators selected');
+                    }
+                    return a;
+                }
+            },
+            dataelement: {
+                getIds: function(exception) {
+                    if (DV.cmp.dimension.dataelement.selected.store) {
+                        var a = [];
+                        DV.cmp.dimension.dataelement.selected.store.each( function(r) {
+                            a.push(r.data.id);
+                        });
+                        if (exception && !a.length) {
+                            alert('No data elements selected');
+                        }
+                        return a;
+                    }
+                    else {
+                        alert('Data element store does not exist');
+                    }
+                }
+            },
             data: {
                 getUrl: function(isFilter) {
                     var a = [];
-                    DV.cmp.dimension.indicator.selected.store.each( function(r) {
-                        a.push('indicatorIds=' + r.data.id);
+                    Ext.Array.each(DV.state.indicatorIds, function(r) {
+                        a.push('indicatorIds=' + r);
                     });
-                    DV.cmp.dimension.dataelement.selected.store.each( function(r) {
-                        a.push('dataElementIds=' + r.data.id);
+                    Ext.Array.each(DV.state.dataelementIds, function(r) {
+                        a.push('dataElementIds=' + r);
                     });
                     return (isFilter && a.length > 1) ? a.slice(0,1) : a;
                 },
@@ -273,15 +336,14 @@
                         alert('No indicators or data elements selected');
                     }
                     return a;
-                }
+                }                    
             },
             period: {
                 getUrl: function(isFilter) {
-                    var a = [],
-                        cmp = DV.cmp.dimension.period;
-                    for (var i = 0; i < cmp.length; i++) {
-                        if (cmp[i].getValue()) {
-                            Ext.Array.each(DV.init.system.periods[cmp[i].paramName], function(item) {
+                    var a = [];
+                    for (var r in DV.state.relativePeriods) {
+                        if (DV.state.relativePeriods[r]) {
+                            Ext.Array.each(DV.init.system.periods[r], function(item) {
                                 a.push('periodIds=' + item.id);
                             });
                         }
@@ -303,6 +365,22 @@
                     }
                     return a;
                 },
+                getNamesByRelativePeriodsObject: function(rp) {
+                    var relatives = [],
+                        names = [];
+                    for (var r in rp) {
+                        if (rp[r]) {
+                            relatives.push(r);
+                        }
+                    }
+                    for (var i = 0; i < relatives.length; i++) {
+                        var r = DV.init.system.periods[relatives[i]] || [];
+                        for (var j = 0; j < r.length; j++) {
+                            names.push(r[j].name);
+                        }
+                    }
+                    return names;
+                },                        
                 getNameById: function(id) {
                     for (var obj in DV.init.system.periods) {
                         var a = DV.init.system.periods[obj];
@@ -312,19 +390,39 @@
                             }
                         };
                     }
-                }
+                },
+                getIds: function(exception) {
+                    var a = [],
+                        cmp = DV.cmp.dimension.period;
+                    Ext.Array.each(cmp, function(item) {
+                        if (item.getValue()) {
+                            a.push(item.paramName);
+                        }
+                    });
+                    if (exception && !a.length) {
+                        alert('No periods selected');
+                    }
+                    return a;
+                },
+                getRelativePeriodObject: function(exception) {
+                    var a = {},
+                        cmp = DV.cmp.dimension.period,
+                        valid = false;
+                    Ext.Array.each(cmp, function(item) {
+                        a[item.paramName] = item.getValue();
+                        valid = item.getValue() ? true : valid;
+                    });
+                    if (exception && !valid) {
+                        alert('No periods selected');
+                    }
+                    return a;
+                }   
             },
             organisationunit: {
                 getUrl: function(isFilter) {
-                    var a = [],
-                        tp = DV.cmp.dimension.organisationunit.treepanel,
-                        selection = tp.getSelectionModel().getSelection();
-                    if (!selection.length) {
-                        selection = [tp.getRootNode()];
-                        tp.selectRoot();
-                    }
-                    Ext.Array.each(selection, function(r) {
-                        a.push('organisationUnitIds=' + r.data.id);
+                    var a = [];
+                    Ext.Array.each(DV.state.organisationunitIds, function(item) {
+                        a.push('organisationUnitIds=' + item);
                     });
                     return (isFilter && a.length > 1) ? a.slice(0,1) : a;
                 },
@@ -342,8 +440,33 @@
                     if (exception && !a.length) {
                         alert('No organisation units selected');
                     }
-                    return a;                        
+                    return a;
+                },
+                getIds: function(exception) {
+                    var a = [],
+                        tp = DV.cmp.dimension.organisationunit.treepanel,
+                        selection = tp.getSelectionModel().getSelection();
+                    if (!selection.length) {
+                        selection = [tp.getRootNode()];
+                        tp.selectRoot();
+                    }
+                    Ext.Array.each(selection, function(r) {
+                        a.push(DV.util.string.getEncodedString(r.data.id));
+                    });
+                    if (exception && !a.length) {
+                        alert('No organisation units selected');
+                    }
+                    return a;
+                }                    
+            }
+        },
+        mask: {
+            setMask: function(cmp, str) {
+                if (DV.mask) {
+                    DV.mask.hide();
                 }
+                DV.mask = new Ext.LoadMask(cmp, {msg: str});
+                DV.mask.show();
             }
         },
         chart: {
@@ -368,7 +491,7 @@
             getTitle: function() {
                 return {
                     type: 'text',
-                    text: DV.init.isInit ? 'Example chart' : DV.state.filter.names[0],
+                    text: DV.init.init ? 'Example chart' : DV.state.filter.names[0],
                     font: 'bold 15px arial',
                     fill: '#222',
                     width: 300,
@@ -385,13 +508,6 @@
                     }
                 };
             },
-            setMask: function(str) {
-                if (DV.mask) {
-                    DV.mask.hide();
-                }
-                DV.mask = new Ext.LoadMask(DV.chart.chart, {msg: str});
-                DV.mask.show();
-            },
             label: {
                 getCategoryLabel: function() {
                     return {
@@ -515,6 +631,16 @@
                 }
             }
         },
+        checkbox: {
+            setRelativePeriods: function(rp) {
+                for (var r in rp) {
+                    var cmp = DV.util.getCmp('checkbox[paramName="' + r + '"]');
+                    if (cmp) {
+                        cmp.setValue(rp[r]);
+                    }
+                }
+            }
+        },                
         number: {
             isInteger: function(n) {
                 var str = new String(n);
@@ -550,6 +676,73 @@
                 }
                 return values;
             }
+        },
+        crud: {
+            favorite: {
+                create: function(fn, isUpdate) {
+                    DV.util.mask.setMask(DV.cmp.favorite.window, 'Saving...');
+                    var params = DV.state.getParams();
+                    params.name = DV.cmp.favorite.name.getValue();
+                    if (isUpdate) {
+                        var store = DV.store.favorite;
+                        params.uid = store.getAt(store.findExact('name', params.name)).data.id;
+                    }
+                    Ext.Ajax.request({
+                        url: DV.conf.finals.ajax.path_visualizer + DV.conf.finals.ajax.favorite_addorupdate,
+                        params: params,
+                        success: function() {
+                            DV.store.favorite.load({callback: function() {
+                                DV.mask.hide();
+                                if (fn) {
+                                    fn();
+                                }
+                            }});
+                        }
+                    });
+                },
+                update: function(fn) {
+                    DV.util.crud.favorite.create(fn, true);
+                },
+                updateName: function(name) {
+                    if (DV.store.favorite.findExact('name', name) != -1) {
+                        alert('Name is already in use');
+                        return;
+                    }
+                    DV.util.mask.setMask(DV.cmp.favorite.window, 'Renaming...');
+                    var r = DV.cmp.favorite.grid.getSelectionModel().getSelection()[0];
+                    Ext.Ajax.request({
+                        url: DV.conf.finals.ajax.path_visualizer + DV.conf.finals.ajax.favorite_addorupdate,
+                        params: {uid: r.data.id, name: name},
+                        success: function() {
+                            DV.store.favorite.load({callback: function() {
+                                DV.cmp.favorite.rename.window.close();
+                                DV.mask.hide();
+                                DV.cmp.favorite.grid.getSelectionModel().select(DV.store.favorite.getAt(DV.store.favorite.findExact('name', name)));
+                                DV.cmp.favorite.name.setValue(name);
+                            }});
+                        }
+                    });
+                },
+                del: function(fn) {
+                    DV.util.mask.setMask(DV.cmp.favorite.window, 'Deleting...');
+                    var baseurl = DV.conf.finals.ajax.path_visualizer + DV.conf.finals.ajax.favorite_delete,
+                        selection = DV.cmp.favorite.grid.getSelectionModel().getSelection();
+                    Ext.Array.each(selection, function(item) {
+                        baseurl = Ext.String.urlAppend(baseurl, 'uids=' + item.data.id);
+                    });
+                    Ext.Ajax.request({
+                        url: baseurl,
+                        success: function() {
+                            DV.store.favorite.load({callback: function() {
+                                DV.mask.hide();
+                                if (fn) {
+                                    fn();
+                                }
+                            }});
+                        }
+                    }); 
+                }
+            }
         }
     };
     
@@ -563,13 +756,13 @@
                     {id: DV.conf.finals.dimension.organisationunit.value, name: DV.conf.finals.dimension.organisationunit.rawvalue}
                 ]
             });
-        },        
+        },
         indicator: {
             available: Ext.create('Ext.data.Store', {
-                fields: ['id', 'name', 's'],
+                fields: ['id', 's'],
                 proxy: {
                     type: 'ajax',
-                    url: DV.conf.finals.ajax.url_commons + 'getIndicatorsMinified.action',
+                    url: DV.conf.finals.ajax.path_commons + DV.conf.finals.ajax.indicator_get,
                     reader: {
                         type: 'json',
                         root: 'indicators'
@@ -590,10 +783,10 @@
         },
         dataelement: {
             available: Ext.create('Ext.data.Store', {
-                fields: ['id', 'name', 's'],
+                fields: ['id', 's'],
                 proxy: {
                     type: 'ajax',
-                    url: DV.conf.finals.ajax.url_commons + 'getDataElementsMinified.action',
+                    url: DV.conf.finals.ajax.path_commons + DV.conf.finals.ajax.dataelement_get,
                     reader: {
                         type: 'json',
                         root: 'dataElements'
@@ -675,7 +868,36 @@
             else {
                 return DV.store.chart;
             }
-        }
+        },
+        favorite: Ext.create('Ext.data.Store', {
+            fields: ['id', 'name', 'lastUpdated'],
+            proxy: {
+                type: 'ajax',
+                url: DV.conf.finals.ajax.path_api + DV.conf.finals.ajax.favorite_getall,
+                reader: {
+                    type: 'json',
+                    root: 'charts'
+                }
+            },
+            isLoaded: false,
+            sorting: {
+                field: 'lastUpdated',
+                direction: 'DESC'
+            },
+            listeners: {
+                load: function(s) {
+                    s.sort(this.sorting.field, this.sorting.direction);
+                    s.each(function(r) {
+                        r.data.lastUpdated = r.data.lastUpdated.substr(0,16).replace('T',' ');
+                        r.data.icon = '<img src="images/favorite.png" />';
+                        r.commit();
+                    });
+                    if (!s.isLoaded) {
+                        s.isLoaded = true;
+                    }
+                }
+            }
+        })            
     };
     
     DV.state = {
@@ -692,44 +914,152 @@
             dimension: DV.conf.finals.dimension.organisationunit.value,
             names: []
         },
+        indicatorIds: [],
+        dataelementIds: [],
+        relativePeriods: {},
+        organisationunitIds: [],
+        isRendered: false,
         getState: function(exe) {
             this.resetState();
             
-            this.type = DV.util.button.getValue();
-            
-            this.series.dimension = DV.cmp.settings.series.getValue();
-            this.series.names = DV.util.dimension[this.series.dimension].getNames(true);
-            
-            this.category.dimension = DV.cmp.settings.category.getValue();
-            this.category.names = DV.util.dimension[this.category.dimension].getNames(true);
-            
-            this.filter.dimension = DV.cmp.settings.filter.getValue();
-            this.filter.names = DV.util.dimension[this.filter.dimension].getNames(true).slice(0,1);
-            
-            if (!this.series.names.length || !this.category.names.length || !this.filter.names.length) {
+            var tmp_series_dimension = DV.cmp.settings.series.getValue();
+            var tmp_series_names = DV.util.dimension[tmp_series_dimension].getNames(true);
+            
+            var tmp_category_dimension = DV.cmp.settings.category.getValue();
+            var tmp_category_names = DV.util.dimension[tmp_category_dimension].getNames(true);
+            
+            var tmp_filter_dimension = DV.cmp.settings.filter.getValue();
+            var tmp_filter_names = DV.util.dimension[tmp_filter_dimension].getNames(true).slice(0,1);
+            
+            if (!tmp_series_names.length || !tmp_category_names.length || !tmp_filter_names.length) {
                 return;
             }
             
+            this.type = DV.util.button.type.getValue();
+            
+            this.series.dimension = tmp_series_dimension;
+            this.series.names = tmp_series_names;
+            
+            this.category.dimension = tmp_category_dimension;
+            this.category.names = tmp_category_names;
+            
+            this.filter.dimension = tmp_filter_dimension;
+            this.filter.names = tmp_filter_names;
+            
+            this.indicatorIds = DV.util.dimension.indicator.getIds();
+            this.dataelementIds = DV.util.dimension.dataelement.getIds();
+            this.relativePeriods = DV.util.dimension.period.getRelativePeriodObject();
+            this.organisationunitIds = DV.util.dimension.organisationunit.getIds();
+            
+            this.isRendered = true;
+            DV.util.mask.setMask(DV.chart.chart, 'Loading...');
+            
             if (exe) {
                 DV.value.getValues(true);
             }
         },
+        getParams: function() {
+            var obj = {};
+            obj.type = this.type;
+            obj.series = this.series.dimension;
+            obj.category = this.category.dimension;
+            obj.filter = this.filter.dimension;
+            obj.indicatorIds = this.indicatorIds;
+            obj.dataElementIds = this.dataelementIds;
+            obj.organisationUnitIds = this.organisationunitIds;
+            obj = Ext.Object.merge(obj, this.relativePeriods);
+            return obj;            
+        },
+        setState: function(exe, id) {
+            if (id) {
+                this.resetState();
+                DV.util.mask.setMask(DV.chart.chart, 'Loading...');
+                
+                Ext.Ajax.request({
+                    url: DV.conf.finals.ajax.path_api + DV.conf.finals.ajax.favorite_get + id + '.json',
+                    scope: this,
+                    success: function(r) {
+                        var f = Ext.JSON.decode(r.responseText),
+                            indiment = [];
+                        f.names = {
+                            data: [],
+                            period: [],
+                            organisationunit: []
+                        };
+                        
+                        this.type = f.type;
+                        this.series.dimension = f.series;
+                        this.category.dimension = f.category;
+                        this.filter.dimension = f.filter;
+                        
+                        if (f.indicators) {
+                            var records = [];
+                            for (var i = 0; i < f.indicators.length; i++) {
+                                indiment.push(f.indicators[i]);
+                                this.indicatorIds.push(f.indicators[i].internalId);
+                                records.push({id: f.indicators[i].internalId, s: f.indicators[i].shortName, name: f.indicators[i].shortName, parent: null});
+                            }
+                            DV.store.indicator.selected.removeAll();
+                            DV.store.indicator.selected.add(records);
+                            DV.util.store.addToStorage(DV.store.indicator.available, records);
+                            DV.util.multiselect.filterAvailable(DV.cmp.dimension.indicator.available, DV.cmp.dimension.indicator.selected);
+                        }
+                        if (f.dataElements) {
+                            var records = [];
+                            for (var i = 0; i < f.dataElements.length; i++) {
+                                indiment.push(f.dataElements[i]);
+                                this.dataelementIds.push(f.dataElements[i].internalId);
+                                records.push({id: f.dataElements[i].internalId, s: f.dataElements[i].shortName, name: f.dataElements[i].shortName, parent: null});
+                            }
+                            DV.store.dataelement.selected.removeAll();
+                            DV.store.dataelement.selected.add(records);
+                            DV.util.store.addToStorage(DV.store.dataelement.available, records);
+                            DV.util.multiselect.filterAvailable(DV.cmp.dimension.dataelement.available, DV.cmp.dimension.dataelement.selected);
+                        }
+                        for (var i = 0; i < indiment.length; i++) {
+                            f.names.data.push(indiment[i].shortName);
+                        }
+                        
+                        this.relativePeriods = f.relativePeriods;
+                        DV.util.checkbox.setRelativePeriods(this.relativePeriods);
+                        f.names.period = DV.util.dimension.period.getNamesByRelativePeriodsObject(this.relativePeriods);
+                        
+                        for (var i = 0; i < f.organisationUnits.length; i++) {
+                            this.organisationunitIds.push(f.organisationUnits[i].internalId);
+                            f.names.organisationunit.push(f.organisationUnits[i].name);
+                        }
+                        
+                        this.series.names = f.names[this.series.dimension];
+                        this.category.names = f.names[this.category.dimension];
+                        this.filter.names = f.names[this.filter.dimension];
+                        
+                        this.isRendered = true;
+                        
+                        if (exe) {
+                            DV.value.getValues(true);
+                        }
+                    }
+                });
+            }
+        },
         resetState: function() {
             this.type = null;
             this.series.dimension = null;
-            this.series.names = null;
+            this.series.names = [];
             this.category.dimension = null;
-            this.category.names = null;
+            this.category.names = [];
             this.filter.dimension = null;
-            this.filter.names = null;
+            this.filter.names = [];
+            this.indicatorIds = [];
+            this.dataelementIds = [];
+            this.relativePeriods = {};
+            this.organisationunitIds = [];
         }
     };
     
     DV.value = {
         values: [],
-        getValues: function(exe) {
-            DV.util.chart.setMask('Loading...');
-            
+        getValues: function(exe) {            
             var params = [],
                 i = DV.conf.finals.dimension.indicator.value,
                 d = DV.conf.finals.dimension.dataelement.value;
@@ -738,23 +1068,22 @@
             params = params.concat(DV.util.dimension[DV.state.category.dimension].getUrl());
             params = params.concat(DV.util.dimension[DV.state.filter.dimension].getUrl(true));
             
-            var baseUrl = DV.conf.finals.ajax.url_visualizer + DV.conf.finals.ajax.url_data;
+            var baseurl = DV.conf.finals.ajax.path_visualizer + DV.conf.finals.ajax.data_get;
             Ext.Array.each(params, function(item) {
-                baseUrl = Ext.String.urlAppend(baseUrl, item);
+                baseurl = Ext.String.urlAppend(baseurl, item);
             });
             
             Ext.Ajax.request({
-                url: baseUrl,
+                url: baseurl,
                 success: function(r) {
                     DV.value.values = DV.util.value.jsonfy(r);
-                    
                     if (!DV.value.values.length) {
                         DV.mask.hide();
                         alert('No data values');
                         return;
                     }
                     
-                    var storage = Ext.Object.merge(DV.store[i].available.storage, DV.store[d].available.storage);                    
+                    var storage = Ext.Object.merge(DV.store[i].available.storage, DV.store[d].available.storage);
                     Ext.Array.each(DV.value.values, function(item) {
                         item[DV.conf.finals.dimension.data.value] = DV.util.string.getEncodedString(storage[item.d].name);
                         item[DV.conf.finals.dimension.period.value] = DV.util.string.getEncodedString(DV.util.dimension.period.getNameById(item.p));
@@ -990,12 +1319,12 @@
             DV.cmp.region.center.removeAll(true);
             DV.cmp.region.center.add(this.chart);
             
-            if (!DV.init.isInit) {
+            if (!DV.init.init) {
                 DV.mask.hide();
                 DV.store.getDataTableStore(true);
             }
             else {
-                DV.init.isInit = false;
+                DV.init.init = false;
             }
         }
     };
@@ -1004,7 +1333,6 @@
         datatable: null,
         getDataTable: function(exe) {
             this.datatable = Ext.create('Ext.grid.Panel', {
-                id: 'datatable_g',
                 height: DV.util.viewport.getSize().y - 1,
                 scroll: 'vertical',
                 cls: 'dv-datatable',
@@ -1052,9 +1380,14 @@
     };
     
     DV.exe = {
-        execute: function(exe, init) {
-            if (init) {
-                DV.store.getChartStore(exe);
+        execute: function(exe, cmd) {
+            if (cmd) {
+                if (cmd === DV.conf.finals.cmd.init) {
+                    DV.store.getChartStore(exe);
+                }
+                else {
+                    DV.state.setState(true, cmd);
+                }
             }
             else {
                 DV.state.getState(exe);
@@ -1082,7 +1415,7 @@
                         defaults: {
                             height: 40,
                             toggleGroup: 'chartsettings',
-                            handler: DV.util.button.toggleHandler,
+                            handler: DV.util.button.type.toggleHandler,
                             listeners: {
                                 afterrender: function(b) {
                                     if (b.xtype === 'button') {
@@ -1166,6 +1499,7 @@
                                     { bodyStyle: 'padding:1px 0; border-style:none;	background-color:transparent' },
                                     {
                                         xtype: 'combobox',
+                                        cls: 'dv-combo',
                                         name: DV.conf.finals.chart.series,
                                         emptyText: 'Series',
                                         queryMode: 'local',
@@ -1198,6 +1532,7 @@
                                     { bodyStyle: 'padding:1px 0; border-style:none;	background-color:transparent' },
                                     {
                                         xtype: 'combobox',
+                                        cls: 'dv-combo',
                                         name: DV.conf.finals.chart.category,
                                         emptyText: 'Category',
                                         queryMode: 'local',
@@ -1231,6 +1566,7 @@
                                     { bodyStyle: 'padding:1px 0; border-style:none;	background-color:transparent' },
                                     {
                                         xtype: 'combobox',
+                                        cls: 'dv-combo',
                                         name: DV.conf.finals.chart.filter,
                                         emptyText: 'Filter',
                                         queryMode: 'local',
@@ -1268,20 +1604,21 @@
                                 items: [
                                     {
                                         xtype: 'combobox',
+                                        cls: 'dv-combo',
                                         style: 'margin-bottom:8px',
                                         width: DV.conf.layout.west_fieldset_width - 22,
                                         valueField: 'id',
                                         displayField: 'name',
                                         fieldLabel: 'Select group',
                                         labelStyle: 'padding-left:7px;',
-                                        labelWidth: 110,
+                                        labelWidth: 90,
                                         editable: false,
                                         queryMode: 'remote',
                                         store: Ext.create('Ext.data.Store', {
                                             fields: ['id', 'name', 'index'],
                                             proxy: {
                                                 type: 'ajax',
-                                                url: DV.conf.finals.ajax.url_commons + 'getIndicatorGroupsMinified.action',
+                                                url: DV.conf.finals.ajax.path_commons + DV.conf.finals.ajax.indicatorgroup_get,
                                                 reader: {
                                                     type: 'json',
                                                     root: 'indicatorGroups'
@@ -1301,6 +1638,7 @@
                                                 
                                                 if (DV.util.store.containsParent(store)) {
                                                     DV.util.store.loadFromStorage(store);
+                                                    DV.util.multiselect.filterAvailable(DV.cmp.dimension.indicator.available, DV.cmp.dimension.indicator.selected);
                                                 }
                                                 else {
                                                     store.load({params: {id: cb.getValue()}});
@@ -1317,7 +1655,7 @@
                                                 xtype: 'multiselect',
                                                 id: 'availableIndicators',
                                                 name: 'availableIndicators',
-                                                cls: 'multiselect',
+                                                cls: 'dv-toolbar-multiselect-left',
                                                 width: (DV.conf.layout.west_fieldset_width - 22) / 2,
                                                 displayField: 's',
                                                 valueField: 'id',
@@ -1327,7 +1665,7 @@
                                                     {
                                                         xtype: 'label',
                                                         text: 'Available indicators',
-                                                        style: 'padding-left:5px'
+                                                        cls: 'dv-toolbar-multiselect-left-label'
                                                     },
                                                     '->',
                                                     {
@@ -1363,7 +1701,7 @@
                                                 xtype: 'multiselect',
                                                 id: 'selectedIndicators',
                                                 name: 'selectedIndicators',
-                                                cls: 'multiselect',
+                                                cls: 'dv-toolbar-multiselect-right',
                                                 width: (DV.conf.layout.west_fieldset_width - 22) / 2,
                                                 displayField: 's',
                                                 valueField: 'id',
@@ -1392,7 +1730,7 @@
                                                     {
                                                         xtype: 'label',
                                                         text: 'Selected indicators',
-                                                        style: 'padding-right:5px'
+                                                        cls: 'dv-toolbar-multiselect-right-label'
                                                     }
                                                 ],
                                                 listeners: {
@@ -1428,20 +1766,21 @@
                                 items: [
                                     {
                                         xtype: 'combobox',
+                                        cls: 'dv-combo',
                                         style: 'margin-bottom:8px',
                                         width: DV.conf.layout.west_fieldset_width - 22,
                                         valueField: 'id',
                                         displayField: 'name',
                                         fieldLabel: 'Select group',
                                         labelStyle: 'padding-left:7px;',
-                                        labelWidth: 110,
+                                        labelWidth: 90,
                                         editable: false,
                                         queryMode: 'remote',
                                         store: Ext.create('Ext.data.Store', {
                                             fields: ['id', 'name', 'index'],
                                             proxy: {
                                                 type: 'ajax',
-                                                url: DV.conf.finals.ajax.url_commons + 'getDataElementGroupsMinified.action',
+                                                url: DV.conf.finals.ajax.path_commons + DV.conf.finals.ajax.dataelementgroup_get,
                                                 reader: {
                                                     type: 'json',
                                                     root: 'dataElementGroups'
@@ -1461,6 +1800,7 @@
                                                 
                                                 if (DV.util.store.containsParent(store)) {
                                                     DV.util.store.loadFromStorage(store);
+                                                    DV.util.multiselect.filterAvailable(DV.cmp.dimension.dataelement.available, DV.cmp.dimension.dataelement.selected);
                                                 }
                                                 else {
                                                     store.load({params: {id: cb.getValue()}});
@@ -1476,7 +1816,7 @@
                                             Ext.create('Ext.ux.form.MultiSelect', {
                                                 id: 'availableDataElements',
                                                 name: 'availableDataElements',
-                                                cls: 'multiselect',
+                                                cls: 'dv-toolbar-multiselect-left',
                                                 width: (DV.conf.layout.west_fieldset_width - 22) / 2,
                                                 displayField: 's',
                                                 valueField: 'id',
@@ -1486,7 +1826,7 @@
                                                     {
                                                         xtype: 'label',
                                                         text: 'Available data elements',
-                                                        style: 'padding-left:5px'
+                                                        cls: 'dv-toolbar-multiselect-left-label'
                                                     },
                                                     '->',
                                                     {
@@ -1522,7 +1862,7 @@
                                                 xtype: 'multiselect',
                                                 id: 'selectedDataElements',
                                                 name: 'selectedDataElements',
-                                                cls: 'multiselect',
+                                                cls: 'dv-toolbar-multiselect-right',
                                                 width: (DV.conf.layout.west_fieldset_width - 22) / 2,
                                                 displayField: 's',
                                                 valueField: 'id',
@@ -1551,7 +1891,7 @@
                                                     {
                                                         xtype: 'label',
                                                         text: 'Selected data elements',
-                                                        style: 'padding-right:5px'
+                                                        cls: 'dv-toolbar-multiselect-right-label'
                                                     }
                                                 ],
                                                 listeners: {
@@ -1594,7 +1934,7 @@
                                             {
                                                 xtype: 'panel',
                                                 layout: 'anchor',
-                                                bodyStyle: 'border-style:none; padding:0 40px 0 0px',
+                                                bodyStyle: 'border-style:none; padding:0 0 0 10px',
                                                 defaults: {
                                                     labelSeparator: '',
                                                     listeners: {
@@ -1609,7 +1949,7 @@
                                                     {
                                                         xtype: 'label',
                                                         text: 'Months',
-                                                        style: DV.conf.style.label.period_group
+                                                        cls: 'dv-label-period-heading'
                                                     },
                                                     {
                                                         xtype: 'checkbox',
@@ -1618,25 +1958,20 @@
                                                     },
                                                     {
                                                         xtype: 'checkbox',
-                                                        paramName: 'monthsThisYear',
-                                                        boxLabel: 'Months this year',
+                                                        paramName: 'last12Months',
+                                                        boxLabel: 'Last 12 months',
                                                         checked: true
-                                                    },
-                                                    {
-                                                        xtype: 'checkbox',
-                                                        paramName: 'monthsLastYear',
-                                                        boxLabel: 'Months last year'
                                                     }
                                                 ]
                                             },
                                             {
                                                 xtype: 'panel',
                                                 layout: 'anchor',
-                                                bodyStyle: 'border-style:none; padding-right:40px',
+                                                bodyStyle: 'border-style:none; padding:0 0 0 32px',
                                                 defaults: {
                                                     labelSeparator: '',
                                                     listeners: {
-                                                        afterrender: function(chb) {
+                                                        added: function(chb) {
                                                             if (chb.xtype === 'checkbox') {
                                                                 DV.cmp.dimension.period.push(chb);
                                                             }
@@ -1647,7 +1982,7 @@
                                                     {
                                                         xtype: 'label',
                                                         text: 'Quarters',
-                                                        style: DV.conf.style.label.period_group
+                                                        cls: 'dv-label-period-heading'
                                                     },
                                                     {
                                                         xtype: 'checkbox',
@@ -1656,24 +1991,58 @@
                                                     },
                                                     {
                                                         xtype: 'checkbox',
-                                                        paramName: 'quartersThisYear',
-                                                        boxLabel: 'Quarters this year'
-                                                    },
-                                                    {
-                                                        xtype: 'checkbox',
-                                                        paramName: 'quartersLastYear',
-                                                        boxLabel: 'Quarters last year'
+                                                        paramName: 'last4Quarters',
+                                                        boxLabel: 'Last 4 quarters'
                                                     }
                                                 ]
                                             },
                                             {
                                                 xtype: 'panel',
                                                 layout: 'anchor',
-                                                bodyStyle: 'border-style:none',
-                                                defaults: {
-                                                    labelSeparator: '',
-                                                    listeners: {
-                                                        afterrender: function(chb) {
+                                                bodyStyle: 'border-style:none; padding:0 0 0 32px',
+                                                defaults: {
+                                                    labelSeparator: '',
+                                                    listeners: {
+                                                        added: function(chb) {
+                                                            if (chb.xtype === 'checkbox') {
+                                                                DV.cmp.dimension.period.push(chb);
+                                                            }
+                                                        }
+                                                    }
+                                                },
+                                                items: [
+                                                    {
+                                                        xtype: 'label',
+                                                        text: 'Six-months',
+                                                        cls: 'dv-label-period-heading'
+                                                    },
+                                                    {
+                                                        xtype: 'checkbox',
+                                                        paramName: 'lastSixMonth',
+                                                        boxLabel: 'Last six-month'
+                                                    },
+                                                    {
+                                                        xtype: 'checkbox',
+                                                        paramName: 'last2SixMonths',
+                                                        boxLabel: 'Last 2 six-months'
+                                                    }
+                                                ]
+                                            }
+                                        ]
+                                    },
+                                    {
+                                        xtype: 'panel',
+                                        layout: 'column',
+                                        bodyStyle: 'border-style:none',
+                                        items: [
+                                            {
+                                                xtype: 'panel',
+                                                layout: 'anchor',
+                                                bodyStyle: 'border-style:none; padding:5px 0 0 10px',
+                                                defaults: {
+                                                    labelSeparator: '',
+                                                    listeners: {
+                                                        added: function(chb) {
                                                             if (chb.xtype === 'checkbox') {
                                                                 DV.cmp.dimension.period.push(chb);
                                                             }
@@ -1684,12 +2053,7 @@
                                                     {
                                                         xtype: 'label',
                                                         text: 'Years',
-                                                        style: DV.conf.style.label.period_group
-                                                    },
-                                                    {
-                                                        xtype: 'checkbox',
-                                                        paramName: 'thisYear',
-                                                        boxLabel: 'This year'
+                                                        cls: 'dv-label-period-heading'
                                                     },
                                                     {
                                                         xtype: 'checkbox',
@@ -1698,7 +2062,7 @@
                                                     },
                                                     {
                                                         xtype: 'checkbox',
-                                                        paramName: 'lastFiveYears',
+                                                        paramName: 'last5Years',
                                                         boxLabel: 'Last 5 years'
                                                     }
                                                 ]
@@ -1725,6 +2089,7 @@
                                 items: [
                                     {
                                         xtype: 'treepanel',
+                                        cls: 'dv-tree',
                                         height: 300,
                                         width: DV.conf.layout.west_fieldset_width - 22,
                                         autoScroll: true,
@@ -1740,7 +2105,7 @@
                                         store: Ext.create('Ext.data.TreeStore', {
                                             proxy: {
                                                 type: 'ajax',
-                                                url: DV.conf.finals.ajax.url_visualizer + 'getOrganisationUnitChildren.action'
+                                                url: DV.conf.finals.ajax.path_visualizer + DV.conf.finals.ajax.organisationunitchildren_get
                                             },
                                             root: {
                                                 id: DV.init.system.rootNode.id,
@@ -1820,13 +2185,17 @@
                 bodyStyle: 'padding:10px',
                 tbar: {
                     xtype: 'toolbar',
+                    cls: 'dv-toolbar',
                     height: DV.conf.layout.center_tbar_height,
+                    defaults: {
+                        height: 26
+                    },
                     items: [
                         {
                             xtype: 'button',
-							cls: 'dv-btn-toolbar',
                             name: 'resizewest',
-                            text: '<span class="dv-btn-toolbar-text-2"><<<</span>',
+							cls: 'dv-toolbar-btn-2',
+                            text: '<<<',
                             tooltip: 'Show/hide chart settings',
                             handler: function() {
                                 var p = DV.cmp.region.west;
@@ -1845,25 +2214,487 @@
                         },
                         {
                             xtype: 'button',
-							cls: 'dv-btn-toolbar',
-                            text: '<span class="dv-btn-toolbar-text-1">Update</span>',
+							cls: 'dv-toolbar-btn-1',
+                            text: 'Update',
                             handler: function() {
-                                DV.exe.execute(true, DV.init.isInit);
-                            }
-                        },
-                        {
-                            xtype: 'button',
-							cls: 'dv-btn-toolbar',
-                            text: '<span class="dv-btn-toolbar-text-2">Show..</span>',
-                            listeners: {
-                                afterrender: function(b) {
-                                    this.menu = Ext.create('Ext.menu.Menu', {
-                                        shadowOffset: 1,
+                                DV.exe.execute(true, DV.init.init);
+                            }
+                        },
+                        {
+                            xtype: 'button',
+							cls: 'dv-toolbar-btn-2',
+                            text: 'Favorites..',
+                            listeners: {
+                                afterrender: function(b) {
+                                    this.menu = Ext.create('Ext.menu.Menu', {
+                                        shadowOffset: 1,
+                                        showSeparator: false,
+                                        items: [
+                                            {
+                                                text: 'Manage favorites',
+                                                iconCls: 'dv-menu-item-edit',
+                                                handler: function() {
+                                                    if (DV.cmp.favorite.window) {
+                                                        DV.cmp.favorite.window.show();
+                                                    }
+                                                    else {
+                                                        DV.cmp.favorite.window = Ext.create('Ext.window.Window', {
+                                                            title: 'Manage favorites',
+                                                            iconCls: 'dv-window-title-favorite',
+                                                            bodyStyle: 'padding:8px; background-color:#fff',
+															width: DV.conf.layout.grid_favorite_width,
+                                                            closeAction: 'hide',
+                                                            modal: true,
+                                                            items: [
+                                                                {
+                                                                    xtype: 'form',
+                                                                    bodyStyle: 'border-style:none',
+                                                                    items: [
+                                                                        {
+                                                                            xtype: 'textfield',
+                                                                            cls: 'dv-textfield',
+                                                                            maxLength: 160,
+                                                                            enforceMaxLength: true,
+                                                                            fieldLabel: 'Name',
+                                                                            labelWidth: DV.conf.layout.form_label_width,
+                                                                            width: DV.conf.layout.grid_favorite_width - 28,
+                                                                            listeners: {
+                                                                                added: function() {
+                                                                                    DV.cmp.favorite.name = this;
+                                                                                },
+                                                                                change: function() {
+                                                                                    DV.cmp.favorite.save.xable();
+                                                                                }
+                                                                            }
+                                                                        }
+                                                                    ]
+                                                                },
+                                                                {
+                                                                    xtype: 'grid',
+                                                                    width: DV.conf.layout.grid_favorite_width - 28,
+                                                                    scroll: 'vertical',
+                                                                    multiSelect: true,
+                                                                    columns: [
+                                                                        {
+                                                                            dataIndex: 'name',
+                                                                            width: DV.conf.layout.grid_favorite_width - 139,
+                                                                            style: 'display:none'
+                                                                        },
+                                                                        {
+                                                                            dataIndex: 'lastUpdated',
+                                                                            width: 111,
+                                                                            style: 'display:none'
+                                                                        }
+                                                                    ],
+                                                                    setHeightInWindow: function(store) {
+                                                                        var h = (store.getTotalCount() * 23) + 30,
+                                                                            sh = DV.util.viewport.getSize().y * 0.8;
+                                                                        this.setHeight(h > sh ? sh : h);
+                                                                        this.doLayout();
+                                                                        this.up('window').doLayout();
+                                                                    },
+                                                                    store: DV.store.favorite,
+                                                                    tbar: {
+                                                                        id: 'favorite_t',
+                                                                        cls: 'dv-toolbar',
+                                                                        height: 30,
+                                                                        defaults: {
+                                                                            height: 24
+                                                                        },
+                                                                        items: [
+                                                                            {
+                                                                                text: 'Sort by..',
+                                                                                cls: 'dv-toolbar-btn-2',
+                                                                                handler: function() {
+                                                                                    
+                                                                                },
+                                                                                listeners: {
+                                                                                    added: function() {
+                                                                                        DV.cmp.favorite.sortby = this;
+                                                                                    },
+                                                                                    afterrender: function(b) {
+                                                                                        this.addCls('dv-menu-togglegroup');
+                                                                                        this.menu = Ext.create('Ext.menu.Menu', {
+                                                                                            shadowOffset: 1,
+                                                                                            showSeparator: false,
+                                                                                            width: 109,
+                                                                                            height: 70,
+                                                                                            items: [
+                                                                                                {
+                                                                                                    xtype: 'radiogroup',
+                                                                                                    cls: 'dv-radiogroup',
+                                                                                                    columns: 1,
+                                                                                                    vertical: true,
+                                                                                                    items: [
+                                                                                                        {
+                                                                                                            boxLabel: 'Name',
+                                                                                                            name: 'sortby',
+                                                                                                            handler: function() {
+                                                                                                                if (this.getValue()) {
+                                                                                                                    var store = DV.store.favorite;
+                                                                                                                    store.sorting.field = 'name';
+                                                                                                                    store.sorting.direction = 'ASC';
+                                                                                                                    store.sort(store.sorting.field, store.sorting.direction);
+                                                                                                                    this.up('menu').hide();
+                                                                                                                }
+                                                                                                            }
+                                                                                                        },
+                                                                                                        {
+                                                                                                            boxLabel: 'Last updated',
+                                                                                                            name: 'sortby',
+                                                                                                            checked: true,
+                                                                                                            handler: function() {
+                                                                                                                if (this.getValue()) {
+                                                                                                                    var store = DV.store.favorite;
+                                                                                                                    store.sorting.field = 'lastUpdated';
+                                                                                                                    store.sorting.direction = 'DESC';
+                                                                                                                    store.sort(store.sorting.field, store.sorting.direction);
+                                                                                                                    this.up('menu').hide();
+                                                                                                                }
+                                                                                                            }
+                                                                                                        }
+                                                                                                    ]
+                                                                                                }
+                                                                                            ]
+                                                                                        });
+                                                                                    }
+                                                                                }
+                                                                            },
+                                                                            '->',
+                                                                            {
+                                                                                text: 'Rename',
+                                                                                cls: 'dv-toolbar-btn-2',
+                                                                                disabled: true,
+                                                                                xable: function() {
+                                                                                    if (DV.cmp.favorite.grid.getSelectionModel().getSelection().length == 1) {
+                                                                                        DV.cmp.favorite.rename.button.enable();
+                                                                                    }
+                                                                                    else {
+                                                                                        DV.cmp.favorite.rename.button.disable();
+                                                                                    }
+                                                                                },
+                                                                                handler: function() {
+                                                                                    var selected = DV.cmp.favorite.grid.getSelectionModel().getSelection()[0];
+                                                                                    var w = Ext.create('Ext.window.Window', {
+                                                                                        title: 'Rename favorite',
+                                                                                        layout: 'fit',
+                                                                                        width: DV.conf.layout.window_confirm_width,
+                                                                                        bodyStyle: 'padding:10px 5px; background-color:#fff; text-align:center',
+                                                                                        modal: true,
+                                                                                        cmp: {},
+                                                                                        items: [
+                                                                                            {
+                                                                                                xtype: 'textfield',
+                                                                                                cls: 'dv-textfield',
+                                                                                                maxLength: 160,
+                                                                                                enforceMaxLength: true,
+                                                                                                value: selected.data.name,
+                                                                                                listeners: {
+                                                                                                    added: function() {
+                                                                                                        this.up('window').cmp.name = this;
+                                                                                                    },
+                                                                                                    change: function() {
+                                                                                                        this.up('window').cmp.rename.xable();
+                                                                                                    }
+                                                                                                }
+                                                                                            }
+                                                                                        ],
+                                                                                        bbar: [
+                                                                                            {
+                                                                                                text: 'Cancel',
+                                                                                                handler: function() {
+                                                                                                    this.up('window').close();
+                                                                                                }
+                                                                                            },
+                                                                                            '->',
+                                                                                            {
+                                                                                                text: 'Rename',
+                                                                                                disabled: true,
+                                                                                                xable: function() {
+                                                                                                    var value = this.up('window').cmp.name.getValue();
+                                                                                                    if (value && value != DV.cmp.favorite.name.getValue()) {
+                                                                                                        this.enable();
+                                                                                                    }
+                                                                                                    else {
+                                                                                                        this.disable();
+                                                                                                    }
+                                                                                                },
+                                                                                                handler: function() {
+                                                                                                    DV.util.crud.favorite.updateName(this.up('window').cmp.name.getValue());
+                                                                                                },
+                                                                                                listeners: {
+                                                                                                    afterrender: function() {
+                                                                                                        this.up('window').cmp.rename = this;
+                                                                                                    },
+                                                                                                    change: function() {
+                                                                                                        this.xable();
+                                                                                                    }
+                                                                                                }
+                                                                                            }
+                                                                                        ],
+                                                                                        listeners: {
+                                                                                            afterrender: function() {
+                                                                                                DV.cmp.favorite.rename.window = this;
+                                                                                            }
+                                                                                        }
+                                                                                    });
+                                                                                    w.setPosition((screen.width/2)-(DV.conf.layout.window_confirm_width/2), DV.conf.layout.window_favorite_ypos + 100, true);
+                                                                                    w.show();
+                                                                                },
+                                                                                listeners: {
+                                                                                    added: function() {
+                                                                                        DV.cmp.favorite.rename.button = this;
+                                                                                    }
+                                                                                }
+                                                                            },
+                                                                            {
+                                                                                text: 'Delete',
+                                                                                cls: 'dv-toolbar-btn-2',
+                                                                                disabled: true,
+                                                                                xable: function() {
+                                                                                    if (DV.cmp.favorite.grid.getSelectionModel().getSelection().length) {
+                                                                                        DV.cmp.favorite.del.enable();
+                                                                                    }
+                                                                                    else {
+                                                                                        DV.cmp.favorite.del.disable();
+                                                                                    }
+                                                                                },
+                                                                                handler: function() {
+                                                                                    var sel = DV.cmp.favorite.grid.getSelectionModel().getSelection();
+                                                                                    if (sel.length) {
+                                                                                        var str = '';
+                                                                                        for (var i = 0; i < sel.length; i++) {
+                                                                                            var out = sel[i].data.name.length > 35 ? (sel[i].data.name.substr(0,35) + '...') : sel[i].data.name;
+                                                                                            str += '<br/>' + out;
+                                                                                        }
+                                                                                        var w = Ext.create('Ext.window.Window', {
+                                                                                            title: 'Delete favorites',
+                                                                                            width: DV.conf.layout.window_confirm_width,
+                                                                                            bodyStyle: 'padding:10px 5px; background-color:#fff; text-align:center',
+                                                                                            modal: true,
+                                                                                            items: [
+                                                                                                {
+                                                                                                    html: 'Are you sure?',
+                                                                                                    bodyStyle: 'border-style:none'
+                                                                                                },
+                                                                                                {
+                                                                                                    html: str,
+                                                                                                    cls: 'dv-window-confirm-list'
+                                                                                                }                                                                                                    
+                                                                                            ],
+                                                                                            bbar: [
+                                                                                                {
+                                                                                                    text: 'Cancel',
+                                                                                                    handler: function() {
+                                                                                                        this.up('window').close();
+                                                                                                    }
+                                                                                                },
+                                                                                                '->',
+                                                                                                {
+                                                                                                    text: 'Delete',
+                                                                                                    handler: function() {
+                                                                                                        this.up('window').close();
+                                                                                                        DV.util.crud.favorite.del(function() {
+                                                                                                            DV.cmp.favorite.name.setValue('');
+                                                                                                            DV.cmp.favorite.window.down('grid').setHeightInWindow(DV.store.favorite);
+                                                                                                        });                                                                                                        
+                                                                                                    }
+                                                                                                }
+                                                                                            ]
+                                                                                        });
+                                                                                        w.setPosition((screen.width/2)-(DV.conf.layout.window_confirm_width/2), DV.conf.layout.window_favorite_ypos + 100, true);
+                                                                                        w.show();
+                                                                                    }
+                                                                                },
+                                                                                listeners: {
+                                                                                    added: function() {
+                                                                                        DV.cmp.favorite.del = this;
+                                                                                    }
+                                                                                }
+                                                                            }
+                                                                        ]
+                                                                    },
+                                                                    listeners: {
+                                                                        added: function() {
+                                                                            DV.cmp.favorite.grid = this;
+                                                                        },
+                                                                        itemclick: function(g, r) {
+                                                                            DV.cmp.favorite.name.setValue(r.get('name'));
+                                                                            DV.cmp.favorite.rename.button.xable();
+                                                                            DV.cmp.favorite.del.xable();
+                                                                        },
+                                                                        itemdblclick: function() {
+                                                                            DV.cmp.favorite.save.handler();
+                                                                        }
+                                                                    }
+                                                                }
+                                                            ],
+                                                            bbar: {
+                                                                cls: 'dv-toolbar',
+                                                                height: 29,
+                                                                defaults: {
+                                                                    height: 24
+                                                                },
+                                                                items: [
+                                                                    '->',
+                                                                    {
+                                                                        text: 'Save',
+                                                                        disabled: true,
+                                                                        xable: function() {
+                                                                            if (DV.state.isRendered && DV.cmp.favorite.name.getValue()) {
+                                                                                this.enable();
+                                                                            }
+                                                                            else {
+                                                                                this.disable();
+                                                                            }
+                                                                        },
+                                                                        handler: function() {
+                                                                            var value = DV.cmp.favorite.name.getValue();
+                                                                            if (DV.state.isRendered && value) {
+                                                                                if (DV.store.favorite.findExact('name', value) != -1) {
+                                                                                    var item = value.length > 35 ? (value.substr(0,35) + '...') : value;
+                                                                                    var w = Ext.create('Ext.window.Window', {
+                                                                                        title: 'Save favorite',
+                                                                                        width: DV.conf.layout.window_confirm_width,
+                                                                                        bodyStyle: 'padding:10px 5px; background-color:#fff; text-align:center',
+                                                                                        modal: true,
+                                                                                        items: [
+                                                                                            {
+                                                                                                html: 'Are you sure?',
+                                                                                                bodyStyle: 'border-style:none'
+                                                                                            },
+                                                                                            {
+                                                                                                html: '<br/>' + item,
+                                                                                                cls: 'dv-window-confirm-list'
+                                                                                            }
+                                                                                        ],
+                                                                                        bbar: [
+                                                                                            {
+                                                                                                text: 'Cancel',
+                                                                                                handler: function() {
+                                                                                                    this.up('window').close();
+                                                                                                }
+                                                                                            },
+                                                                                            '->',
+                                                                                            {
+                                                                                                text: 'Overwrite',
+                                                                                                handler: function() {
+                                                                                                    this.up('window').close();
+                                                                                                    DV.util.crud.favorite.update(function() {
+                                                                                                        DV.cmp.favorite.name.setValue('');
+                                                                                                    });
+                                                                                                    
+                                                                                                }
+                                                                                            }
+                                                                                        ]
+                                                                                    });
+                                                                                    w.setPosition((screen.width/2)-(DV.conf.layout.window_confirm_width/2), DV.conf.layout.window_favorite_ypos + 100, true);
+                                                                                    w.show();
+                                                                                }
+                                                                                else {
+                                                                                    DV.util.crud.favorite.create(function() {
+                                                                                        DV.cmp.favorite.name.setValue('');
+                                                                                        DV.cmp.favorite.window.down('grid').setHeightInWindow(DV.store.favorite);
+                                                                                    });
+                                                                                }                                                                                    
+                                                                            }
+                                                                        },
+                                                                        listeners: {
+                                                                            added: function() {
+                                                                                DV.cmp.favorite.save = this;
+                                                                            }
+                                                                        }
+                                                                    }
+                                                                ]
+                                                            },
+                                                            listeners: {
+                                                                show: function() {                                               
+                                                                    DV.cmp.favorite.save.xable();
+                                                                    this.down('grid').setHeightInWindow(DV.store.favorite);
+                                                                }
+                                                            }
+                                                        });
+                                                        var w = DV.cmp.favorite.window;
+                                                        w.setPosition((screen.width/2)-(DV.conf.layout.grid_favorite_width/2), DV.conf.layout.window_favorite_ypos, true);
+                                                        w.show();
+                                                    }
+                                                },
+                                                listeners: {
+                                                    added: function() {
+                                                        DV.cmp.toolbar.menuitem.datatable = this;
+                                                    }
+                                                }
+                                            },
+                                            '-',
+                                            {
+                                                xtype: 'grid',
+                                                cls: 'dv-menugrid',
+                                                width: 420,
+                                                scroll: 'vertical',
+                                                columns: [
+                                                    {
+                                                        dataIndex: 'icon',
+                                                        width: 25,
+                                                        style: 'display:none'
+                                                    },
+                                                    {
+                                                        dataIndex: 'name',
+                                                        width: 289,
+                                                        style: 'display:none'
+                                                    },
+                                                    {
+                                                        dataIndex: 'lastUpdated',
+                                                        width: 106,
+                                                        style: 'display:none'
+                                                    }
+                                                ],
+                                                setHeightInMenu: function(store) {
+                                                    var h = store.getTotalCount() * 26,
+                                                        sh = DV.util.viewport.getSize().y * 0.8;
+                                                    this.setHeight(h > sh ? sh : h);
+                                                    this.doLayout();
+                                                    this.up('menu').doLayout();
+                                                },
+                                                store: DV.store.favorite,
+                                                listeners: {
+                                                    itemclick: function(g, r) {
+                                                        g.getSelectionModel().select([], false);
+                                                        this.up('menu').hide();
+                                                        DV.exe.execute(true, r.data.id);
+                                                    }
+                                                }
+                                            }
+                                        ],
+                                        listeners: {
+                                            show: function() {
+                                                if (!DV.store.favorite.isLoaded) {
+                                                    DV.store.favorite.load({scope: this, callback: function() {
+                                                        this.down('grid').setHeightInMenu(DV.store.favorite);
+                                                    }});
+                                                }
+                                                else {
+                                                    this.down('grid').setHeightInMenu(DV.store.favorite);
+                                                }
+                                            }
+                                        }
+                                    });
+                                }
+                            }
+                        },
+                        {
+                            xtype: 'button',
+							cls: 'dv-toolbar-btn-2',
+                            text: 'Show..',
+                            listeners: {
+                                afterrender: function(b) {
+                                    this.menu = Ext.create('Ext.menu.Menu', {
+                                        shadowOffset: 1,
+                                        showSeparator: false,
                                         items: [
                                             {
                                                 text: 'Data table',
                                                 iconCls: 'dv-menu-item-datatable',
-                                                minWidth: 100,
+                                                minWidth: 90,
                                                 handler: function() {
                                                     var p = DV.cmp.region.east;
                                                     if (p.collapsed && p.items.length) {
@@ -1896,8 +2727,8 @@
                         },
                         {
                             xtype: 'button',
-							cls: 'dv-btn-toolbar',
-                            text: '<span class="dv-btn-toolbar-text-2">Save as..</span>',
+							cls: 'dv-toolbar-btn-2',
+                            text: 'Save as..',
                             execute: function(type) {
                                 var svg = document.getElementsByTagName('svg');
                                 
@@ -1924,11 +2755,12 @@
                                 afterrender: function(b) {
                                     this.menu = Ext.create('Ext.menu.Menu', {
                                         shadowOffset: 1,
+                                        showSeparator: false,
                                         items: [
                                             {
                                                 text: 'Image (PNG)',
                                                 iconCls: 'dv-menu-item-png',
-                                                minWidth: 110,
+                                                minWidth: 105,
                                                 handler: function() {
                                                     b.execute(DV.conf.finals.image.png);
                                                 }
@@ -1936,7 +2768,7 @@
                                             {
                                                 text: 'PDF',
                                                 iconCls: 'dv-menu-item-pdf',
-                                                minWidth: 110,
+                                                minWidth: 105,
                                                 handler: function() {
                                                     b.execute(DV.conf.finals.image.pdf);
                                                 }
@@ -1949,17 +2781,17 @@
                         '->',
                         {
                             xtype: 'button',
-							cls: 'dv-btn-toolbar',
-                            text: '<span class="dv-btn-toolbar-text-2">Exit</span>',
+							cls: 'dv-toolbar-btn-2',
+                            text: 'Exit',
                             handler: function() {
-                                window.location.href = DV.conf.finals.ajax.url_portal + 'redirect.action';
+                                window.location.href = DV.conf.finals.ajax.path_portal + DV.conf.finals.ajax.redirect;
                             }
                         },
                         {
                             xtype: 'button',
-							cls: 'dv-btn-toolbar',
                             name: 'resizeeast',
-                            text: '<span class="dv-btn-toolbar-text-2">>>></span>',
+							cls: 'dv-toolbar-btn-2',
+                            text: '>>>',
                             tooltip: 'Hide data table',
                             hidden: true,
                             handler: function() {

=== modified file 'dhis-2/dhis-web/dhis-web-visualizer/src/main/webapp/dhis-web-visualizer/app/css/style.css'
--- dhis-2/dhis-web/dhis-web-visualizer/src/main/webapp/dhis-web-visualizer/app/css/style.css	2011-12-06 17:41:41 +0000
+++ dhis-2/dhis-web/dhis-web-visualizer/src/main/webapp/dhis-web-visualizer/app/css/style.css	2011-12-19 22:15:46 +0000
@@ -1,15 +1,15 @@
-/****************
- ExtJS overrides
- ****************/
+body {
+    font: normal 10px arial, ubuntu;
+}
 
-.x-body {
-	font-family: arial, ubuntu;
+.x-panel-body {
+    font-size: 11px;
 }
 
 /* Combobox empty text */
 .x-form-empty-field, textarea.x-form-empty-field {
-    font-size: 10px;
-    color: #777;
+    font-size: 20px;
+    color: red;
 }
 
 /* Combobox text position*/
@@ -22,9 +22,19 @@
     font-size: 10px;
 }
 
-/* General font */
-.x-form-item, .x-form-field, .x-form-display-field  {
-	font: normal 10px arial, ubuntu;
+/* Combobox border-radius */
+.dv-combo input {
+    -moz-border-radius: 2px 0px 0px 0px;
+    -webkit-border-radius: 2px 0px 0px 0px;
+    -o-border-radius: 2px 0px 0px 0px;
+    -ms-border-radius: 2px 0px 0px 0px;
+    -khtml-border-radius: 2px 0px 0px 0px;
+    border-radius: 2px 0px 0px 0px;
+}
+
+/* Combobox text position */
+.dv-combo .x-form-text {
+    padding-left: 4px;
 }
 
 /* Combobox field label font */
@@ -51,14 +61,10 @@
     padding-bottom: 4px;
 }
 
+/* Fieldset header */
 .x-fieldset-header {
-    font-size: 11px;
-	font-family: arial, ubuntu;
-    font-weight: bold;
-    color: #000;
-    padding: 0 7px 0 5px;
+    padding-right: 7px;
 }
-
 .x-fieldset-header .x-fieldset-header-text {
     padding-left: 3px;
 }
@@ -73,7 +79,6 @@
 .x-tool-over .x-tool-toggle {
     background-position: -25px -60px;
 }
-
 .x-panel-collapsed .x-tool-over .x-tool-toggle, .x-fieldset-collapsed .x-tool-over .x-tool-toggle {
     background-position: -25px -75px;
 }
@@ -94,18 +99,116 @@
     background-position: -25px -60px;
 }
 
-/* Tree panel font */
+/* Grid / Tree panel font color */
 .x-grid-row .x-grid-cell {
-    font: 10px arial, ubuntu;
     color: #222;
+    background-color: transparent;
+    border: 1px solid transparent;
+}
+
+.x-grid-row-selected .x-grid-cell {
+    border: 1px solid transparent;
+}
+
+.x-grid-row-over {
+    background-color: #f1f1f1;
+}
+
+.x-grid-row-over .x-grid-cell-first, .x-grid-row-selected .x-grid-cell-first {
+    -moz-border-radius: 2px 0 0 2px;
+    -webkit-border-radius: 2px 0 0 2px;
+    -o-border-radius: 2px 0 0 2px;
+    -ms-border-radius: 2px 0 0 2px;
+    -khtml-border-radius: 2px 0 0 2px;
+    border-radius: 2px 0 0 2px;
+}
+
+.x-grid-row-over .x-grid-cell-last, .x-grid-row-selected .x-grid-cell-last {
+    -moz-border-radius: 0 2px 2px 0;
+    -webkit-border-radius: 0 2px 2px 0;
+    -o-border-radius: 0 2px 2px 0;
+    -ms-border-radius: 0 2px 2px 0;
+    -khtml-border-radius: 0 2px 2px 0;
+    border-radius: 0 2px 2px 0;
+}
+
+/* DV menu grid */
+.dv-menugrid .x-grid-row .x-grid-cell, .dv-menugrid .x-grid-row-selected .x-grid-cell {
+    border: 0 none;
+    border-top: 1px solid transparent;
+    border-bottom: 1px solid transparent;
+    background: #f1f1f1;
+}
+.dv-menugrid .x-grid-row .x-grid-cell-first, .dv-menugrid .x-grid-row-selected .x-grid-cell-first {
+    border: 1px solid transparent;
+    border-right: 0 none;
+}
+.dv-menugrid .x-grid-row .x-grid-cell-last, .dv-menugrid .x-grid-row-selected .x-grid-cell-last {
+    border: 1px solid transparent;
+    border-left: 0 none;
+}
+    
+.dv-menugrid .x-grid-row-over .x-grid-cell {
+    border: 0 none;
+    border-top: 1px solid #9d9d9d;
+    border-bottom: 1px solid #9d9d9d;
+    background-image: none;
+    background-color: #E6E6E6;
+    background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #eeeeee), color-stop(100%, #dcdcdc));
+    background-image: -webkit-linear-gradient(top, #eeeeee,#dcdcdc);
+    background-image: -moz-linear-gradient(top, #eeeeee,#dcdcdc);
+    background-image: -o-linear-gradient(top, #eeeeee,#dcdcdc);
+    background-image: -ms-linear-gradient(top, #eeeeee,#dcdcdc);
+    background-image: linear-gradient(top, #eeeeee,#dcdcdc);
+}
+.dv-menugrid .x-grid-row-over .x-grid-cell-first {
+    border: 1px solid #9d9d9d;
+    border-right: 0 none;
+    -moz-border-radius: 3px 0 0 3px;
+    -webkit-border-radius: 3px 0 0 3px;
+    -o-border-radius: 3px 0 0 3px;
+    -ms-border-radius: 3px 0 0 3px;
+    -khtml-border-radius: 3px 0 0 3px;
+    border-radius: 3px 0 0 3px;
+}
+.dv-menugrid .x-grid-row-over .x-grid-cell-last {
+    border: 1px solid #9d9d9d;
+    border-left: 0 none;
+    -moz-border-radius: 0 3px 3px 0;
+    -webkit-border-radius: 0 3px 3px 0;
+    -o-border-radius: 0 3px 3px 0;
+    -ms-border-radius: 0 3px 3px 0;
+    -khtml-border-radius: 0 3px 3px 0;
+    border-radius: 0 3px 3px 0;
 }
 
 /* Tree panel node height */
-.x-tree-panel .x-grid-row .x-grid-cell-inner {
+.dv-tree .x-tree-panel .x-grid-row .x-grid-cell-inner {
     height: 17px;
 }
 
-/* (Tree)Panel border */
+/* Tree panel selected row background */
+.dv-tree .x-grid-row-selected .x-grid-cell, .dv-tree .x-grid-row-selected .x-grid-rowwrap-div {
+    background-color: #e0e0e0;
+    -moz-border-radius: 2px 2px 2px 2px;
+    -webkit-border-radius: 2px 2px 2px 2px;
+    -o-border-radius: 2px 2px 2px 2px;
+    -ms-border-radius: 2px 2px 2px 2px;
+    -khtml-border-radius: 2px 2px 2px 2px;
+    border-radius: 2px 2px 2px 2px;
+}
+
+/* Tree panel hover row background */
+.dv-tree .x-grid-cell {
+    -moz-border-radius: 2px 2px 2px 2px;
+    -webkit-border-radius: 2px 2px 2px 2px;
+    -o-border-radius: 2px 2px 2px 2px;
+    -ms-border-radius: 2px 2px 2px 2px;
+    -khtml-border-radius: 2px 2px 2px 2px;
+    border-radius: 2px 2px 2px 2px;
+}
+
+/* Panel border */
 .x-panel .x-grid-body {
     border-style: none;
 }
@@ -119,37 +222,49 @@
 .x-boundlist-item {
     color: #333;
     padding: 2px 2px 2px 4px;
+    font-size: 10px;
+    border: 1px solid transparent;
 }
 .x-boundlist-item-over {
-    background-color: #eee;
-    border-color: #ddd;
+    background-color: #f1f1f1;
+    border-color: #f1f1f1;
 }
 .x-boundlist-selected {
     background-color: #d3d3d3;
-    border-color: #b3abaa;
+    border-color: #d3d3d3;
 }
 
 /* Checkbox icons */
-.x-form-checkbox, .x-form-radio {
+.x-form-checkbox {
     background-image: url('../images/checkbox.gif');
 }
 
 /* Checkbox box label */
 .x-form-cb-label-after {
-    padding-left: 3px;
-    font: 11px arial, ubuntu;
+    padding-left: 1px;
+    font-size: 11px;
+}
+
+/* Button dv-toolbar font size */
+.dv-toolbar * {
+    font-size: 11px;
+}
+.dv-toolbar .dv-toolbar-btn-1 * {
+    color: #111;
+    font-weight: bold;
+}
+.dv-toolbar .dv-toolbar-btn-2 * {
+    color: #444;
 }
 
 /* Button chart image */
 .x-btn-default-toolbar-small-icon button {
     width: 32px !important;
 }
-
 .x-btn-default-toolbar-small-icon .x-btn-icon {
     width: 32px;
     height: 32px;
 }
-
 .x-btn-arrow {
     background-image: url('../images/arrow.png');
 }
@@ -177,11 +292,6 @@
     border-width: 1px;
 }
 
-/* Button font-family */
-.x-btn-default-toolbar-small .x-btn-inner {
-	font-family: arial, ubuntu;
-}
-
 /* Toolbar separator */
 .x-toolbar .x-toolbar-separator-horizontal {
     height: 15px;
@@ -209,10 +319,10 @@
     -ms-border-radius: 2px 2px 2px 2px;
     -khtml-border-radius: 2px 2px 2px 2px;
     border-radius: 2px 2px 2px 2px;
-    padding: 2px 5px 2px 0;
+    padding: 2px 5px 2px 2px;
     border-width: 2px;
     border-style: solid;
-    background-color: #eee;
+    background-color: #f1f1f1;
 }
 
 /* Chart tips (tooltip) */
@@ -221,8 +331,16 @@
 }
 
 /* Grid datatable column header */
-.x-column-header {
-	font: normal 11px arial, ubuntu;
+.x-column-header-inner .x-column-header-text {
+	font-size: 11px;
+}
+
+/* Grid row/cell text position */
+.x-grid-cell-inner {
+    line-height: 15px;
+    font-size: 10px;
+    cursor: pointer;
+    cursor: hand;
 }
 
 /* Grid datatable column chooser */
@@ -230,20 +348,7 @@
     display: none;
 }
 
-/****************
- Data Visualizer
- ***************/
-
-body {
-    font: normal 11px arial, ubuntu;
-}
-
-li {
-   font-size: 10px;
-   color: #000;
-}
-
-/* Second toolbar */
+/* Toolbar second bar chart settings */
 #chartsettings_tb {
     background: #f5f5f5;
     padding: 5px 0 0 8px;
@@ -251,64 +356,68 @@
     border-top: 1px dashed #ccc;
 }
 
+/* Toolbar favorites */
+#favorite_t {
+    border-bottom-width: 1px !important;
+    -moz-border-radius: 2px 2px 2px 2px;
+    -webkit-border-radius: 2px 2px 2px 2px;
+    -o-border-radius: 2px 2px 2px 2px;
+    -ms-border-radius: 2px 2px 2px 2px;
+    -khtml-border-radius: 2px 2px 2px 2px;
+    border-radius: 2px 2px 2px 2px;
+}    
+
 /* Multiselect dock border radius */
-#availableIndicators .x-docked-top {    
-    -o-border-top-left-radius: 2px;
-	-icab-border-top-left-radius: 2px;
-	-khtml-border-top-left-radius: 2px;
-    -moz-border-radius-topleft: 2px;
-	-webkit-border-top-left-radius: 2px;
-	border-top-left-radius: 2px;
-}
-
-#availableDataElements .x-docked-top { 
-    -o-border-top-left-radius: 2px;
-	-icab-border-top-left-radius: 2px;
-	-khtml-border-top-left-radius: 2px;
-    -moz-border-radius-topleft: 2px;
-	-webkit-border-top-left-radius: 2px;
-	border-top-left-radius: 2px;
-}
-
-#selectedIndicators .x-docked-top { 
-    -o-border-top-right-radius: 2px;
-	-icab-border-top-right-radius: 2px;
-	-khtml-border-top-right-radius: 2px;
-    -moz-border-radius-topright: 2px;
-	-webkit-border-top-right-radius: 2px;
-	border-top-right-radius: 2px;
-}
-
-#selectedDataElements .x-docked-top { 
-    -o-border-top-right-radius: 2px;
-	-icab-border-top-right-radius: 2px;
-	-khtml-border-top-right-radius: 2px;
-    -moz-border-radius-topright: 2px;
-	-webkit-border-top-right-radius: 2px;
-	border-top-right-radius: 2px;
+.dv-toolbar-multiselect-left .x-docked-top {    
+    -o-border-top-left-radius: 2px;
+	-icab-border-top-left-radius: 2px;
+	-khtml-border-top-left-radius: 2px;
+    -moz-border-radius-topleft: 2px;
+	-webkit-border-top-left-radius: 2px;
+	border-top-left-radius: 2px;
+}
+
+.dv-toolbar-multiselect-right .x-docked-top { 
+    -o-border-top-right-radius: 2px;
+	-icab-border-top-right-radius: 2px;
+	-khtml-border-top-right-radius: 2px;
+    -moz-border-radius-topright: 2px;
+	-webkit-border-top-right-radius: 2px;
+	border-top-right-radius: 2px;
+}
+
+/* Multiselect docked bar font size */
+.dv-toolbar-multiselect-left .dv-toolbar-multiselect-left-label {
+    font-size: 11px;
+    padding-left: 5px;
+}
+.dv-toolbar-multiselect-right .dv-toolbar-multiselect-right-label {
+    font-size: 11px;
+    padding-right: 5px;
 }
 
 /* Multiselect boundlist */
-#availableIndicators .x-boundlist-item-over, #availableDataElements .x-boundlist-item-over {
+.dv-toolbar-multiselect-left .x-boundlist-item-over {
     background-color: transparent;
     border-color: transparent;
 }
-#availableIndicators .x-boundlist-selected, #availableDataElements .x-boundlist-selected {
+.dv-toolbar-multiselect-left .x-boundlist-selected {
     background-color: #d3d3d3;
-    border-color: #b3abaa;
+    border-color: #d3d3d3;
 }
 
-#selectedIndicators .x-boundlist-item-over, #selectedDataElements .x-boundlist-item-over {
+.dv-toolbar-multiselect-right .x-boundlist-item-over {
     background-color: transparent;
     border-color: transparent;
 }
-#selectedIndicators .x-boundlist-selected, #selectedDataElements .x-boundlist-selected {
+.dv-toolbar-multiselect-right .x-boundlist-selected {
     background-color: #d3d3d3;
-    border-color: #b3abaa;
+    border-color: #d3d3d3;
 }
 
 /* Menu */
 .x-menu-body {
+    border-color: #bbb;
     -moz-border-radius: 2px 2px 2px 2px;
     -webkit-border-radius: 2px 2px 2px 2px;
     -o-border-radius: 2px 2px 2px 2px;
@@ -330,30 +439,21 @@
     border-color: #aaa;
 }
 
+/* Menu item */
 .x-menu-item-link {
-    padding: 3px 5px 4px 35px;
+    padding: 4px 5px 4px 28px;
 }
 
-.x-menu-item-active .x-menu-item-link {
-    -moz-border-radius: 2px 2px 2px 2px;
-    -webkit-border-radius: 2px 2px 2px 2px;
-    -o-border-radius: 2px 2px 2px 2px;
-    -ms-border-radius: 2px 2px 2px 2px;
-    -khtml-border-radius: 2px 2px 2px 2px;
-    border-radius: 2px 2px 2px 2px;
-    border-width: 1px;
-    border-style: solid;
-    border-color: #aaa;
+/* Menu item color */
+.x-menu-item-text {
+    color: #111;
 }
 
 /* Fieldset */
 .dv-fieldset-title-link {
     color:#000;
-    text-decoration:none;
-}
-
-.dv-fieldset-title-link-sub {
-    color:#555;
+    font-size: 11px;
+    font-weight: bold;
     text-decoration:none;
 }
 
@@ -364,39 +464,40 @@
 
 /* Chart tips */
 .dv-chart-tips {
-    font: normal 13px arial, ubuntu;
+    font-size: 13px;
     padding: 0 0 3px 3px;
+    font-weight: normal;
 }
 
 /* Window */
+.dv-window-title-favorite {
+    padding-left: 19px;
+    background-image: url('../images/favorite.png');
+}
 .dv-window-title-datatable {
     padding-left: 19px;
     background-image: url('../images/datatable.png');
 }
 
-/* Grid datatable */
-.dv-datatable .x-grid-header-ct {
+/* Label heading periods */
+.dv-label-period-heading {
+    font-size: 11px;
+    font-weight: bold;
+    color: #666;
+    line-height: 20px;
+}
+
+/* Grid datatable columns */
+.x-grid-header-ct {
     border-style: none;
 }
 
-#datatable_g .x-fit-item {
+/* Grid datatable first row border top */
+.dv-datatable .x-fit-item {
     border-top: 1px solid #d0d0d0;
 }
 
-/* Button - toolbar */
-.dv-btn-toolbar {
-    border-width: 1px;
-    padding: 3px;
-}
-
-.dv-btn-toolbar-text-1 {
-    color: #333;
-    font-weight: bold;
-}
-.dv-btn-toolbar-text-2 {
-    color: #444;
-}
-
+/* Menu item icon */
 .dv-menu-item-png {
     background-image:url('../images/png.png');
 }
@@ -409,6 +510,57 @@
     background-image:url('../images/datatable.png');
 }
 
-
-    
-
+.dv-menu-item-edit {
+    background-image:url('../images/edit.png');
+}
+
+/* Textfield */
+.dv-textfield .x-form-field {  
+    height: 26px;
+    padding-left: 4px;
+    -moz-border-radius: 2px 2px 2px 2px;
+    -webkit-border-radius: 2px 2px 2px 2px;
+    -o-border-radius: 2px 2px 2px 2px;
+    -ms-border-radius: 2px 2px 2px 2px;
+    -khtml-border-radius: 2px 2px 2px 2px;
+    border-radius: 2px 2px 2px 2px;
+    font-size: 11px;
+    color: #333;
+}
+.dv-textfield .x-form-item-label {
+    padding-left: 5px;
+    line-height: 20px;
+}
+
+/* DV window confirm list */
+.dv-window-confirm-list .x-panel-body {
+    color: #444;
+    font-size: 10px;
+    border-style: none;
+}
+
+/* Button DV menu toggle group */
+.dv-radiogroup .x-form-cb-wrap {
+    padding-left: 7px;
+}
+.dv-radiogroup .x-form-cb-label-after {
+    padding-left: 2px;
+    font-size: 11px;
+    color: #444;
+}
+.dv-radiogroup .x-form-radio-group {
+    padding-top: 5px;
+}
+
+/* DV menu grid icon/text position aligned with menuitem */
+.dv-menugrid .x-grid-cell-inner {
+    padding: 4px 3px;
+    font-size: 11px;
+    color: #444;
+    line-height: 16px;
+}
+
+/* DV menu grid background now looks like a menu*/
+.dv-menugrid .x-grid-view {
+    background-color: #f1f1f1;
+}

=== modified file 'dhis-2/dhis-web/dhis-web-visualizer/src/main/webapp/dhis-web-visualizer/app/images/datatable.png'
Binary files dhis-2/dhis-web/dhis-web-visualizer/src/main/webapp/dhis-web-visualizer/app/images/datatable.png	2011-11-16 16:29:35 +0000 and dhis-2/dhis-web/dhis-web-visualizer/src/main/webapp/dhis-web-visualizer/app/images/datatable.png	2011-12-16 15:12:55 +0000 differ
=== added file 'dhis-2/dhis-web/dhis-web-visualizer/src/main/webapp/dhis-web-visualizer/app/images/datatable2.png'
Binary files dhis-2/dhis-web/dhis-web-visualizer/src/main/webapp/dhis-web-visualizer/app/images/datatable2.png	1970-01-01 00:00:00 +0000 and dhis-2/dhis-web/dhis-web-visualizer/src/main/webapp/dhis-web-visualizer/app/images/datatable2.png	2011-12-16 15:12:55 +0000 differ
=== added file 'dhis-2/dhis-web/dhis-web-visualizer/src/main/webapp/dhis-web-visualizer/app/images/edit.png'
Binary files dhis-2/dhis-web/dhis-web-visualizer/src/main/webapp/dhis-web-visualizer/app/images/edit.png	1970-01-01 00:00:00 +0000 and dhis-2/dhis-web/dhis-web-visualizer/src/main/webapp/dhis-web-visualizer/app/images/edit.png	2011-12-16 15:12:55 +0000 differ
=== added file 'dhis-2/dhis-web/dhis-web-visualizer/src/main/webapp/dhis-web-visualizer/app/images/favorite.png'
Binary files dhis-2/dhis-web/dhis-web-visualizer/src/main/webapp/dhis-web-visualizer/app/images/favorite.png	1970-01-01 00:00:00 +0000 and dhis-2/dhis-web/dhis-web-visualizer/src/main/webapp/dhis-web-visualizer/app/images/favorite.png	2011-12-16 15:12:55 +0000 differ
=== modified file 'dhis-2/dhis-web/dhis-web-visualizer/src/main/webapp/dhis-web-visualizer/app/images/pdf.png'
Binary files dhis-2/dhis-web/dhis-web-visualizer/src/main/webapp/dhis-web-visualizer/app/images/pdf.png	2011-11-17 14:53:18 +0000 and dhis-2/dhis-web/dhis-web-visualizer/src/main/webapp/dhis-web-visualizer/app/images/pdf.png	2011-12-16 15:12:55 +0000 differ
=== added file 'dhis-2/dhis-web/dhis-web-visualizer/src/main/webapp/dhis-web-visualizer/app/images/pdf2.png'
Binary files dhis-2/dhis-web/dhis-web-visualizer/src/main/webapp/dhis-web-visualizer/app/images/pdf2.png	1970-01-01 00:00:00 +0000 and dhis-2/dhis-web/dhis-web-visualizer/src/main/webapp/dhis-web-visualizer/app/images/pdf2.png	2011-12-16 15:12:55 +0000 differ
=== modified file 'dhis-2/dhis-web/dhis-web-visualizer/src/main/webapp/dhis-web-visualizer/app/images/png.png'
Binary files dhis-2/dhis-web/dhis-web-visualizer/src/main/webapp/dhis-web-visualizer/app/images/png.png	2011-11-22 14:04:40 +0000 and dhis-2/dhis-web/dhis-web-visualizer/src/main/webapp/dhis-web-visualizer/app/images/png.png	2011-12-16 15:12:55 +0000 differ
=== added file 'dhis-2/dhis-web/dhis-web-visualizer/src/main/webapp/dhis-web-visualizer/app/images/png2.png'
Binary files dhis-2/dhis-web/dhis-web-visualizer/src/main/webapp/dhis-web-visualizer/app/images/png2.png	1970-01-01 00:00:00 +0000 and dhis-2/dhis-web/dhis-web-visualizer/src/main/webapp/dhis-web-visualizer/app/images/png2.png	2011-12-16 15:12:55 +0000 differ
=== modified file 'dhis-2/dhis-web/dhis-web-visualizer/src/main/webapp/dhis-web-visualizer/app/lib/ext/resources/themes/images/gray/form/text-bg.gif'
Binary files dhis-2/dhis-web/dhis-web-visualizer/src/main/webapp/dhis-web-visualizer/app/lib/ext/resources/themes/images/gray/form/text-bg.gif	2011-09-30 15:07:44 +0000 and dhis-2/dhis-web/dhis-web-visualizer/src/main/webapp/dhis-web-visualizer/app/lib/ext/resources/themes/images/gray/form/text-bg.gif	2011-12-13 09:35:03 +0000 differ
=== modified file 'dhis-2/dhis-web/dhis-web-visualizer/src/main/webapp/dhis-web-visualizer/jsonInitialize.vm'
--- dhis-2/dhis-web/dhis-web-visualizer/src/main/webapp/dhis-web-visualizer/jsonInitialize.vm	2011-12-06 12:06:06 +0000
+++ dhis-2/dhis-web/dhis-web-visualizer/src/main/webapp/dhis-web-visualizer/jsonInitialize.vm	2011-12-19 20:20:31 +0000
@@ -1,1 +1,1 @@
-{"rn":["$!{rootNode.id}","$!encoder.jsonEncode(${rootNode.name})"],"p":{"lm":[#foreach($p in $lastMonth)["$!{p.id}","$!encoder.jsonEncode(${p.name})"]#if($velocityCount<$lastMonth.size()),#end#end],"mty":[#foreach($p in $monthsThisYear)["$!{p.id}","$!encoder.jsonEncode(${p.name})"]#if($velocityCount<$monthsThisYear.size()),#end#end],"mly":[#foreach($p in $monthsLastYear)["$!{p.id}","$!encoder.jsonEncode(${p.name})"]#if($velocityCount<$monthsLastYear.size()),#end#end],"lq":[#foreach($p in $lastQuarter)["$!{p.id}","$!encoder.jsonEncode(${p.name})"]#if($velocityCount<$lastQuarter.size()),#end#end],"qty":[#foreach($p in $quartersThisYear)["$!{p.id}","$!encoder.jsonEncode(${p.name})"]#if($velocityCount<$quartersThisYear.size()),#end#end],"qly":[#foreach($p in $quartersLastYear)["$!{p.id}","$!encoder.jsonEncode(${p.name})"]#if($velocityCount<$quartersLastYear.size()),#end#end],"ty":[#foreach($p in $thisYear)["$!{p.id}","$!encoder.jsonEncode(${p.name})"]#if($velocityCount<$thisYear.size()),#end#end],"ly":[#foreach($p in $lastYear)["$!{p.id}","$!encoder.jsonEncode(${p.name})"]#if($velocityCount<$lastYear.size()),#end#end],"lfy":[#foreach($p in $lastFiveYears)["$!{p.id}","$!encoder.jsonEncode(${p.name})"]#if($velocityCount<$lastFiveYears.size()),#end#end]}}
\ No newline at end of file
+{"rn":["$!{rootNode.id}","$!encoder.jsonEncode(${rootNode.name})"],"p":{"lastMonth":[#foreach($p in $lastMonth)["$!{p.id}","$!encoder.jsonEncode(${p.name})"]#if($velocityCount<$lastMonth.size()),#end#end],"last12Months":[#foreach($p in $last12Months)["$!{p.id}","$!encoder.jsonEncode(${p.name})"]#if($velocityCount<$last12Months.size()),#end#end],"lastQuarter":[#foreach($p in $lastQuarter)["$!{p.id}","$!encoder.jsonEncode(${p.name})"]#if($velocityCount<$lastQuarter.size()),#end#end],"last4Quarters":[#foreach($p in $last4Quarters)["$!{p.id}","$!encoder.jsonEncode(${p.name})"]#if($velocityCount<$last4Quarters.size()),#end#end],"lastSixMonth":[#foreach($p in $lastSixMonth)["$!{p.id}","$!encoder.jsonEncode(${p.name})"]#if($velocityCount<$lastSixMonth.size()),#end#end],"last2SixMonths":[#foreach($p in $last2SixMonths)["$!{p.id}","$!encoder.jsonEncode(${p.name})"]#if($velocityCount<$last2SixMonths.size()),#end#end],"thisYear":[#foreach($p in $thisYear)["$!{p.id}","$!encoder.jsonEncode(${p.name})"]#if($velocityCount<$thisYear.size()),#end#end],"last5Years":[#foreach($p in $last5Years)["$!{p.id}","$!encoder.jsonEncode(${p.name})"]#if($velocityCount<$last5Years.size()),#end#end]}}
\ No newline at end of file

=== removed file 'dhis-2/dhis-web/dhis-web-visualizer/src/main/webapp/dhis-web-visualizer/jsonminAggregatedDataValues.vm'
--- dhis-2/dhis-web/dhis-web-visualizer/src/main/webapp/dhis-web-visualizer/jsonminAggregatedDataValues.vm	2011-11-08 15:53:59 +0000
+++ dhis-2/dhis-web/dhis-web-visualizer/src/main/webapp/dhis-web-visualizer/jsonminAggregatedDataValues.vm	1970-01-01 00:00:00 +0000
@@ -1,1 +0,0 @@
-#set( $size = $object.size() ){"values":[#foreach( $value in $object ){"v":"$!{value.value}","i":"$!{value.dataElementId}","in":"$!{value.dataElementName}","p":"$!{value.periodId}","pn":"$!{value.periodName}","o":"$!{value.organisationUnitId}","on":"$!{value.organisationUnitName}"}#if( $velocityCount < $size ),#end#end]}
\ No newline at end of file

=== removed file 'dhis-2/dhis-web/dhis-web-visualizer/src/main/webapp/dhis-web-visualizer/jsonminAggregatedDataValuesPlugin.vm'
--- dhis-2/dhis-web/dhis-web-visualizer/src/main/webapp/dhis-web-visualizer/jsonminAggregatedDataValuesPlugin.vm	2011-11-08 12:44:02 +0000
+++ dhis-2/dhis-web/dhis-web-visualizer/src/main/webapp/dhis-web-visualizer/jsonminAggregatedDataValuesPlugin.vm	1970-01-01 00:00:00 +0000
@@ -1,1 +0,0 @@
-#set( $size = $object.size() ){"values":[#foreach( $value in $object ){"v":"$!{value.value}","i":"$!{value.dataElementId}","p":"$!{value.periodId}","o":"$!{value.organisationUnitId}"}#if( $velocityCount < $size ),#end#end]}
\ No newline at end of file

=== removed file 'dhis-2/dhis-web/dhis-web-visualizer/src/main/webapp/dhis-web-visualizer/jsonminAggregatedIndicatorValues.vm'
--- dhis-2/dhis-web/dhis-web-visualizer/src/main/webapp/dhis-web-visualizer/jsonminAggregatedIndicatorValues.vm	2011-09-29 09:10:42 +0000
+++ dhis-2/dhis-web/dhis-web-visualizer/src/main/webapp/dhis-web-visualizer/jsonminAggregatedIndicatorValues.vm	1970-01-01 00:00:00 +0000
@@ -1,1 +0,0 @@
-#set( $size = $object.size() ){"values":[#foreach( $value in $object ){"v":"$!{value.value}","i":"$!{value.indicatorId}","p":"$!{value.periodId}","o":"$!{value.organisationUnitId}"}#if( $velocityCount < $size ),#end#end]}
\ No newline at end of file

=== removed file 'dhis-2/dhis-web/dhis-web-visualizer/src/main/webapp/dhis-web-visualizer/jsonminAggregatedIndicatorValuesPlugin.vm'
--- dhis-2/dhis-web/dhis-web-visualizer/src/main/webapp/dhis-web-visualizer/jsonminAggregatedIndicatorValuesPlugin.vm	2011-11-08 12:44:02 +0000
+++ dhis-2/dhis-web/dhis-web-visualizer/src/main/webapp/dhis-web-visualizer/jsonminAggregatedIndicatorValuesPlugin.vm	1970-01-01 00:00:00 +0000
@@ -1,1 +0,0 @@
-#set( $size = $object.size() ){"values":[#foreach( $value in $object ){"v":"$!{value.value}","i":"$!{value.indicatorId}","in":"$!{value.indicatorName}","p":"$!{value.periodId}","pn":"$!{value.periodName}","o":"$!{value.organisationUnitId}","on":"$!{value.organisationUnitName}"}#if( $velocityCount < $size ),#end#end]}
\ No newline at end of file