← Back to team overview

dhis2-devs team mailing list archive

[Branch ~dhis2-devs-core/dhis2/trunk] Rev 14264: new app tracker-capture, WIP

 

------------------------------------------------------------
revno: 14264
committer: Abyot Asalefew Gizaw abyota@xxxxxxxxx
branch nick: dhis2
timestamp: Mon 2014-03-17 16:59:31 +0100
message:
  new app tracker-capture, WIP
added:
  dhis-2/dhis-web/dhis-web-tracker-capture/
  dhis-2/dhis-web/dhis-web-tracker-capture/pom.xml
  dhis-2/dhis-web/dhis-web-tracker-capture/src/
  dhis-2/dhis-web/dhis-web-tracker-capture/src/main/
  dhis-2/dhis-web/dhis-web-tracker-capture/src/main/resources/
  dhis-2/dhis-web/dhis-web-tracker-capture/src/main/resources/struts.xml
  dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/
  dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/WEB-INF/
  dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/WEB-INF/classes/
  dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/WEB-INF/classes/velocity.properties
  dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/WEB-INF/web.xml
  dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/
  dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/i18n/
  dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/i18n/en.json
  dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/img/
  dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/img/icons/
  dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/index.html
  dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/manifest.webapp
  dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/scripts/
  dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/scripts/angular-translate-loader-static-files.min.js
  dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/scripts/angular-translate-loader-url.min.js
  dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/scripts/angular-translate.min.js
  dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/scripts/angularLocalStorage.js
  dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/scripts/app.js
  dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/scripts/controllers.js
  dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/scripts/directives.js
  dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/scripts/filters.js
  dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/scripts/services.js
  dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/scripts/tracker-capture.js
  dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/styles/
  dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/styles/style.css
  dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/tracker-capture-appcache
  dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/views/
  dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/views/dashboard.html
  dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/views/dialog.html
  dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/views/modal.html
  dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/views/pagination.html
  dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/views/search.html
  dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/views/selection.html
modified:
  dhis-2/dhis-web/pom.xml


--
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
=== added directory 'dhis-2/dhis-web/dhis-web-tracker-capture'
=== added file 'dhis-2/dhis-web/dhis-web-tracker-capture/pom.xml'
--- dhis-2/dhis-web/dhis-web-tracker-capture/pom.xml	1970-01-01 00:00:00 +0000
+++ dhis-2/dhis-web/dhis-web-tracker-capture/pom.xml	2014-03-17 15:59:31 +0000
@@ -0,0 +1,66 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0";
+  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
+  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd";>
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.hisp.dhis</groupId>
+    <artifactId>dhis-web</artifactId>
+    <version>2.15-SNAPSHOT</version>
+  </parent>
+
+  <artifactId>dhis-web-tracker-capture</artifactId>
+  <packaging>war</packaging>
+  <name>DHIS Web Tracker Capture</name>
+
+  <build>
+    <finalName>dhis-web-tracker-capture</finalName>
+  </build>
+
+  <dependencies>
+
+    <dependency>
+      <groupId>javax.servlet</groupId>
+      <artifactId>servlet-api</artifactId>
+	</dependency>
+
+    <!-- DHIS -->
+
+    <dependency>
+      <groupId>org.hisp.dhis</groupId>
+      <artifactId>dhis-api</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.hisp.dhis</groupId>
+      <artifactId>dhis-web-commons</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.hisp.dhis</groupId>
+      <artifactId>dhis-web-commons-resources</artifactId>
+      <type>war</type>
+      <optional>true</optional>
+    </dependency>
+    <dependency>
+      <groupId>org.hisp.dhis</groupId>
+      <artifactId>dhis-web-api</artifactId>
+      <optional>true</optional>
+    </dependency>
+    <dependency>
+      <groupId>org.hisp.dhis</groupId>
+      <artifactId>dhis-service-core</artifactId>
+    </dependency>    
+    <dependency>
+      <groupId>org.hisp.dhis</groupId>
+      <artifactId>dhis-service-tracker</artifactId>
+    </dependency> 
+    <dependency>
+      <groupId>org.hisp.dhis</groupId>
+      <artifactId>dhis-service-eventreporting</artifactId>
+    </dependency> 
+
+  </dependencies>
+
+  <properties>
+    <rootDir>../../</rootDir>
+  </properties>
+</project>

=== added directory 'dhis-2/dhis-web/dhis-web-tracker-capture/src'
=== added directory 'dhis-2/dhis-web/dhis-web-tracker-capture/src/main'
=== added directory 'dhis-2/dhis-web/dhis-web-tracker-capture/src/main/resources'
=== added file 'dhis-2/dhis-web/dhis-web-tracker-capture/src/main/resources/struts.xml'
--- dhis-2/dhis-web/dhis-web-tracker-capture/src/main/resources/struts.xml	1970-01-01 00:00:00 +0000
+++ dhis-2/dhis-web/dhis-web-tracker-capture/src/main/resources/struts.xml	2014-03-17 15:59:31 +0000
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE struts PUBLIC
+"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
+"http://struts.apache.org/dtds/struts-2.0.dtd";>
+<struts>
+
+    <include file="dhis-web-commons.xml" />
+
+    <package name="dhis-web-tracker-capture" extends="dhis-web-commons" namespace="/dhis-web-tracker-capture">
+        
+        <action name="index" class="org.hisp.dhis.commons.action.NoAction">
+            <result name="success" type="redirect">index.html</result>
+        </action>
+        
+    </package>
+</struts>

=== added directory 'dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp'
=== added directory 'dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/WEB-INF'
=== added directory 'dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/WEB-INF/classes'
=== added file 'dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/WEB-INF/classes/velocity.properties'
--- dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/WEB-INF/classes/velocity.properties	1970-01-01 00:00:00 +0000
+++ dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/WEB-INF/classes/velocity.properties	2014-03-17 15:59:31 +0000
@@ -0,0 +1,3 @@
+resource.loader = dev
+dev.resource.loader.class = org.apache.velocity.runtime.resource.loader.FileResourceLoader
+dev.resource.loader.path = src/main/webapp,../dhis-web-commons-resources/src/main/webapp
\ No newline at end of file

=== added file 'dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/WEB-INF/web.xml'
--- dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/WEB-INF/web.xml	1970-01-01 00:00:00 +0000
+++ dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/WEB-INF/web.xml	2014-03-17 15:59:31 +0000
@@ -0,0 +1,102 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
+        "http://java.sun.com/dtd/web-app_2_3.dtd";>
+<web-app>
+    <display-name>DHIS Web Tracker Capture</display-name>
+
+    <context-param>
+        <param-name>contextConfigLocation</param-name>
+        <param-value>classpath*:/META-INF/dhis/beans.xml</param-value>
+    </context-param>
+    <context-param>
+        <param-name>automaticAccessType</param-name>
+        <param-value>ghostAdmin</param-value>
+    </context-param>
+
+    <filter>
+        <filter-name>RedirectFilter</filter-name>
+        <filter-class>org.hisp.dhis.servlet.filter.HttpRedirectFilter</filter-class>
+        <init-param>
+            <param-name>redirectPath</param-name>
+            <param-value>dhis-web-tracker-capture/index.action</param-value>
+        </init-param>
+    </filter>
+    <filter>
+        <filter-name>OpenSessionInViewFilter</filter-name>
+        <filter-class>org.springframework.orm.hibernate4.support.OpenSessionInViewFilter</filter-class>
+    </filter>
+    <filter>
+        <filter-name>springSecurityFilterChain</filter-name>
+        <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
+    </filter>
+    <filter>
+        <filter-name>Struts</filter-name>
+        <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
+    </filter>
+    <filter>
+        <filter-name>encoding-filter</filter-name>
+        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
+        <init-param>
+            <param-name>encoding</param-name>
+            <param-value>UTF-8</param-value>
+        </init-param>
+        <init-param>
+            <param-name>forceEncoding</param-name>
+            <param-value>true</param-value>
+        </init-param>
+    </filter>
+
+    <filter-mapping>
+        <filter-name>encoding-filter</filter-name>
+        <url-pattern>/*</url-pattern>
+    </filter-mapping>
+    <filter-mapping>
+        <filter-name>RedirectFilter</filter-name>
+        <url-pattern>/</url-pattern>
+    </filter-mapping>
+    <filter-mapping>
+        <filter-name>OpenSessionInViewFilter</filter-name>
+        <url-pattern>*.action</url-pattern>
+    </filter-mapping>
+    <filter-mapping>
+        <filter-name>OpenSessionInViewFilter</filter-name>
+        <url-pattern>/api/*</url-pattern>
+    </filter-mapping>
+    <filter-mapping>
+        <filter-name>springSecurityFilterChain</filter-name>
+        <url-pattern>/*</url-pattern>
+    </filter-mapping>
+    <filter-mapping>
+        <filter-name>Struts</filter-name>
+        <url-pattern>*.action</url-pattern>
+    </filter-mapping>
+
+    <listener>
+        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
+    </listener>
+    <listener>
+        <listener-class>org.hisp.dhis.system.startup.StartupListener</listener-class>
+    </listener>
+
+    <!-- Web API -->
+
+    <servlet>
+        <servlet-name>webapiServlet</servlet-name>
+        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
+        <init-param>
+            <param-name>contextConfigLocation</param-name>
+            <param-value>classpath*:/META-INF/dhis/servlet.xml</param-value>
+        </init-param>
+        <load-on-startup>1</load-on-startup>
+    </servlet>
+
+    <servlet-mapping>
+        <servlet-name>webapiServlet</servlet-name>
+        <url-pattern>/api</url-pattern>
+    </servlet-mapping>
+    <servlet-mapping>
+        <servlet-name>webapiServlet</servlet-name>
+        <url-pattern>/api/*</url-pattern>
+    </servlet-mapping>
+
+</web-app>

=== added directory 'dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture'
=== added directory 'dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/i18n'
=== added file 'dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/i18n/en.json'
--- dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/i18n/en.json	1970-01-01 00:00:00 +0000
+++ dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/i18n/en.json	2014-03-17 15:59:31 +0000
@@ -0,0 +1,42 @@
+{
+    "tracked_entity_management": "Tracked Entity Management",
+    "registering_unit": "Registering unit",
+    "program": "Program",
+    "please_select": "[Please Select]",
+    "not_selected": "Not Selected",
+    "view_all": "[View All]",
+    "list_all_entities": "List All Entities",
+    "list": "List",
+    "search": "Search",
+    "search_for": "Search for",
+    "registered_entities": "Registered Entities",
+    "empty_entity_list": "There are no reigstered entities",
+    "empty": "Empty",
+    "total_number_of_pages": "No. of pages",
+    "rows_per_page": "No. of rows per page",
+    "jump_to_page": "Jump to page",
+    "page": "Page ",
+    "first": "First",
+    "previous": "Previous",
+    "next": "Next",
+    "last": "Last",
+    "dashboard": "Go to Dashboard",
+    "edit": "Edit Entity",
+    "association": "Manage Associations",
+    "change_location": "Manage Location",
+    "details_history": "Details/History",
+    "remove": "Remove",
+    "entity": "Entity",
+    "add_new": "Add new",
+    "close_search": "Close search",
+    "search_attributes": "Search attributes",
+    "search_for_dashboard": "Search for dashboard items",
+    "dashboard": "Dashboard",
+    "home": "Home",
+    "back": "Back",
+    "profile": "Profile",
+    "enrollment": "Enrollment",
+    "notes": "Notes",
+    "dataentry": "Data Entry",
+    "current_selections": "Current selections"
+}

=== added directory 'dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/img'
=== added directory 'dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/img/icons'
=== added file 'dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/index.html'
--- dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/index.html	1970-01-01 00:00:00 +0000
+++ dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/index.html	2014-03-17 15:59:31 +0000
@@ -0,0 +1,78 @@
+<!DOCTYPE html>
+<html ng-app='trackerCapture'>
+    <head>
+        <title>Tracker Capture</title>
+
+        <meta name="description" content="DHIS 2">
+        <meta name="keywords" content="DHIS 2">        
+        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">              
+
+        <script type="text/javascript" src="../dhis-web-commons/javascripts/jQuery/jquery.min.js"></script>
+        <script type="text/javascript" src="../dhis-web-commons/javascripts/jQuery/ui/jquery-ui-1.9.1.custom.min.js"></script>
+        <link rel="stylesheet" type="text/css" href="../dhis-web-commons/javascripts/jQuery/ui/css/redmond/jquery-ui-1.9.1.custom.css">       
+
+        <script type="text/javascript" src="../dhis-web-commons/bootstrap/js/bootstrap.min.js"></script>           
+
+        <script type="text/javascript" src="../dhis-web-commons/javascripts/angular/angular.js"></script>
+        <script type="text/javascript" src="../dhis-web-commons/javascripts/angular/angular-resource.js"></script>
+        <script type="text/javascript" src="../dhis-web-commons/javascripts/angular/angular-route.js"></script>
+        <script type="text/javascript" src="../dhis-web-commons/javascripts/angular/angular-cookies.js"></script>
+        <script type="text/javascript" src="../dhis-web-commons/javascripts/angular/angular-animate.js"></script>        
+        <script type="text/javascript" src="../dhis-web-commons/javascripts/angular/ui-bootstrap-tpls-0.10.0.js"></script>
+
+        <script type="text/javascript" src="../dhis-web-commons/javascripts/moment/moment-with-langs.min.js"></script>       
+
+        <script type="text/javascript" src="../dhis-web-commons/javascripts/underscore.min.js"></script>
+        <script type="text/javascript" src="../dhis-web-commons/javascripts/dhis2/dhis2.util.js"></script>
+        <script type="text/javascript" src="../dhis-web-commons/javascripts/commons.js"></script>
+        <script type="text/javascript" src="../dhis-web-commons/javascripts/commons.ajax.js"></script>
+        <script type="text/javascript" src="../dhis-web-commons/javascripts/lists.js"></script>
+        <script type="text/javascript" src="../dhis-web-commons/javascripts/periodType.js"></script>
+        <script type="text/javascript" src="../dhis-web-commons/javascripts/date.js"></script>
+        <script type="text/javascript" src="../dhis-web-commons/javascripts/json2.js"></script>
+        <script type="text/javascript" src="../dhis-web-commons/javascripts/validationRules.js"></script>
+        <script type="text/javascript" src="../dhis-web-commons/javascripts/dhis2/dhis2.array.js"></script>
+        <script type="text/javascript" src="../dhis-web-commons/javascripts/dhis2/dhis2.select.js"></script>
+        <script type="text/javascript" src="../dhis-web-commons/javascripts/dhis2/dhis2.comparator.js"></script>
+        <script type="text/javascript" src="../dhis-web-commons/javascripts/dhis2/dhis2.availability.js"></script>
+        <script type="text/javascript" src="../dhis-web-commons/javascripts/dhis2/dhis2.trigger.js"></script>
+        <script type="text/javascript" src="../dhis-web-commons/javascripts/dhis2/dhis2.sharing.js"></script>
+        <script type="text/javascript" src="../dhis-web-commons/javascripts/dhis2/dhis2.validation.js"></script>
+        <script type="text/javascript" src="../dhis-web-commons/javascripts/dhis2/dhis2.storage.ss.js"></script>
+        <script type="text/javascript" src="../dhis-web-commons/javascripts/dhis2/dhis2.storage.ls.js"></script>
+        <script type="text/javascript" src="../dhis-web-commons/javascripts/dhis2/dhis2.storage.idb.js"></script>
+        <script type="text/javascript" src="../dhis-web-commons/javascripts/dhis2/dhis2.storage.memory.js"></script>
+        <script type="text/javascript" src="../dhis-web-commons/javascripts/dhis2/dhis2.storage.js"></script>
+        <script type="text/javascript" src="../dhis-web-commons/javascripts/dhis2/dhis2.contextmenu.js"></script>
+        <!--<script type="text/javascript" src="../dhis-web-commons/javascripts/dhis2/dhis2.appcache.js"></script>-->      
+        
+        
+        <script type="text/javascript" src="../dhis-web-commons/javascripts/angular/plugins/angularLocalStorage.js"></script>
+        <script type="text/javascript" src="../dhis-web-commons/javascripts/angular/plugins/angular-translate.min.js"></script>
+        <script type="text/javascript" src="../dhis-web-commons/javascripts/angular/plugins/angular-translate-loader-static-files.min.js"></script>
+        <script type="text/javascript" src="../dhis-web-commons/javascripts/angular/plugins/angular-translate-loader-url.min.js"></script>
+
+        <script type="text/javascript" src="scripts/app.js"></script>
+        <script type="text/javascript" src="scripts/services.js"></script>
+        <script type="text/javascript" src="scripts/filters.js"></script>
+        <script type="text/javascript" src="scripts/directives.js"></script>
+        <script type="text/javascript" src="scripts/controllers.js"></script>        
+
+        <link type="text/css" rel="stylesheet" href="../dhis-web-commons/font-awesome/css/font-awesome.min.css"/>
+        <link type="text/css" rel="stylesheet" media="screen,print" href="../dhis-web-commons/css/light_blue/light_blue.css"/>
+        <link type="text/css" rel="stylesheet" media="screen,print" href="../dhis-web-commons/css/widgets.css"/>
+
+        <link type="text/css" rel="stylesheet" href="styles/style.css">
+        
+    </head>
+    <body>
+        <div id="header" ng-controller="HeaderController">
+            <div class="container-heading">
+                <img ng-click="home()" id="headerBanner" src="../dhis-web-commons/css/light_blue/logo_banner.png" style="cursor:pointer" title="{{'dhis2_home'| translate}}">                    
+            </div>
+            <div id="headerMessage" class="bold"></div>        
+        </div>
+        
+        <div data-ng-view=''></div>    
+    </body>
+</html>
\ No newline at end of file

=== added file 'dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/manifest.webapp'
--- dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/manifest.webapp	1970-01-01 00:00:00 +0000
+++ dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/manifest.webapp	2014-03-17 15:59:31 +0000
@@ -0,0 +1,21 @@
+{
+    "version": "0.1",
+    "name": "Tracker Capture",
+    "description": "Tracker Capture App",
+    "launch_path": "index.html",
+    "icons": {
+        "16": "/img/icons/mortar-16.png",
+        "48": "/img/icons/mortar-48.png",
+        "128": "/img/icons/mortar-128.png"
+    },
+    "developer": {
+        "name": "HISP",
+        "url": "http://dhis2.org";
+    },
+    "default_locale": "en",
+    "activities": {
+        "dhis": {
+            "href": "../.."
+        }
+    }
+}

=== added directory 'dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/scripts'
=== added file 'dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/scripts/angular-translate-loader-static-files.min.js'
--- dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/scripts/angular-translate-loader-static-files.min.js	1970-01-01 00:00:00 +0000
+++ dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/scripts/angular-translate-loader-static-files.min.js	2014-03-17 15:59:31 +0000
@@ -0,0 +1,20 @@
+angular.module("pascalprecht.translate")
+       .factory("$translateStaticFilesLoader", ["$q", "$http", function(a, b) {
+        return function(c) {
+                if (!c || !c.prefix || !c.suffix)
+                        throw new Error(
+                                        "Couldn't load static files, no prefix or suffix specified!");
+                var d = a.defer();
+                return b(
+                                {
+                                        url : [ c.prefix, c.key, c.suffix ]
+                                                        .join(""),
+                                        method : "GET",
+                                        params : ""
+                                }).success(function(a) {
+                        d.resolve(a)
+                }).error(function() {
+                        d.reject(c.key)
+                }), d.promise
+        }
+} ]);
\ No newline at end of file

=== added file 'dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/scripts/angular-translate-loader-url.min.js'
--- dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/scripts/angular-translate-loader-url.min.js	1970-01-01 00:00:00 +0000
+++ dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/scripts/angular-translate-loader-url.min.js	2014-03-17 15:59:31 +0000
@@ -0,0 +1,26 @@
+angular
+		.module("pascalprecht.translate")
+		.factory(
+				"$translateUrlLoader",
+				[
+						"$q",
+						"$http",
+						function(a, b) {
+							return function(c) {
+								if (!c || !c.url)
+									throw new Error(
+											"Couldn't use urlLoader since no url is given!");
+								var d = a.defer();
+								return b({
+									url : c.url,
+									params : {
+										lang : c.key
+									},
+									method : "GET"
+								}).success(function(a) {
+									d.resolve(a)
+								}).error(function() {
+									d.reject(c.key)
+								}), d.promise
+							}
+						} ]);
\ No newline at end of file

=== added file 'dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/scripts/angular-translate.min.js'
--- dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/scripts/angular-translate.min.js	1970-01-01 00:00:00 +0000
+++ dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/scripts/angular-translate.min.js	2014-03-17 15:59:31 +0000
@@ -0,0 +1,1 @@
+angular.module("pascalprecht.translate",["ng"]).run(["$translate",function(a){var b=a.storageKey(),c=a.storage();c?c.get(b)?a.uses(c.get(b)):angular.isString(a.preferredLanguage())?a.uses(a.preferredLanguage()):c.set(b,a.uses()):angular.isString(a.preferredLanguage())&&a.uses(a.preferredLanguage())}]),angular.module("pascalprecht.translate").provider("$translate",["$STORAGE_KEY",function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n={},o=a,p=[],q=".",r=function(a,b){if(!a&&!b)return n;if(a&&!b){if(angular.isString(a))return n[a];angular.extend(n,s(a))}else angular.isObject(n[a])||(n[a]={}),angular.extend(n[a],s(b));return this},s=function(a,b,c,d){var e,f,g;b||(b=[]),c||(c={});for(e in a)a.hasOwnProperty(e)&&(g=a[e],angular.isObject(g)?s(g,b.concat(e),c,e):(f=b.length?""+b.join(q)+q+e:e,b.length&&e===d&&(keyWithShortPath=""+b.join(q),c[keyWithShortPath]="@:"+f),c[f]=g));return c};this.translations=r,this.addInterpolation=function(a){return p.push(a),this},this.useMessageFormatInterpolation=function(){return this.useInterpolation("$translateMessageFormatInterpolation")},this.useInterpolation=function(a){return i=a,this},this.preferredLanguage=function(a){return a?(b=a,this):b},this.translationNotFoundIndicator=function(a){return this.translationNotFoundIndicatorLeft(a),this.translationNotFoundIndicatorRight(a),this},this.translationNotFoundIndicatorLeft=function(a){return a?(l=a,this):l},this.translationNotFoundIndicatorRight=function(a){return a?(m=a,this):m},this.fallbackLanguage=function(a){return a?(("string"==typeof a||angular.isArray(a))&&(c=a),this):c},this.uses=function(a){if(a){if(!n[a]&&!j)throw new Error("$translateProvider couldn't find translationTable for langKey: '"+a+"'");return d=a,this}return d};var t=function(a){return a?(o=a,void 0):g?g+o:o};this.storageKey=t,this.useUrlLoader=function(a){return this.useLoader("$translateUrlLoader",{url:a})},this.useStaticFilesLoader=function(a){return this.useLoader("$translateStaticFilesLoader",a)},this.useLoader=function(a,b){return j=a,k=b||{},this},this.useLocalStorage=function(){return this.useStorage("$translateLocalStorage")},this.useCookieStorage=function(){return this.useStorage("$translateCookieStorage")},this.useStorage=function(a){return f=a,this},this.storagePrefix=function(a){return a?(g=a,this):a},this.useMissingTranslationHandlerLog=function(){return this.useMissingTranslationHandler("$translateMissingTranslationHandlerLog")},this.useMissingTranslationHandler=function(a){return h=a,this},this.$get=["$log","$injector","$rootScope","$q",function(a,g,o,q){var s,u=g.get(i||"$translateDefaultInterpolation"),v=!1,w={},x=function(a){if(!a)throw"No language key specified for loading.";var b=q.defer();return o.$broadcast("$translateLoadingStart"),v=!0,g.get(j)(angular.extend(k,{key:a})).then(function(c){o.$broadcast("$translateLoadingSuccess");var d={};angular.isArray(c)?angular.forEach(c,function(a){angular.extend(d,a)}):angular.extend(d,c),v=!1,b.resolve({key:a,table:d}),o.$broadcast("$translateLoadingEnd")},function(a){o.$broadcast("$translateLoadingError"),b.reject(a),o.$broadcast("$translateLoadingEnd")}),b.promise};if(f&&(s=g.get(f),!s.get||!s.set))throw new Error("Couldn't use storage '"+f+"', missing get() or set() method!");p.length>0&&angular.forEach(p,function(a){var c=g.get(a);c.setLocale(b||d),w[c.getInterpolationIdentifier()]=c});var y=function(a){if(a&&c){if(angular.isArray(c)){for(var b=c.length,e=0;b>e;e++)if(d===n[c[e]])return!1;return!0}return a!==c}return!1},z=function(a,b,e){var f=d?n[d]:n,i=e?w[e]:u;if(f&&f.hasOwnProperty(a))return angular.isString(f[a])&&"@:"===f[a].substr(0,2)?z(f[a].substr(2),b,e):i.interpolate(f[a],b);h&&!v&&g.get(h)(a,d);var j;if(d&&c&&y(d)){"string"==typeof c?(j=[],j.push(c)):j=c;for(var k=j.length,o=0;k>o;o++)if(d!==n[j[o]]){var p=n[j[o]][a];if(p){var q;return i.setLocale(j[o]),q=i.interpolate(p,b),i.setLocale(d),q}}}return l&&(a=[l,a].join(" ")),m&&(a=[a,m].join(" ")),a};if(z.preferredLanguage=function(){return b},z.fallbackLanguage=function(){return c},z.proposedLanguage=function(){return e},z.storage=function(){return s},z.uses=function(a){function b(a){d=a,o.$broadcast("$translateChangeSuccess"),f&&s.set(z.storageKey(),d),u.setLocale(d),angular.forEach(w,function(a,b){w[b].setLocale(d)}),c.resolve(a),o.$broadcast("$translateChangeEnd")}if(!a)return d;var c=q.defer();return o.$broadcast("$translateChangeStart"),!n[a]&&j?(e=a,x(a).then(function(a){e=void 0,r(a.key,a.table),b(a.key)},function(a){e=void 0,o.$broadcast("$translateChangeError"),c.reject(a),o.$broadcast("$translateChangeEnd")})):b(a),c.promise},z.storageKey=function(){return t()},z.refresh=function(a){function b(){f.resolve(),o.$broadcast("$translateRefreshEnd")}function e(){f.reject(),o.$broadcast("$translateRefreshEnd")}if(!j)throw new Error("Couldn't refresh translation table, no loader registered!");var f=q.defer();if(a)if(n.hasOwnProperty(a)){o.$broadcast("$translateRefreshStart");var g=x(a);a===d?g.then(function(c){n[a]=c.table,z.uses(d),b()},function(){o.$broadcast("$translateChangeError"),e()}):g.then(function(c){n[a]=c.table,b()},e)}else f.reject();else{o.$broadcast("$translateRefreshStart");var h=[];if(c)if("string"==typeof c)h.push(x(c));else for(var i=c.length,k=0;i>k;k++)h.push(x(c[k]));d&&h.push(x(d)),h.length>0?q.all(h).then(function(a){for(var c in n)n.hasOwnProperty(c)&&delete n[c];for(var e=0,f=a.length;f>e;e++)r(a[e].key,a[e].table);d&&z.uses(d),b()},function(a){a===d&&o.$broadcast("$translateChangeError"),e()}):b()}return f.promise},j&&(angular.equals(n,{})&&z.uses(z.uses()),c))if("string"!=typeof c||n[c])for(var A=c.length,B=0;A>B;B++)n[c[B]]||x(c[B]);else x(c);return z}]}]),angular.module("pascalprecht.translate").factory("$translateDefaultInterpolation",["$interpolate",function(a){var b,c={},d="default";return c.setLocale=function(a){b=a},c.getInterpolationIdentifier=function(){return d},c.interpolate=function(b,c){return a(b)(c)},c}]),angular.module("pascalprecht.translate").constant("$STORAGE_KEY","NG_TRANSLATE_LANG_KEY"),angular.module("pascalprecht.translate").directive("translate",["$filter","$interpolate","$parse",function(a,b,c){var d=a("translate");return{restrict:"AE",scope:!0,link:function(a,e,f){f.translateInterpolation&&(a.interpolation=f.translateInterpolation),f.$observe("translate",function(c){a.translationId=angular.equals(c,"")||void 0===c?b(e.text().replace(/^\s+|\s+$/g,""))(a.$parent):c}),f.$observe("translateValues",function(b){b&&a.$parent.$watch(function(){a.interpolateParams=c(b)(a.$parent)})}),a.$on("$translateChangeSuccess",function(){e.html(d(a.translationId,a.interpolateParams,a.interpolation))}),a.$watch("[translationId, interpolateParams]",function(){a.translationId&&e.html(d(a.translationId,a.interpolateParams,a.interpolation))},!0)}}}]),angular.module("pascalprecht.translate").filter("translate",["$parse","$translate",function(a,b){return function(c,d,e){return angular.isObject(d)||(d=a(d)()),b(c,d,e)}}]);
\ No newline at end of file

=== added file 'dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/scripts/angularLocalStorage.js'
--- dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/scripts/angularLocalStorage.js	1970-01-01 00:00:00 +0000
+++ dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/scripts/angularLocalStorage.js	2014-03-17 15:59:31 +0000
@@ -0,0 +1,159 @@
+angular.module('angularLocalStorage', ['ngCookies']).factory('storage', ['$parse', '$cookieStore', '$window', '$log', function ($parse, $cookieStore, $window, $log) {
+	/**
+	 * Global Vars
+	 */
+	var storage = (typeof $window.localStorage === 'undefined') ? undefined : $window.localStorage;
+	var supported = !(typeof storage === 'undefined');
+
+	var privateMethods = {
+		/**
+		 * Pass any type of a string from the localStorage to be parsed so it returns a usable version (like an Object)
+		 * @param res - a string that will be parsed for type
+		 * @returns {*} - whatever the real type of stored value was
+		 */
+		parseValue: function (res) {
+			var val;
+			try {
+				val = angular.fromJson(res);
+				if (typeof val === 'undefined') {
+					val = res;
+				}
+				if (val === 'true') {
+					val = true;
+				}
+				if (val === 'false') {
+					val = false;
+				}
+				if ($window.parseFloat(val) === val && !angular.isObject(val)) {
+					val = $window.parseFloat(val);
+				}
+			} catch (e) {
+				val = res;
+			}
+			return val;
+		}
+	};
+
+	var publicMethods = {
+		/**
+		 * Set - let's you set a new localStorage key pair set
+		 * @param key - a string that will be used as the accessor for the pair
+		 * @param value - the value of the localStorage item
+		 * @returns {*} - will return whatever it is you've stored in the local storage
+		 */
+		set: function (key, value) {
+			if (!supported) {
+				try {
+					$cookieStore.put(key, value);
+					return value;
+				} catch(e) {
+					$log.log('Local Storage not supported, make sure you have angular-cookies enabled.');
+				}
+			}
+			var saver = angular.toJson(value);
+			storage.setItem(key, saver);
+			return privateMethods.parseValue(saver);
+		},
+
+		/**
+		 * Get - let's you get the value of any pair you've stored
+		 * @param key - the string that you set as accessor for the pair
+		 * @returns {*} - Object,String,Float,Boolean depending on what you stored
+		 */
+		get: function (key) {
+			if (!supported) {
+				try {
+					return privateMethods.parseValue($.cookie(key));
+				} catch (e) {
+					return null;
+				}
+			}
+			var item = storage.getItem(key);
+			return privateMethods.parseValue(item);
+		},
+
+		/**
+		 * Remove - let's you nuke a value from localStorage
+		 * @param key - the accessor value
+		 * @returns {boolean} - if everything went as planned
+		 */
+		remove: function (key) {
+			if (!supported) {
+				try {
+					$cookieStore.remove(key);
+					return true;
+				} catch (e) {
+					return false;
+				}
+			}
+			storage.removeItem(key);
+			return true;
+		},
+
+		/**
+		 * Bind - let's you directly bind a localStorage value to a $scope variable
+		 * @param {Angular $scope} $scope - the current scope you want the variable available in
+		 * @param {String} key - the name of the variable you are binding
+		 * @param {Object} opts - (optional) custom options like default value or unique store name
+         * Here are the available options you can set:
+         * * defaultValue: the default value
+         * * storeName: add a custom store key value instead of using the scope variable name
+		 * @returns {*} - returns whatever the stored value is
+		 */
+		bind: function ($scope, key, opts) {
+            var defaultOpts = {
+                defaultValue: '',
+                storeName: ''
+            };
+            // Backwards compatibility with old defaultValue string
+            if (angular.isString(opts)) {
+                opts = angular.extend({},defaultOpts,{defaultValue:opts});
+            } else {
+                // If no defined options we use defaults otherwise extend defaults
+                opts = (angular.isUndefined(opts)) ? defaultOpts : angular.extend(defaultOpts,opts);
+            }
+
+			// Set the storeName key for the localStorage entry
+			// use user defined in specified
+			var storeName = opts.storeName || key;
+
+			// If a value doesn't already exist store it as is
+			if (!publicMethods.get(storeName)) {
+				publicMethods.set(storeName, opts.defaultValue);
+			}
+
+			// If it does exist assign it to the $scope value
+			$parse(key).assign($scope, publicMethods.get(storeName));
+
+			// Register a listener for changes on the $scope value
+			// to update the localStorage value
+			$scope.$watch(key, function (val) {
+				if (angular.isDefined(val)) {
+					publicMethods.set(storeName, val);
+				}
+			}, true);
+
+			return publicMethods.get(storeName);
+		},
+		/**
+		 * Unbind - let's you unbind a variable from localStorage while removing the value from both
+		 * the localStorage and the local variable and sets it to null
+		 * @param $scope - the scope the variable was initially set in
+		 * @param key - the name of the variable you are unbinding
+		 * @param storeName - (optional) if you used a custom storeName you will have to specify it here as well
+		 */
+		unbind: function($scope,key,storeName) {
+			storeName = storeName || key;
+			$parse(key).assign($scope, null);
+			$scope.$watch(key, function () { });
+			publicMethods.remove(storeName);
+		},
+		/**
+		 * Clear All - let's you clear out ALL localStorage variables, use this carefully!
+		 */
+		clearAll: function() {
+			storage.clear();
+		}
+	};
+	return publicMethods;
+}]);

=== added file 'dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/scripts/app.js'
--- dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/scripts/app.js	1970-01-01 00:00:00 +0000
+++ dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/scripts/app.js	2014-03-17 15:59:31 +0000
@@ -0,0 +1,40 @@
+'use strict';
+
+/* App Module */
+
+var trackerCapture = angular.module('trackerCapture',
+		 ['ui.bootstrap', 
+		  'ngRoute', 
+		  'ngCookies',  
+		  'trackerCaptureServices',
+		  'trackerCaptureFilters',
+                  'trackerCaptureDirectives', 
+                  'trackerCaptureControllers',
+		  'angularLocalStorage', 
+		  'pascalprecht.translate'])
+              
+.value('DHIS2URL', '../..')
+
+.config(function($httpProvider, $routeProvider, $translateProvider) {    
+            
+    $httpProvider.defaults.useXDomain = true;
+    delete $httpProvider.defaults.headers.common['X-Requested-With'];
+    
+    $routeProvider.when('/', {
+        templateUrl:'views/selection.html',
+        controller: 'SelectionController'
+    }).when('/dashboard',{
+        templateUrl:'views/dashboard.html',
+        controller: 'DashboardController'
+    }).otherwise({
+        redirectTo : '/'
+    });  
+    
+    $translateProvider.useStaticFilesLoader({
+        prefix: 'i18n/',
+        suffix: '.json'
+    });
+    
+    $translateProvider.preferredLanguage('en');	
+    
+});

=== added file 'dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/scripts/controllers.js'
--- dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/scripts/controllers.js	1970-01-01 00:00:00 +0000
+++ dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/scripts/controllers.js	2014-03-17 15:59:31 +0000
@@ -0,0 +1,309 @@
+'use strict';
+
+/* Controllers */
+var trackerCaptureControllers = angular.module('trackerCaptureControllers', [])
+
+//Controller for settings page
+.controller('SelectionController',
+        function($scope,
+                $location,
+                Paginator,
+                TranslationService, 
+                SelectedEntity,
+                storage,
+                AttributesFactory,
+                TrackedEntityService) {   
+   
+    //Selection
+    $scope.selectedOrgUnit = '';
+    $scope.selectedProgram = '';
+    
+    //Filtering
+    $scope.reverse = false;
+    $scope.filterText = {}; 
+    $scope.currentFilter;
+    
+    //Paging
+    $scope.rowsPerPage = 50;
+    $scope.currentPage = Paginator.getPage() + 1;   
+    
+    //Searching
+    $scope.showSearchDiv = false;
+    $scope.searchField = {title: 'search', isOpen: false};     
+    
+    //watch for selection of org unit from tree
+    $scope.$watch('selectedOrgUnit', function() {
+        
+        if( angular.isObject($scope.selectedOrgUnit)){                  
+            
+            $scope.trackedEntityList = [];
+            
+            //apply translation - by now user's profile is fetched from server.
+            TranslationService.translate();
+            $scope.attributes = storage.get('ATTRIBUTES');
+            
+            var programs = storage.get('PROGRAMS');            
+            if( programs ){                
+                $scope.loadPrograms($scope.selectedOrgUnit);     
+            }
+        }
+    });
+    
+    //load programs associated with the selected org unit.
+    $scope.loadPrograms = function(orgUnit) {      
+                                
+        $scope.selectedOrgUnit = orgUnit;
+        $scope.selectedProgram = null;
+        $scope.trackedEntityList = [];
+        
+        if (angular.isObject($scope.selectedOrgUnit)) {   
+
+            $scope.programs = [];
+            
+            var programs = storage.get('PROGRAMS');
+            
+            if( programs ){
+                for(var i=0; i<programs.length; i++){
+                    var program = storage.get(programs[i].id);   
+                    if(program.organisationUnits.hasOwnProperty(orgUnit.id)){
+                        $scope.programs.push(program);
+                    }
+                }               
+            }
+        }        
+    };   
+    
+    //get events for the selected program (and org unit)
+    $scope.loadTrackedEntities = function(){
+        
+        $scope.searchField.isOpen = false;
+        
+        $scope.trackedEntityList = [];
+        
+        $scope.gridColumns = AttributesFactory.getForListing();
+
+        //generate grid column for the selected program
+        angular.forEach($scope.gridColumns, function(gridColumn){
+            gridColumn.showFilter =  false;
+            gridColumn.hide = false;                   
+            if(gridColumn.type === 'date'){
+                 $scope.filterText[gridColumn.id]= {start: '', end: ''};
+            }
+        });
+            
+        if( angular.isObject($scope.selectedProgram)){  
+            
+            //Load entities for the selected program and orgunit
+            TrackedEntityService.getByOrgUnitAndProgram($scope.selectedOrgUnit.id, $scope.selectedProgram.id).then(function(data){
+                $scope.trackedEntityList = data;      
+                console.log('the entities are:  ', $scope.trackedEntityList);
+            });            
+        }
+        else{
+            
+            //Load entities for the selected orgunit
+            TrackedEntityService.getByOrgUnit($scope.selectedOrgUnit.id).then(function(data){
+                $scope.trackedEntityList = data;  
+                console.log('the entities are:  ', $scope.trackedEntityList);
+            });
+        }
+    };
+    
+    $scope.clearEntities = function(){
+        $scope.trackedEntityList = [];
+    };
+    
+    $scope.showRegistration = function(){
+        
+    };  
+    
+    $scope.showSearch = function(){
+        $scope.showSearchDiv = !$scope.showSearchDiv;
+        $scope.searchField.isOpen = true;
+    };
+    
+    $scope.closeSearch = function(){
+        $scope.showSearchDiv = !$scope.showSearchDiv;
+    };   
+    
+    $scope.sortGrid = function(gridHeader){
+        
+        if ($scope.sortHeader === gridHeader.id){
+            $scope.reverse = !$scope.reverse;
+            return;
+        }
+        
+        $scope.sortHeader = gridHeader.id;
+        $scope.reverse = false;    
+    };    
+    
+    $scope.filterInGrid = function(gridColumn){
+        
+        $scope.currentFilter = gridColumn;
+        for(var i=0; i<$scope.gridColumns.length; i++){
+            
+            //toggle the selected grid column's filter
+            if($scope.gridColumns[i].id === gridColumn.id){
+                $scope.gridColumns[i].showFilter = !$scope.gridColumns[i].showFilter;
+            }            
+            else{
+                $scope.gridColumns[i].showFilter = false;
+            }
+        }
+    };    
+    
+    $scope.showDashboard = function(currentEntity){       
+        SelectedEntity.setSelectedEntity(currentEntity);
+        storage.set('SELECTED_OU', $scope.selectedOrgUnit);        
+        $location.path('/dashboard').search({selectedEntityId: currentEntity.person, selectedProgramId: $scope.selectedProgram ? $scope.selectedProgram.id : null});                                    
+    };   
+    
+    $scope.search = function(){       
+        console.log('the search is:  ', $scope.attributes);
+    };
+       
+    $scope.getHelpContent = function(){
+        console.log('I will get help content');
+    };    
+})
+
+//Controller for dashboard
+.controller('DashboardController',
+        function($scope,  
+                $location,
+                storage,
+                EnrollmentService,
+                TrackedEntityService,                
+                TranslationService) {
+
+    //do translation of the dashboard page
+    TranslationService.translate();    
+    
+    //dashboard contents
+    $scope.profile = {title: 'profile', isOpen: true};
+    $scope.enrollment = {title: 'enrollment', isOpen: true};
+    $scope.notes = {title: 'notes', isOpen: true};
+    $scope.dataEntry = {title: 'dataentry', isOpen: true};  
+    $scope.selected = {title: 'current_selections', isOpen: true, selections: []};        
+    
+    //attributes for profile    
+    $scope.attributes = {};    
+    angular.forEach(storage.get('ATTRIBUTES'), function(attribute){
+        $scope.attributes[attribute.id] = attribute;
+    });   
+    
+    //selections
+    $scope.selectedEntityId = ($location.search()).selectedEntityId;
+    $scope.selectedProgramId = ($location.search()).selectedProgramId;
+    
+    $scope.selectedOrgUnit = storage.get('SELECTED_OU');
+    
+    $scope.selectedProgram = null;
+    
+    if($scope.selectedProgramId){
+        $scope.selectedProgram = storage.get($scope.selectedProgramId);        
+    }
+    
+    //programs for enrollment
+    $scope.programs = [];
+    var programs = storage.get('PROGRAMS');            
+    if( programs ){
+        for(var i=0; i<programs.length; i++){
+            var program = storage.get(programs[i].id);   
+            if($scope.selectedProgramId == programs[i].id){
+                $scope.selectedProgram = program;
+            }
+            if(program.organisationUnits.hasOwnProperty($scope.selectedOrgUnit.id)){
+                $scope.programs.push(program);
+            }
+        }               
+    }   
+    
+    if( $scope.selectedEntityId ){
+        
+        //Fetch the selected entity
+        TrackedEntityService.get($scope.selectedEntityId).then(function(data){
+            $scope.selectedEntity = data;            
+            console.log('the entity is:  ', $scope.selectedEntity);
+        });
+        
+        EnrollmentService.get($scope.selectedEntityId).then(function(data){
+            console.log('enrollment:  ', data);
+        });
+    }
+    
+    $scope.selected.selections.push({title: 'registering_unit', value: $scope.selectedOrgUnit ? $scope.selectedOrgUnit.name : 'not_selected'});
+    $scope.selected.selections.push({title: 'program', value: $scope.selectedProgram ? $scope.selectedProgram.name : 'not_selected'});    
+    
+    $scope.back = function(){
+        $location.path('/');
+    };
+    
+    $scope.displayEnrollment = false;
+    $scope.showEnrollment = function(){
+        $scope.displayEnrollment = true;
+    };
+
+})
+
+//Controller for the enrollment section
+.controller('EnrollmentController',
+        function($scope,                
+                storage,
+                TranslationService) {
+
+    TranslationService.translate();
+    
+    $scope.attributes = storage.get('ATTRIBUTES');
+    
+})
+
+//Controller for the notes section
+.controller('NotesController',
+        function($scope,                
+                storage,
+                TranslationService) {
+
+    TranslationService.translate();
+    
+    $scope.attributes = storage.get('ATTRIBUTES');
+    
+})
+
+//Controller for the notes section
+.controller('NotesController',
+        function($scope,                
+                storage,
+                TranslationService) {
+
+    TranslationService.translate();
+    
+    $scope.attributes = storage.get('ATTRIBUTES');
+    
+})
+
+//Controller for the data entry section
+.controller('DataEntryController',
+        function($scope,                
+                storage,
+                TranslationService) {
+
+    TranslationService.translate();
+    
+    $scope.attributes = storage.get('ATTRIBUTES');
+    
+})
+
+//Controller for the header section
+.controller('HeaderController',
+        function($scope,                
+                DHIS2URL,
+                TranslationService) {
+
+    TranslationService.translate();
+    
+    $scope.home = function(){        
+        window.location = DHIS2URL;
+    };
+    
+});
\ No newline at end of file

=== added file 'dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/scripts/directives.js'
--- dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/scripts/directives.js	1970-01-01 00:00:00 +0000
+++ dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/scripts/directives.js	2014-03-17 15:59:31 +0000
@@ -0,0 +1,207 @@
+'use strict';
+
+/* Directives */
+
+var trackerCaptureDirectives = angular.module('trackerCaptureDirectives', [])
+
+.directive('inputValidator', function() {
+    
+    return {
+        require: 'ngModel',
+        link: function (scope, element, attrs, ctrl) {  
+
+            ctrl.$parsers.push(function (value) {
+                return parseFloat(value || '');
+            });
+        }
+    };   
+})
+
+.directive('selectedOrgUnit', function($timeout) {        
+
+    return {        
+        restrict: 'A',        
+        link: function(scope, element, attrs){  
+          
+            //when tree has loaded, get selected orgunit - if there is any - and inform angular           
+            $(function() {                 
+                
+                var adapters = [];
+                var partial_adapters = [];
+
+                if( dhis2.ou.memoryOnly ) {
+                    adapters = [ dhis2.storage.InMemoryAdapter ];
+                    partial_adapters = [ dhis2.storage.InMemoryAdapter ];
+                } else {
+                    adapters = [ dhis2.storage.IndexedDBAdapter, dhis2.storage.DomLocalStorageAdapter, dhis2.storage.InMemoryAdapter ];
+                    partial_adapters = [ dhis2.storage.IndexedDBAdapter, dhis2.storage.DomSessionStorageAdapter, dhis2.storage.InMemoryAdapter ];
+                }
+
+                dhis2.ou.store = new dhis2.storage.Store({
+                    name: OU_STORE_NAME,
+                    objectStores: [
+                        {
+                            name: OU_KEY,
+                            adapters: adapters
+                        },
+                        {
+                            name: OU_PARTIAL_KEY,
+                            adapters: partial_adapters
+                        }
+                    ]
+                });
+
+                dhis2.ou.store.open().done( function() {
+                    selection.load();
+                    $( "#orgUnitTree" ).one( "ouwtLoaded", function() {
+                        var selected = selection.getSelected()[0];
+                        selection.getOrganisationUnit(selected).done(function(data){                            
+                            if( data ){
+                                scope.selectedOrgUnit = {id: selected, name: data[selected].n};                                  
+                                scope.$apply();
+                            }                        
+                        });
+                    } );
+                    
+                });
+            });
+            
+            //listen to user selection, and inform angular         
+            selection.setListenerFunction( organisationUnitSelected );
+            selection.responseReceived();
+            
+            function organisationUnitSelected( orgUnits, orgUnitNames ) {
+                scope.selectedOrgUnit = {id: orgUnits[0], name: orgUnitNames[0]};                    
+                scope.$apply();
+            }            
+        }  
+    };
+})
+
+.directive('dhisContextMenu', function(ContextMenuSelectedItem) {
+        
+    return {        
+        restrict: 'A',
+        link: function(scope, element, attrs){
+            var contextMenu = $("#contextMenu");                   
+            
+            element.click(function (e) {
+                var selectedItem = $.parseJSON(attrs.selectedItem);
+                ContextMenuSelectedItem.setSelectedItem(selectedItem);
+                
+                var menuHeight = contextMenu.height();
+                var menuWidth = contextMenu.width();
+                var winHeight = $(window).height();
+                var winWidth = $(window).width();
+
+                var pageX = e.pageX;
+                var pageY = e.pageY;
+
+                contextMenu.show();
+
+                if( (menuWidth + pageX) > winWidth ) {
+                  pageX -= menuWidth;
+                }
+
+                if( (menuHeight + pageY) > winHeight ) {
+                  pageY -= menuHeight;
+
+                  if( pageY < 0 ) {
+                      pageY = e.pageY;
+                  }
+                }
+                
+                contextMenu.css({
+                    left: pageX,
+                    top: pageY
+                });
+
+                return false;
+            });
+            
+            contextMenu.on("click", "a", function () {                    
+                contextMenu.hide();
+            });
+
+            $(document).click(function () {                                        
+                contextMenu.hide();
+            });
+        }     
+    };
+})
+
+.directive('ngDate', function($filter) {
+    return {
+        restrict: 'A',
+        require: 'ngModel',        
+        link: function(scope, element, attrs, ctrl) {
+            element.datepicker({
+                changeYear: true,
+                changeMonth: true,
+                dateFormat: 'yy-mm-dd',
+                onSelect: function(date) {
+                    //scope.date = date;
+                    ctrl.$setViewValue(date);
+                    $(this).change();                    
+                    scope.$apply();
+                }                
+            })
+            .change(function() {
+                //var rawDate = $filter('date')(this.value, 'yyyy-MM-dd'); 
+                var rawDate = this.value;
+                var convertedDate = moment(this.value, 'YYYY-MM-DD')._d;
+                convertedDate = $filter('date')(convertedDate, 'yyyy-MM-dd');       
+
+                if(rawDate != convertedDate){
+                    scope.invalidDate = true;
+                    ctrl.$setViewValue(this.value);                                   
+                    ctrl.$setValidity('foo', false);                    
+                    scope.$apply();     
+                }
+                else{
+                    scope.invalidDate = false;
+                    ctrl.$setViewValue(this.value);                                   
+                    ctrl.$setValidity('foo', true);                    
+                    scope.$apply();     
+                }
+            });    
+        }      
+    };   
+})
+
+.directive('blurOrChange', function() {
+    
+    return function( scope, elem, attrs) {
+        elem.datepicker({
+            onSelect: function() {
+                scope.$apply(attrs.blurOrChange);
+                $(this).change();                                        
+            }
+        }).change(function() {
+            scope.$apply(attrs.blurOrChange);
+        });
+    };
+})
+
+.directive('typeaheadOpenOnFocus', function () {
+  return {
+    require: ['typeahead', 'ngModel'],
+    link: function (scope, element, attr, ctrls) {        
+      element.bind('focus', function () {
+        ctrls[0].getMatchesAsync(ctrls[1].$viewValue);
+        //scope.$apply();
+      });
+    }
+  };
+})
+
+.directive('paginator', function factory() {
+    return {
+        restrict: 'E',
+        controller: function ($scope, Paginator) {
+            $scope.paginator = Paginator;
+        },
+        templateUrl: 'views/pagination.html'
+    };
+});
+

=== added file 'dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/scripts/filters.js'
--- dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/scripts/filters.js	1970-01-01 00:00:00 +0000
+++ dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/scripts/filters.js	2014-03-17 15:59:31 +0000
@@ -0,0 +1,87 @@
+'use strict';
+
+/* Filters */
+
+var trackerCaptureFilters = angular.module('trackerCaptureFilters', [])
+
+.filter('gridFilter', function(){    
+    
+    return function(data, filterText, currentFilter){
+        
+        if(!data ){
+            return;
+        }
+        
+        if(!filterText){
+            return data;
+        }        
+        else{            
+            
+            var keys = [];
+            var filteredData = data;
+            
+            for(var key in filterText){
+                keys.push(key);
+                
+                for(var i=0; i<filteredData.length; i++){
+                    
+                    var val = filteredData[i][key];
+                    
+                    if( currentFilter.type === 'date'){
+                        
+                        if( filterText[key].start || filterText[key].end){
+                            var start = moment(filterText[key].start, 'YYYY-MM-DD');
+                            var end = moment(filterText[key].end, 'YYYY-MM-DD');  
+                            var date = moment(val, 'YYYY-MM-DD');                              
+                            
+                            if( ( Date.parse(date) > Date.parse(end) ) || (Date.parse(date) < Date.parse(start)) ){  
+                                filteredData.splice(i,1);
+                                i--;
+                            }                                                        
+                        }
+                        
+                    }
+                    else{
+                        if( currentFilter.type === 'int'){
+                            val = val.toString();
+                        }
+
+                        val = val.toLowerCase();
+                        if( val.indexOf(filterText[key].toLowerCase()) === -1 ){
+                            filteredData.splice(i,1);
+                            i--;
+                        }                        
+                    }
+                                        
+                }
+            }            
+            return filteredData;
+        } 
+    };    
+})
+
+.filter('paginate', function(Paginator) {
+    return function(input, rowsPerPage) {
+        if (!input) {
+            return input;
+        }
+
+        if (rowsPerPage) {
+            Paginator.rowsPerPage = rowsPerPage;
+        }
+        
+        Paginator.itemCount = input.length;
+
+        return input.slice(parseInt(Paginator.page * Paginator.rowsPerPage), parseInt((Paginator.page + 1) * Paginator.rowsPerPage + 1) - 1);
+    };
+})
+
+.filter('forLoop', function() {
+    return function(input, start, end) {
+        input = new Array(end - start);
+        for (var i = 0; start < end; start++, i++) {
+            input[i] = start;
+        }
+        return input;
+    };
+});
\ No newline at end of file

=== added file 'dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/scripts/services.js'
--- dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/scripts/services.js	1970-01-01 00:00:00 +0000
+++ dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/scripts/services.js	2014-03-17 15:59:31 +0000
@@ -0,0 +1,506 @@
+'use strict';
+
+/* Services */
+
+var trackerCaptureServices = angular.module('trackerCaptureServices', ['ngResource'])
+
+/* factory for loading logged in user profiles from DHIS2 */
+.factory('CurrentUserProfile', function($http) { 
+           
+    var profile, promise;
+    return {
+        get: function() {
+            if( !promise ){
+                promise = $http.get( '../api/me/profile').then(function(response){
+                   profile = response.data;
+                   return profile;
+                });
+            }
+            return promise;         
+        }
+    };  
+})
+
+/* Factory to fetch programs */
+.factory('ProgramFactory', function($http) {
+    
+    var programUid, programPromise;
+    var programs, programsPromise;
+    var program;
+    return {
+        
+        get: function(uid){
+            if( programUid !== uid ){
+                programPromise = $http.get( '../api/programs/' + uid + '.json?viewClass=detailed&paging=false').then(function(response){
+                    programUid = response.data.id; 
+                    program = response.data;                     
+                    return program;
+                });
+            }
+            return programPromise;
+        },       
+        
+        getMine: function(type){ 
+            if( !programsPromise ){
+                programsPromise = $http.get( '../api/me/programs?includeDescendants=true&type='+type).then(function(response){
+                   programs = response.data;
+                   return programs;
+                });
+            }
+            return programsPromise;    
+        },
+        
+        getEventProgramsByOrgUnit: function(orgUnit, type){
+                       
+            var promise = $http.get(  '../api/programs.json?orgUnit=' + orgUnit + '&type=' + type ).then(function(response){
+                programs = response.data;
+                return programs;
+            });            
+            return promise;
+        }
+    };
+})
+
+/* Factory to fetch programStages */
+.factory('ProgramStageFactory', function($http, storage) {  
+    
+    var programStage, promise;   
+    return {        
+        get: function(uid){
+            if( programStage !== uid ){
+                promise = $http.get(  '../api/programStages/' + uid + '.json?viewClass=detailed&paging=false').then(function(response){
+                   programStage = response.data.id;
+
+                   //store locally - might need them for event data values
+                   angular.forEach(response.data.programStageDataElements, function(prStDe){      
+                       storage.set(prStDe.dataElement.id, prStDe);                       
+                   });
+                   
+                   return response.data;
+                });
+            }
+            return promise;
+        }
+    };    
+})
+
+/* Service to deal with enrollment */
+.service('EnrollmentService', function($http) {
+    
+    return {        
+        get: function( entity ){
+            var promise = $http.get(  '../api/enrollments?person=' + entity ).then(function(response){
+                return response.data;
+            });
+            return promise;
+        },
+        enroll: function( enrollment ){
+            var promise = $http.post(  '../api/enrollments', enrollment ).then(function(response){
+                return response.data;
+            });
+            return promise;
+        }        
+    };   
+})
+
+/* Service for getting tracked entity instances */
+.factory('TrackedEntityService', function($http, AttributesFactory) {
+    
+    var promise;
+    return {
+        
+        get: function(entityUid) {
+            promise = $http.get(  '../api/trackedEntityInstances/' +  entityUid ).then(function(response){                                
+                return response.data;
+            });            
+            return promise;
+        },
+        getByOrgUnitAndProgram: function(orgUnitUid, programUid) {
+            promise = $http.get(  '../api/trackedEntityInstances.json?orgUnit=' + orgUnitUid + '&program=' + programUid ).then(function(response){
+                
+                var trackedEntityList = response.data.personList;
+                
+                trackedEntityList = entityFormatter(trackedEntityList, AttributesFactory.getForListing());                 
+                                
+                return trackedEntityList;
+            });            
+            return promise;
+        },
+        getByOrgUnit: function(orgUnitUid) {
+            promise = $http.get(  '../api/trackedEntityInstances.json?orgUnit=' + orgUnitUid ).then(function(response){
+                
+                var trackedEntityList = response.data.personList;                
+                
+                trackedEntityList = entityFormatter(trackedEntityList, AttributesFactory.getForListing());
+                                
+                return trackedEntityList;
+            });            
+            return promise;
+        }
+    };    
+    
+})
+
+/* Factory for getting tracked entity attributes */
+.factory('AttributesFactory', function(storage) { 
+    
+    return {
+        getAll: function(){  
+
+            var attributes = storage.get('ATTRIBUTES');
+            
+            if(attributes){
+                return attributes;
+            }                
+            return; 
+        },        
+        getForListing: function(){
+            
+            var attributes = [];
+            
+            angular.forEach(this.getAll(), function(attribute) {
+                if (attribute.displayInListNoProgram) {
+                    attributes.push(attribute);
+                }
+            });           
+
+            return attributes;
+        }
+    };
+})
+
+
+/* factory for handling events */
+.factory('DHIS2EventFactory', function($http) {   
+    
+    return {
+        
+        getByPerson: function(person, orgUnit, program){   
+            var promise = $http.get( '../api/events.json?' + 'person=' + person + '&orgUnit=' + orgUnit + '&program=' + program + '&paging=false').then(function(response){
+                return response.data.eventList;
+            });            
+            return promise;
+        },
+        
+        getByStage: function(orgUnit, programStage){
+            var promise = $http.get( '../api/events.json?' + 'orgUnit=' + orgUnit + '&programStage=' + programStage + '&paging=false')
+                    .then(function(response){
+                        
+                return response.data.eventList;             
+        
+            }, function(){
+                
+                return dhis2.ec.storageManager.getEvents(orgUnit, programStage);
+                
+            });            
+            
+            return promise;
+        },
+        
+        get: function(eventUid){
+            
+            var promise = $http.get( '../api/events/' + eventUid + '.json').then(function(response){               
+                return response.data;
+                
+            }, function(){
+                return dhis2.ec.storageManager.getEvent(eventUid);
+            });            
+            return promise;
+        },
+        
+        create: function(dhis2Event){
+            
+            var e = angular.copy(dhis2Event);            
+            dhis2.ec.storageManager.saveEvent(e);            
+        
+            var promise = $http.post( '../api/events.json', dhis2Event).then(function(response){
+                dhis2.ec.storageManager.clearEvent(e);
+                return response.data;
+            }, function(){
+                return {importSummaries: [{status: 'SUCCESS', reference: e.event}]};
+            });
+            return promise;            
+        },
+        
+        delete: function(dhis2Event){
+            dhis2.ec.storageManager.clearEvent(dhis2Event);
+            var promise = $http.delete( '../api/events/' + dhis2Event.event).then(function(response){
+                return response.data;
+            }, function(){                
+            });
+            return promise;           
+        },
+    
+        update: function(dhis2Event){   
+            dhis2.ec.storageManager.saveEvent(dhis2Event);
+            var promise = $http.put( '../api/events/' + dhis2Event.event, dhis2Event).then(function(response){
+                dhis2.ec.storageManager.clearEvent(dhis2Event);
+                return response.data;
+            });
+            return promise;
+        },
+        
+        updateForSingleValue: function(singleValue, fullValue){                
+            
+            dhis2.ec.storageManager.saveEvent(fullValue);            
+            
+            var promise = $http.put( '../api/events/' + singleValue.event + '/' + singleValue.dataValues[0].dataElement, singleValue ).then(function(response){
+                dhis2.ec.storageManager.clearEvent(fullValue);
+                return response.data;
+            }, function(){                
+            });
+            return promise;
+        }
+    };    
+})
+
+/* Modal service for user interaction */
+.service('ModalService', ['$modal', function($modal) {
+
+        var modalDefaults = {
+            backdrop: true,
+            keyboard: true,
+            modalFade: true,
+            templateUrl: 'views/modal.html'
+        };
+
+        var modalOptions = {
+            closeButtonText: 'Close',
+            actionButtonText: 'OK',
+            headerText: 'Proceed?',
+            bodyText: 'Perform this action?'
+        };
+
+        this.showModal = function(customModalDefaults, customModalOptions) {
+            if (!customModalDefaults)
+                customModalDefaults = {};
+            customModalDefaults.backdrop = 'static';
+            return this.show(customModalDefaults, customModalOptions);
+        };
+
+        this.show = function(customModalDefaults, customModalOptions) {
+            //Create temp objects to work with since we're in a singleton service
+            var tempModalDefaults = {};
+            var tempModalOptions = {};
+
+            //Map angular-ui modal custom defaults to modal defaults defined in service
+            angular.extend(tempModalDefaults, modalDefaults, customModalDefaults);
+
+            //Map modal.html $scope custom properties to defaults defined in service
+            angular.extend(tempModalOptions, modalOptions, customModalOptions);
+
+            if (!tempModalDefaults.controller) {
+                tempModalDefaults.controller = function($scope, $modalInstance) {
+                    $scope.modalOptions = tempModalOptions;
+                    $scope.modalOptions.ok = function(result) {
+                        $modalInstance.close(result);
+                    };
+                    $scope.modalOptions.close = function(result) {
+                        $modalInstance.dismiss('cancel');
+                    };
+                };
+            }
+
+            return $modal.open(tempModalDefaults).result;
+        };
+
+    }])
+
+/* Dialog service for user interaction */
+.service('DialogService', ['$modal', function($modal) {
+
+        var dialogDefaults = {
+            backdrop: true,
+            keyboard: true,
+            backdropClick: true,
+            modalFade: true,            
+            templateUrl: 'views/dialog.html'
+        };
+
+        var dialogOptions = {
+            closeButtonText: 'close',
+            actionButtonText: 'ok',
+            headerText: 'dhis2_tracker',
+            bodyText: 'Perform this action?'
+        };
+
+        this.showDialog = function(customDialogDefaults, customDialogOptions) {
+            if (!customDialogDefaults)
+                customDialogDefaults = {};
+            customDialogDefaults.backdropClick = false;
+            return this.show(customDialogDefaults, customDialogOptions);
+        };
+
+        this.show = function(customDialogDefaults, customDialogOptions) {
+            //Create temp objects to work with since we're in a singleton service
+            var tempDialogDefaults = {};
+            var tempDialogOptions = {};
+
+            //Map angular-ui modal custom defaults to modal defaults defined in service
+            angular.extend(tempDialogDefaults, dialogDefaults, customDialogDefaults);
+
+            //Map modal.html $scope custom properties to defaults defined in service
+            angular.extend(tempDialogOptions, dialogOptions, customDialogOptions);
+
+            if (!tempDialogDefaults.controller) {
+                tempDialogDefaults.controller = function($scope, $modalInstance) {
+                    $scope.dialogOptions = tempDialogOptions;
+                    $scope.dialogOptions.ok = function(result) {
+                        $modalInstance.close(result);
+                    };                           
+                };
+            }
+
+            return $modal.open(tempDialogDefaults).result;
+        };
+
+    }])
+
+/* current item selected from grid */
+.service('SelectedEntity', function(){
+    this.selectedEntity = '';
+    
+    this.setSelectedEntity = function(selectedEntity){  
+        this.selectedEntity = selectedEntity;        
+    };
+    
+    this.getSelectedEntity = function(){
+        return this.selectedEntity;
+    };
+})
+
+/* Translation service - gets logged in user profile for the server, 
+ * and apply user's locale to translation
+ */
+.service('TranslationService', function($translate, storage){
+    
+    this.translate = function(){
+        var profile = storage.get('USER_PROFILE');        
+        if( profile ){        
+            $translate.uses(profile.settings.keyUiLocale);
+        }
+    };
+})
+
+/* Pagination service */
+.service('Paginator', function () {
+    this.page = 0;
+    this.rowsPerPage = 50;
+    this.itemCount = 0;
+    this.limitPerPage = 5;
+
+    this.setPage = function (page) {
+        if (page > this.pageCount()) {
+            return;
+        }
+
+        this.page = page;
+    };
+    
+    this.getPage = function(){
+        return this.page;
+    };
+    
+    this.getRowsPerPage = function(){
+        return this.rowsPerPage;
+    };
+
+    this.nextPage = function () {
+        if (this.isLastPage()) {
+            return;
+        }
+
+        this.page++;
+    };
+
+    this.perviousPage = function () {
+        if (this.isFirstPage()) {
+            return;
+        }
+
+        this.page--;
+    };
+
+    this.firstPage = function () {
+        this.page = 0;
+    };
+
+    this.lastPage = function () {
+        this.page = this.pageCount() - 1;
+    };
+
+    this.isFirstPage = function () {
+        return this.page == 0;
+    };
+
+    this.isLastPage = function () {
+        return this.page == this.pageCount() - 1;
+    };
+
+    this.pageCount = function () {
+        var count = Math.ceil(parseInt(this.itemCount, 10) / parseInt(this.rowsPerPage, 10)); 
+        if (count === 1) { this.page = 0; } return count;
+    };
+
+    this.lowerLimit = function() { 
+        var pageCountLimitPerPageDiff = this.pageCount() - this.limitPerPage;
+
+        if (pageCountLimitPerPageDiff < 0) { 
+            return 0; 
+        }
+
+        if (this.page > pageCountLimitPerPageDiff + 1) { 
+            return pageCountLimitPerPageDiff; 
+        } 
+
+        var low = this.page - (Math.ceil(this.limitPerPage/2) - 1); 
+
+        return Math.max(low, 0);
+    };
+})
+
+/*this is just a hack - there should be better way */
+.service('ValidDate', function(){    
+    var dateValidation;    
+    return {
+        get: function(dt) {
+            dateValidation = dt;
+        },
+        set: function() {    
+            return dateValidation;
+        }
+    };
+            
+});
+
+/*
+* Helper functions
+*/
+//This is is to have consistent display of entities and attributes
+//as every entity might not have value for every attribute.                
+function entityFormatter(entityList, attributesForListing){        
+
+   angular.forEach(entityList, function(trackedEntity){
+
+       //assume every entity has value for each attribute
+       //initially all are empty                                                 
+       angular.forEach(attributesForListing, function(attribute){
+
+           var loop = true;
+           var att = angular.copy(attribute);
+           att.value = '';
+
+           for(var i=0; i<trackedEntity.attributes.length && loop; i++){
+               if(trackedEntity.attributes[i].attribute == attribute.id){
+                   att.value = trackedEntity.attributes[i].value;
+                   loop = false;
+               }
+           }
+
+           trackedEntity[att.id] = att.value;
+
+       });
+   });
+
+   return entityList;
+}
\ No newline at end of file

=== added file 'dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/scripts/tracker-capture.js'
--- dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/scripts/tracker-capture.js	1970-01-01 00:00:00 +0000
+++ dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/scripts/tracker-capture.js	2014-03-17 15:59:31 +0000
@@ -0,0 +1,552 @@
+
+dhis2.util.namespace('dhis2.tc');
+
+// whether current user has any organisation units
+dhis2.tc.emptyOrganisationUnits = false;
+
+// Instance of the StorageManager
+dhis2.tc.storageManager = new StorageManager();
+
+var DAO = DAO || {};
+
+var i18n_no_orgunits = 'No organisation unit attached to current user, no data entry possible';
+var i18n_offline_notification = 'You are offline, data will be stored locally';
+var i18n_online_notification = 'You are online';
+var i18n_need_to_sync_notification = 'There is data stored locally, please upload to server';
+var i18n_sync_now = 'Upload';
+var i18n_sync_success = 'Upload to server was successful';
+var i18n_sync_failed = 'Upload to server failed, please try again later';
+var i18n_uploading_data_notification = 'Uploading locally stored data to the server';
+
+var PROGRAMS_METADATA = 'PROGRAMS';
+
+var EVENT_VALUES = 'EVENTVALUES';
+
+DAO.store = new dhis2.storage.Store({
+    name: 'dhis2',
+    adapters: [dhis2.storage.DomSessionStorageAdapter, dhis2.storage.InMemoryAdapter],
+    objectStores: ['optionSets']
+});
+
+(function($) {
+    $.safeEach = function(arr, fn)
+    {
+        if (arr)
+        {
+            $.each(arr, fn);
+        }
+    };
+})(jQuery);
+
+
+/**
+ * Page init. The order of events is:
+ *
+ * 1. Load ouwt 2. Load meta-data (and notify ouwt) 3. Check and potentially
+ * download updated forms from server
+ */
+$(document).ready(function()
+{
+    $.ajaxSetup({
+        type: 'POST',
+        cache: false
+    });
+
+    $('#loaderSpan').show();
+
+    $('#orgUnitTree').one('ouwtLoaded', function()
+    {        
+        var def = $.Deferred();
+        var promise = def.promise();
+        
+        promise = promise.then( getUserProfile );
+        promise = promise.then( getAttributes );
+        promise = promise.then( getMetaPrograms );     
+        promise = promise.then( getPrograms );      
+        promise = promise.then( getProgramStages );        
+        promise.done( function() {           
+            selection.responseReceived();                      
+        });           
+        
+        def.resolve();
+        
+    });
+
+    $(document).bind('dhis2.online', function(event, loggedIn)
+    {        
+        if (loggedIn)
+        {
+            if (dhis2.tc.storageManager.hasLocalData())
+            {
+                var message = i18n_need_to_sync_notification
+                        + ' <button id="sync_button" type="button">' + i18n_sync_now + '</button>';
+
+                setHeaderMessage(message);
+
+                $('#sync_button').bind('click', uploadLocalData);
+            }
+            else
+            {
+                if (dhis2.tc.emptyOrganisationUnits) {
+                    setHeaderMessage(i18n_no_orgunits);
+                }
+                else {
+                    setHeaderDelayMessage(i18n_online_notification);
+                }
+            }
+        }
+        else
+        {
+            var form = [
+                '<form style="display:inline;">',
+                '<label for="username">Username</label>',
+                '<input name="username" id="username" type="text" style="width: 70px; margin-left: 10px; margin-right: 10px" size="10"/>',
+                '<label for="password">Password</label>',
+                '<input name="password" id="password" type="password" style="width: 70px; margin-left: 10px; margin-right: 10px" size="10"/>',
+                '<button id="login_button" type="button">Login</button>',
+                '</form>'
+            ].join('');
+
+            setHeaderMessage(form);
+            ajax_login();
+        }
+    });
+
+    $(document).bind('dhis2.offline', function()
+    {
+        if (dhis2.tc.emptyOrganisationUnits) {
+            setHeaderMessage(i18n_no_orgunits);
+        }
+        else {
+            setHeaderMessage(i18n_offline_notification);
+            selection.responseReceived(); //notify angular 
+        }
+    });
+   
+    //dhis2.availability.startAvailabilityCheck();
+    
+});
+
+function ajax_login()
+{
+    $('#login_button').bind('click', function()
+    {
+        var username = $('#username').val();
+        var password = $('#password').val();
+
+        $.post('../dhis-web-commons-security/login.action', {
+            'j_username': username,
+            'j_password': password
+        }).success(function()
+        {
+            var ret = dhis2.availability.syncCheckAvailability();
+
+            if (!ret)
+            {
+                alert(i18n_ajax_login_failed);
+            }
+        });
+    });
+}
+
+
+function getUserProfile()
+{
+    var def = $.Deferred();
+
+    $.ajax({
+        url: '../api/me/profile',
+        type: 'GET'
+    }).done( function(response) {            
+        localStorage['USER_PROFILE'] = JSON.stringify(response);           
+        def.resolve();
+    });
+    
+    return def.promise(); 
+}
+
+
+function getMetaPrograms()
+{
+    var PROGRAMS_METADATA = 'PROGRAMS';
+    var def = $.Deferred();
+
+    $.ajax({
+        url: '../api/programs.json',
+        type: 'GET',
+        data:'type=1'
+    }).done( function(response) {            
+        localStorage[PROGRAMS_METADATA] = JSON.stringify(response.programs);           
+        def.resolve( response.programs );
+    });
+    
+    return def.promise(); 
+}
+
+function getPrograms( programs )
+{
+    if( !programs ){
+        return;
+    }
+    
+    var def = $.Deferred();
+    var promise = def.promise();
+
+    _.each( _.values( programs ), function ( program ) {        
+        promise = promise.then( getProgram( program.href ) );
+    });
+    
+    promise = promise.then(function() {
+        return $.Deferred().resolve( programs );
+    });
+    
+    def.resolve( programs );
+    
+    return promise;   
+}
+
+function getProgram( url )
+{   
+
+    return function() {
+        return $.ajax( {
+            url: url,
+            type: 'GET'
+        }).done( function( program ){     
+            
+            var ou = {};
+            _.each(_.values( program.organisationUnits), function(o){
+                ou[o.id] = o.name;
+            });
+            
+            program.organisationUnits = ou;
+            
+            var ur = {};
+            _.each(_.values( program.userRoles), function(u){
+                ur[u.id] = u.name;
+            });
+            
+            program.userRoles = ur;
+          
+            localStorage[program.id] = JSON.stringify(program);
+        });
+    };
+}
+
+function getProgramStages( programs )
+{
+    if( !programs ){
+        return;
+    }
+    
+    var def = $.Deferred();
+    var promise = def.promise();
+
+    _.each( _.values( programs ), function ( program ) {  
+        program = JSON.parse( localStorage[program.id] );
+        _.each( _.values( program.programStages ), function( programStage ) {
+            promise = promise.then( getProgramStage( programStage.href ) );
+        });        
+    });
+    
+    promise = promise.then(function() {
+        return def.resolve();
+    });
+    
+    def.resolve();
+    
+    return promise; 
+}
+
+function getProgramStage( url )
+{
+    return function() {
+        return $.ajax( {
+            url: url,
+            type: 'GET'
+        }).done( function( programStage ){
+            localStorage[programStage.id] = JSON.stringify(programStage);
+        });
+    };
+}
+
+function getAttributes()
+{
+    var def = $.Deferred();
+
+    $.ajax({
+        url: '../api/trackedEntityAttributes.json?viewClass=detailed&paging=false',
+        type: 'GET'
+    }).done( function(response) {            
+        localStorage['ATTRIBUTES'] = JSON.stringify(response.trackedEntityAttributes);
+        def.resolve();
+    });
+    
+    return def.promise(); 
+}
+
+function uploadLocalData()
+{
+    if ( !dhis2.tc.storageManager.hasLocalData() )
+    {
+        return;
+    }
+
+    setHeaderWaitMessage( i18n_uploading_data_notification );
+    
+    var events = dhis2.tc.storageManager.getEventsAsArray();   
+    
+    _.each( _.values( events ), function( event ) {
+        
+        if( event.hasOwnProperty('src')){
+            if( event.src == 'local'){
+                delete event.event;
+            }
+            
+            delete event.src;
+        }        
+    });    
+    
+    events = {eventList: events};
+    
+    //jackson insists for valid json, where properties are bounded with ""    
+    events = JSON.stringify(events);  
+    
+    $.ajax( {
+        url: '../api/events.json',
+        type: 'POST',
+        data: events,
+        contentType: 'application/json',              
+        success: function()
+        {
+            dhis2.tc.storageManager.clear();
+            log( 'Successfully uploaded local events' );      
+            setHeaderDelayMessage( i18n_sync_success );
+            selection.responseReceived(); //notify angular 
+        },
+        error: function( xhr )
+        {
+            if ( 409 == xhr.status ) // Invalid event
+            {
+                // there is something wrong with the data - ignore for now.
+
+                dhis2.tc.storageManager.clear();
+            }
+            else // Connection lost during upload
+            {
+                var message = i18n_sync_failed
+                    + ' <button id="sync_button" type="button">' + i18n_sync_now + '</button>';
+
+                setHeaderMessage( message );
+                $( '#sync_button' ).bind( 'click', uploadLocalData );
+            }
+        }
+    } );
+}
+
+// -----------------------------------------------------------------------------
+// StorageManager
+// -----------------------------------------------------------------------------
+
+/**
+ * This object provides utility methods for localStorage and manages data entry
+ * forms and data values.
+ */
+function StorageManager()
+{
+    var MAX_SIZE = new Number(2600000);
+
+    /**
+     * Returns the total number of characters currently in the local storage.
+     *
+     * @return number of characters.
+     */
+    this.totalSize = function()
+    {
+        var totalSize = new Number();
+
+        for (var i = 0; i < localStorage.length; i++)
+        {
+            var value = localStorage.key(i);
+
+            if (value)
+            {
+                totalSize += value.length;
+            }
+        }
+
+        return totalSize;
+    };
+
+    /**
+     * Return the remaining capacity of the local storage in characters, ie. the
+     * maximum size minus the current size.
+     */
+    this.remainingStorage = function()
+    {
+        return MAX_SIZE - this.totalSize();
+    };
+    
+    /**
+     * Clears stored events. 
+     */
+    this.clear = function ()
+    {
+        localStorage.removeItem(EVENT_VALUES);        
+    };    
+    
+    /**
+     * Saves an event
+     *
+     * @param event The event in json format.
+     */
+    this.saveEvent = function(event)
+    {
+        //var newEvent = event;
+        
+        if( !event.hasOwnProperty('src') )
+        {
+            if( !event.event){
+                event.event = this.generatePseudoUid();
+                event.src = 'local';
+            }            
+        }        
+
+        var events = {};
+
+        if (localStorage[EVENT_VALUES] != null)
+        {
+            events = JSON.parse(localStorage[EVENT_VALUES]);
+        }
+
+        events[event.event] = event;
+
+        try
+        {
+            localStorage[EVENT_VALUES] = JSON.stringify(events);
+
+            log('Successfully stored event - locally');
+        }
+        catch (e)
+        {
+            log('Max local storage quota reached, not storing data value locally');
+        }
+    };
+    
+    /**
+     * Gets the value for the event with the given arguments, or null if it
+     * does not exist.
+     *
+     * @param id the event identifier.
+     *
+     */
+    this.getEvent = function(id)
+    {
+        if (localStorage[EVENT_VALUES] != null)
+        {
+            var events = JSON.parse(localStorage[EVENT_VALUES]);
+
+            return events[id];
+        }
+
+        return null;
+    };
+
+    /**
+     * Removes the given event from localStorage.
+     *
+     * @param event and identifiers in json format.
+     */
+    this.clearEvent = function(event)
+    {
+        var events = this.getAllEvents();
+
+        if (events != null && events[event.event] != null)
+        {
+            delete events[event.event];
+            localStorage[EVENT_VALUES] = JSON.stringify(events);
+        }
+    };
+    
+    /**
+     * Returns events matching the arguments provided
+     * 
+     * @param orgUnit 
+     * @param programStage
+     * 
+     * @return a JSON associative array.
+     */
+    this.getEvents = function(orgUnit, programStage)
+    {
+        var events = this.getEventsAsArray();
+        var match = [];
+        for( var i=0; i<events.length; i++){
+            if(events[i].orgUnit == orgUnit && events[i].programStage == programStage ){
+                match.push(events[i]);
+            }
+        }
+        
+        return match;
+    };
+    
+    /**
+     *
+     * @return a JSON associative array.
+     */
+    this.getAllEvents = function()
+    {
+        return localStorage[EVENT_VALUES] != null ? JSON.parse( localStorage[EVENT_VALUES] ) : null;
+    };    
+
+    /**
+     * Returns all event objects in an array. Returns an empty array if no
+     * event exist. Items in array are guaranteed not to be undefined.
+     */
+    this.getEventsAsArray = function()
+    {
+        var values = new Array();
+        var events = this.getAllEvents();
+
+        if (undefined == events)
+        {
+            return values;
+        }
+
+        for (i in events)
+        {
+            if (events.hasOwnProperty(i) && undefined !== events[i])
+            {
+                values.push(events[i]);
+            }
+        }
+
+        return values;
+    };
+    
+    /**
+     * Indicates whether there exists data values or complete data set
+     * registrations in the local storage.
+     *
+     * @return true if local data exists, false otherwise.
+     */
+    this.hasLocalData = function()
+    {
+        var events = this.getAllEvents();        
+
+        if (events == null)
+        {
+            return false;
+        }
+        if (Object.keys(events).length < 1)
+        {
+            return false;
+        }    
+
+        return true;
+    };
+    
+    this.generatePseudoUid = function () 
+    {
+        return Math.random().toString(36).substr(2, 11);
+    };
+}
\ No newline at end of file

=== added directory 'dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/styles'
=== added file 'dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/styles/style.css'
--- dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/styles/style.css	1970-01-01 00:00:00 +0000
+++ dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/styles/style.css	2014-03-17 15:59:31 +0000
@@ -0,0 +1,1353 @@
+/*----------------------------------------------------------------------------*/
+/* Form
+/*----------------------------------------------------------------------------*/
+
+input[type="button"], input[type="submit"] 
+{
+    width: 130px;
+}
+
+input.tiny-button[type="button"] 
+{
+    width: 20px;
+    height: 20px;
+}
+
+input.small-button[type="button"] 
+{
+    width: 30px;
+    height: 30px;
+}
+
+input.normal-button[type="button"] , input.normal-button[type="submit"] 
+{
+    width: 60px;
+}
+
+input.large-button[type="button"] 
+{
+    width: 130px;
+}
+
+select.search-field
+{
+    width: 180px;
+}
+
+input[type="text"] 
+{
+    width: 260px;
+}
+
+input.option
+{
+    width: 240px;
+}
+
+select 
+{
+    width: 264px;
+}
+
+textarea 
+{
+    width: 264px;
+}
+
+.button-list 
+{
+    text-align:right;
+    padding-bottom:10px;
+    width:100%;
+}
+
+.incomplete-record
+{ 
+    color: black;
+    font-size: 21px;
+    font-weight: bold;
+}
+
+.img-button
+{
+    width:20px;
+    cursor:pointer;
+}
+
+/*----------------------------------------------------------------------------*/
+/* Table
+/*----------------------------------------------------------------------------*/
+
+table 
+{
+    font-size: 13px;
+    line-height: 18px;
+    margin-bottom: 10px;
+}
+
+.heading-column 
+{
+    width: 400px;
+}
+
+td.input-column 
+{
+    padding-left: 5px; 
+    padding-right: 1px; 
+}
+
+td.error {
+    padding-left: 1em;
+}
+
+table.information, td.information 
+{
+    border:1px solid #808080; 
+    vertical-align:top;
+    padding:10px;
+}
+
+.text-column 
+{
+    padding-left: 5px;
+    padding-right: 6px;
+    text-align: left;
+}
+
+.errorCell
+{
+    background-color: #FFCFCF
+}
+
+.search 
+{
+    position: relative;
+    border: 1px solid #a4d2a3;
+    background-color: #d5efd5;
+    padding-top: 10px;
+    padding-right: 20px;
+    padding-bottom: 5px;
+    padding-left: 20px;
+    margin-bottom: 15px;
+    border-radius: 3px;
+    max-width: 570px;
+}
+
+#minimized-advanced-search 
+{
+    position: relative;
+    border: 1px solid #a4d2a3;
+    background-color: #d5efd5;
+    padding-top: 10px;
+    padding-right: 20px;
+    padding-bottom: 5px;
+    padding-left: 20px;
+    margin-bottom: 15px;
+    border-radius: 3px;
+}
+
+.green-background 
+{
+    position: relative;
+    border: 1px solid #a4d2a3;
+    background-color: #d5efd5;
+    padding-top: 10px;
+    padding-right: 20px;
+    padding-bottom: 5px;
+    padding-left: 20px;
+    margin-bottom: 15px;
+    border-radius: 3px;
+}
+
+.searchInput
+{
+    width: 240px;
+}
+
+/*----------------------------------------------------------------------------*/
+/* Button list
+/*----------------------------------------------------------------------------*/
+
+.buttons
+{
+    text-align:right;
+    padding-bottom:10px;
+    width:100%;
+}
+
+div.actions
+{
+    float: right;
+    width: 140px;
+    text-align: right;
+}
+
+/*----------------------------------------------------------------------------*/
+/* Data entry form                                                        */
+/*----------------------------------------------------------------------------*/
+
+.entryScreen
+{
+    margin-bottom: 20px;
+    width: 100%;
+    font-size: 13px; 
+    line-height: 18px;
+}
+
+input.criteria
+{
+    width: 130px;
+    margin-right: 5px;
+}
+
+input.move-button
+{
+    width: 20px;
+    height: 60px;
+    border-color: #bbbbbb;
+    cursor: pointer;
+    border: 1px solid #aaa;
+    margin: 0px;
+}
+
+input.optionset[type="text"]
+{
+    width:240px; 
+}
+
+input.datefield[type="text"]
+{
+    width:240px; 
+}
+
+div.provided-elsewhere
+{
+    width:20px; 
+    height:20px; 
+}
+
+.ui-button
+{
+    max-height: 100px;
+}
+
+.ui-autocomplete
+{
+    max-height: 100px;
+    overflow-y: auto;
+    overflow-x: hidden;
+}
+
+.hidden
+{
+    display: none;
+}
+
+.colorHelpTable td
+{
+    height: 32px;
+}
+
+/* --------------------------------------------------------------
+// Dashboard
+// -------------------------------------------------------------- */
+
+div.dashboard-area 
+{
+    list-style: none inside;
+    margin: 50px 50px;
+    margin: 0;
+    padding: 0;
+}
+
+p.header
+{
+    background-color:#CBDDEB;
+    background-repeat:repeat-x;
+    border:1px solid #C8DBEA;
+    color:#39547D;
+    padding:6px;
+    margin:0px;
+    font-family: LiberationSansBold,arial;
+}
+
+table.link-area
+{
+    border:1px solid #d0d0d0;
+    padding-top:1px;
+    padding-right:1px;
+    padding-left:1px;
+    padding-bottom:0px;
+    height:120px;
+    overflow:hidden;
+    align:bottom;
+}
+
+div.link-area
+{
+    display:inline-block;
+    border:1px solid #d0d0d0;
+    padding-top:1px;
+    padding-right:1px;
+    padding-left:1px;
+    padding-bottom:0px;
+    height:172px;
+
+    overflow:hidden;
+}
+
+.contentProviderTable
+{
+    height: 140px;
+    overflow-y: auto;
+    overflow-x:hidden;
+}
+
+.contentProviderTable table
+{
+    width:100%;
+}
+
+.contentProviderTable td
+{
+    padding-top:3px;
+    padding-bottom:3px;
+    border-bottom:1px solid #cad5e5;
+}
+
+div.event-dashboard
+{
+    width:900px;
+    border:1px solid #d0d0d0;
+    position:relative;
+    top: 47px;
+}
+
+div.link-area-active
+{
+    width:900px;
+    border:10px solid #d0d0d0;
+    position:relative;
+    top: 47px;
+}
+
+div.event-flow-dashboard
+{
+    width:900px;
+    height:140px;
+    overflow-x:auto;
+    overflow-y:hidden;
+}
+
+#subMenu
+{
+    position:absolute;
+}
+
+#subMenu ul
+{
+    list-style-type:none;
+    margin: 0;
+}
+
+#subMenu li
+{
+    float:left;
+}
+
+#subMenu a
+{
+    padding: 6px 12px;
+    height: 25px;
+    border: 1px solid #aaa;
+    border-radius: 3px;
+    margin-right: 4px;
+    font-family: LiberationSansBold, arial;
+    font-size: 13px;
+    color: #606060;
+    background-color: #f3f3f3;
+}
+
+#subMenu a:hover
+{
+    text-decoration: none;
+    background-color: #f8f8f8;
+}
+
+.tooltip 
+{
+    border-bottom: dashed 1px #aaa;
+    text-decoration: none;
+    cursor: help;
+    text-align: left;
+}
+
+.tooltip-target {
+    width: 250px;
+    top: 29px;
+    left: 764px;
+    display: none;
+    padding: 10px;
+    background: #ffffff;
+    position: absolute;
+    display: none;
+    float: left;
+    -webkit-border-radius: 7px;
+    -moz-border-radius: 7px;
+    border-radius: 7px;
+    border: solid 1px #ddd;
+    z-index:1001;
+}
+
+.comment-table
+{
+    width:320px;
+    overflow-y: auto;
+    overflow-x:hidden;
+}
+
+.comment-table td
+{
+    padding-top:3px;
+    padding-bottom:3px;
+    border-bottom:1px solid #cad5e5;
+}
+
+/* --------------------------------------------------------------
+// program-stage-instances
+// -------------------------------------------------------------- */
+
+.stage-container
+{
+    width:100%;
+    height:100px;
+}
+
+.stage-flow
+{
+    height:100px;
+    overflow-x:hidden;
+    overflow-y:hidden;
+}
+
+.table-flow
+{
+    height:100px;
+    overflow-x:hidden;
+    overflow-y:hidden;
+}
+
+.arrow-left {
+    width:0; 
+    height:0; 
+    border-top:45px solid transparent;
+    border-bottom:45px solid transparent; 
+    border-right:30px solid #d0d0d0;
+    cursor:pointer;
+}
+
+.arrow-right {
+    width:0; 
+    height:0; 
+    border-top:45px solid transparent;
+    border-bottom:45px solid transparent;
+    border-left:30px solid #d0d0d0;
+    cursor:pointer;
+}
+
+div.orgunit-object
+{
+    margin-left: 5px;
+    width: 120px;
+}
+
+input.stage-object[type="button"]
+{
+    width: 135px;
+    height: 60px;
+    cursor: pointer;
+    opacity: 1.0;
+    border: 2px solid;
+    margin: 5px;
+    white-space: normal;
+}
+
+input.stage-object[type="button"]:hover
+{
+    border: 5px solid;
+}
+
+input.stage-object-selected[type="button"]
+{
+    border: 5px solid;
+}
+
+input.stage-scheduled[type="button"]
+{
+    border: 5px solid;
+}
+
+input.patient-object[type="button"]
+{
+    width: 130px;
+    height: 60px;
+    border-color: #bbbbbb;
+    background-color: #ddd;
+    cursor: pointer;
+    border: 1px solid #aaa;
+    margin: 5px;
+    border-radius: 2px;
+}
+
+div.dashboard-history
+{
+    z-index:100; 
+    width:300px; 
+    height:200px; 
+    position:absolute; 
+    left:650px; 
+    top:115px; 
+    background-color:#ffffff;
+    border:1px solid #d0d0d0;
+    padding-top:1px;
+    padding-right:1px;
+    padding-left:1px;
+    padding-bottom:1px;
+}
+
+/*----------------------------------------------------------------------------*/
+/* Program tracking
+/*----------------------------------------------------------------------------*/
+
+div.link-area-tracking
+{
+    display:inline-block;
+    border:1px solid #d0d0d0;
+    padding-top:1px;
+    padding-right:1px;
+    padding-left:1px;
+    padding-bottom:0px;
+    height:200px;
+    width:60%;
+    overflow:hidden;
+}
+
+.gridTable th, .gridTable td {
+    line-height: 200%;
+}
+
+/* Treepanel contextmenu */
+#treepanel-contextmenu {
+    border-radius: 2px;
+    border-width: 1px;
+    border-style: solid;
+    border-color: #aaa;
+}
+
+
+/* --------------------------------------------------------------
+// Capture Coordinates
+// -------------------------------------------------------------- */
+
+.coordinates1{
+    width: 110px;
+    white-space: normal;
+}
+
+.coordinates2{
+    width: 150px;
+}
+
+
+.commentHeader
+{
+    color: #606060;
+    font-size: 17px;
+    padding: 5px 0;
+}
+
+
+/* --------------------------------------------------------------
+// App - specific (might change this if Lars is not happy
+// -------------------------------------------------------------- */
+
+.container-heading {
+    color: white;
+    padding: 12px;
+}
+
+.container-1-4 {
+    width: 25%;
+    float: left;
+    margin-top: 1em;
+    margin-bottom: 1em;
+}
+
+.container-1-2 {
+    width: 50%;
+    float: left;
+    margin-top: 1em;
+    margin-bottom: 1em;
+}
+
+.container-1-1 {
+    width: 100%;
+    float: left;
+    margin-top: 1em;
+}
+
+div.paging a.active
+{
+    text-decoration: none; 
+    color: #000;
+    cursor: default;
+}
+
+.input-error {
+    background-color: #ff6600;
+}
+
+.input-success {
+    background-color: #b9ffb9;
+}
+
+.red {
+    color: red;
+}
+
+.right {
+    float: right !important;
+}
+
+.black {
+    color: black;
+}
+
+.bold {
+    font-weight: bold;
+}
+
+.white {
+    color: white;
+}
+
+.anchor-color {
+    color: #276696;
+}
+
+.inline-div {
+    display: inline-block; 
+    margin-right: 5px;
+    float: left;
+}
+
+.bordered-div
+{
+    border: 1px solid #c2c2c2;
+    border-radius: 10px;
+    padding: 5px 10px;
+    margin-bottom: 20px;
+}
+
+
+.nav, .pagination, .carousel, .panel-title a { 
+    cursor: pointer; 
+    text-decoration: none;
+}
+
+input[type=number]::-webkit-inner-spin-button, input[type=number]::-webkit-outer-spin-button {
+    -webkit-appearance: none;
+    margin: 0;
+}
+
+input[type=date]::-webkit-inner-spin-button, input[type=date]::-webkit-outer-spin-button {
+    -webkit-appearance: none;
+    margin: 0;
+}
+
+.max-column-width {
+    max-width:200px !important; 
+    word-wrap:break-word; 
+}
+
+.table-borderless {
+    width: 100%;
+}
+
+.table-borderless>thead>tr>th, 
+.table-borderless>tbody>tr>th, 
+.table-borderless>tfoot>tr>th, 
+.table-borderless>thead>tr>td, 
+.table-borderless>tbody>tr>td, 
+.table-borderless>tfoot>tr>td {
+    border-top: none; 
+    //background-color: #ebf0f6;
+    padding-right: 8px;
+}
+
+.dhis2-table>thead>tr>th, 
+.dhis2-table>tbody>tr>th, 
+.dhis2-table>tfoot>tr>th, 
+.dhis2-table>thead>tr>td, 
+.dhis2-table>tbody>tr>td, 
+.dhis2-table>tfoot>tr>td {
+    border-top: none;
+    background-color: #ebf0f6;
+}
+
+.dhis2-table-striped-border tr th {
+    border: 1px solid #cad5e5;
+}
+
+.dhis2-table-striped-border tr td {
+    border: 1px solid #cad5e5;
+}
+
+.dhis2-table-striped-border > tbody > tr:nth-child(odd)> td, .dhis2-table-striped > tbody > tr:nth-child(odd)> th {
+    background-color: #ebf0f6
+}
+
+.dhis2-table-striped>thead>tr, 
+.dhis2-table-striped>tbody>tr, 
+.dhis2-table-striped>tfoot>tr, 
+.dhis2-table-striped>thead>tr, 
+.dhis2-table-striped>tbody>tr, 
+.dhis2-table-striped>tfoot>tr {
+    border-bottom: 1px solid #cad5e5;
+    //border: none;
+}
+
+.dhis2-table-striped > tbody > tr:nth-child(odd)> td, .dhis2-table-striped > tbody > tr:nth-child(odd)> th {
+    background-color: #ebf0f6
+}
+
+.dhis2-list-table-striped {
+    width: 100%;
+    border: 1px solid #c2c2c2;
+    padding: 5px 10px;
+}
+
+.dhis2-list-table-striped>thead>tr, 
+.dhis2-list-table-striped>tbody>tr, 
+.dhis2-list-table-striped>tfoot>tr, 
+.dhis2-list-table-striped>thead>tr, 
+.dhis2-list-table-striped>tbody>tr, 
+.dhis2-list-table-striped>tfoot>tr {
+    border: none;
+}
+
+.dhis2-list-table-striped > tbody > tr:nth-child(odd)> td, .dhis2-table-striped > tbody > tr:nth-child(odd)> th {
+    background-color: #ebf0f6
+}
+
+.dhis2-table-hover > tbody > tr:hover > td, .table-hover > tbody > tr:hover > th {
+    background-color: #dfe9f4;
+}
+
+#contextMenu {
+    position: absolute;
+    display:none;
+}
+
+.filter-with-content {
+    float: right !important;
+    color: red;
+}
+
+.filter-without-content {
+    float: right !important;
+    color: black;
+}
+
+.bold {
+    font-weight: bold;
+}
+
+/*----------------------------------------------------------------------------*/
+/* Bootstrap modal style
+/*----------------------------------------------------------------------------*/
+.modal-open {
+    overflow: hidden
+}
+.modal {
+    position: fixed;
+    top: 0;
+    right: 0;
+    bottom: 0;
+    left: 0;
+    z-index: 1040;
+    display: none;
+    overflow: auto;
+    overflow-y: scroll
+}
+.modal.fade .modal-dialog {
+    -webkit-transform: translate(0,-25%);
+    -ms-transform: translate(0,-25%);
+    transform: translate(0,-25%);
+    -webkit-transition: -webkit-transform .3s ease-out;
+    -moz-transition: -moz-transform .3s ease-out;
+    -o-transition: -o-transform .3s ease-out;
+    transition: transform .3s ease-out
+}
+.modal.in .modal-dialog {
+    -webkit-transform: translate(0,0);
+    -ms-transform: translate(0,0);
+    transform: translate(0,0)
+}
+.modal-dialog {
+    position: relative;
+    z-index: 1050;
+    width: auto;
+    padding: 10px;
+    margin-right: auto;
+    margin-left: auto
+}
+.modal-content {
+    position: relative;
+    background-color: #fff;
+    border: 1px solid #999;
+    border: 1px solid rgba(0,0,0,0.2);
+    border-radius: 6px;
+    outline: 0;
+    -webkit-box-shadow: 0 3px 9px rgba(0,0,0,0.5);
+    box-shadow: 0 3px 9px rgba(0,0,0,0.5);
+    background-clip: padding-box
+}
+.modal-backdrop {
+    position: fixed;
+    top: 0;
+    right: 0;
+    bottom: 0;
+    left: 0;
+    z-index: 1030;
+    background-color: #000
+}
+.modal-backdrop.fade {
+    opacity: 0;
+    filter: alpha(opacity=0)
+}
+.modal-backdrop.in {
+    opacity: .5;
+    filter: alpha(opacity=50)
+}
+.modal-header {
+    min-height: 16.428571429px;
+    padding: 15px;
+    border-bottom: 1px solid #e5e5e5
+}
+.modal-header .close {
+    margin-top: -2px
+}
+.modal-title {
+    margin: 0;
+    line-height: 1.428571429
+}
+.modal-body {
+    position: relative;
+    padding: 20px
+}
+.modal-footer {
+    padding: 19px 20px 20px;
+    margin-top: 15px;
+    text-align: right;
+    border-top: 1px solid #e5e5e5
+}
+.modal-footer:before, .modal-footer:after {
+    display: table;
+    content: " "
+}
+.modal-footer:after {
+    clear: both
+}
+.modal-footer:before, .modal-footer:after {
+    display: table;
+    content: " "
+}
+.modal-footer:after {
+    clear: both
+}
+.modal-footer .btn+ .btn {
+    margin-bottom: 0;
+    margin-left: 5px
+}
+.modal-footer .btn-group .btn+ .btn {
+    margin-left: -1px
+}
+.modal-footer .btn-block+ .btn-block {
+    margin-left: 0
+}
+@media screen and (min-width: 768px) {
+    .modal-dialog {
+        width: 600px;
+        padding-top: 30px;
+        padding-bottom: 30px
+    }
+    .modal-content {
+        -webkit-box-shadow: 0 5px 15px rgba(0,0,0,0.5);
+        box-shadow: 0 5px 15px rgba(0,0,0,0.5)
+    }
+}
+
+.container {
+    padding-right: 15px;
+    padding-left: 15px;
+    margin-right: auto;
+    margin-left: auto
+}
+.container:before, .container:after {
+    display: table;
+    content: " "
+}
+.container:after {
+    clear: both
+}
+.container:before, .container:after {
+    display: table;
+    content: " "
+}
+.container:after {
+    clear: both
+}
+@media (min-width: 768px) {
+    .container {
+        width: 750px
+    }  z-index: 1051;
+}
+@media (min-width: 992px) {
+    .container {
+        width: 970px
+    }
+}
+@media (min-width: 1200px) {
+    .container {
+        width: 1170px
+    }
+}
+.container > .navbar-header, .container > .navbar-collapse {
+    margin-right: -15px;
+    margin-left: -15px
+}
+@media (min-width: 768px) {
+    .container > .navbar-header, .container > .navbar-collapse {
+        margin-right: 0;
+        margin-left: 0
+    }
+}
+
+@media (min-width: 768px) {
+    .navbar > .container .navbar-brand {
+        margin-left: -15px
+    }
+}
+
+.container .jumbotron {
+    border-radius: 6px
+}
+@media screen and (min-width: 768px) {
+    .jumbotron {
+        padding-top: 48px;
+        padding-bottom: 48px
+    }
+    .container .jumbotron {
+        padding-right: 60px;
+        padding-left: 60px
+    }
+    .jumbotron h1 {
+        font-size: 63px
+    }
+}
+
+.dropdown {
+    position: relative
+}
+.dropdown-toggle:focus {
+    outline: 0
+}
+.dropdown-menu {
+    position: absolute;
+    top: 100%;
+    left: 0;
+    z-index: 1000;
+    display: none;
+    float: left;
+    min-width: 160px;
+    padding: 5px 0;
+    margin: 2px 0 0;
+    font-size: 14px;
+    list-style: none;
+    background-color: #fff;
+    border: 1px solid #ccc;
+    border: 1px solid rgba(0,0,0,0.15);
+    border-radius: 4px;
+    -webkit-box-shadow: 0 6px 12px rgba(0,0,0,0.175);
+    box-shadow: 0 6px 12px rgba(0,0,0,0.175);
+    background-clip: padding-box
+}
+.dropdown-menu.pull-right {
+    right: 0;
+    left: auto
+}
+.dropdown-menu .divider {
+    height: 1px;
+    margin: 9px 0;
+    overflow: hidden;
+    background-color: #e5e5e5
+}
+
+.dropdown-menu > li > a {
+    display: block;
+    padding: 3px 20px;
+    clear: both;
+    font-weight: normal;
+    line-height: 1.428571429;
+    color: #333;
+    white-space: nowrap
+}
+.dropdown-menu > li > a:hover, .dropdown-menu > li > a:focus {
+    color: #262626;
+    text-decoration: none;
+    background-color: #f5f5f5
+}
+.dropdown-menu > .active > a, .dropdown-menu > .active > a:hover, .dropdown-menu > .active > a:focus {
+    color: #fff;
+    text-decoration: none;
+    background-color: #428bca;
+    outline: 0
+}
+.dropdown-menu > .disabled > a, .dropdown-menu > .disabled > a:hover, .dropdown-menu > .disabled > a:focus {
+    color: #999
+}
+.dropdown-menu > .disabled > a:hover, .dropdown-menu > .disabled > a:focus {
+    text-decoration: none;
+    cursor: not-allowed;
+    background-color: transparent;
+    background-image: none;
+    filter: progid:DXImageTransform.Microsoft.gradient(enabled=false)
+}
+.open > .dropdown-menu {
+    display: block
+}
+
+/*----------------------------------------------------------------------------*/
+/* Bootstrap panel style
+/*----------------------------------------------------------------------------*/
+
+.panel {
+    font-family: LiberationSansRegular, arial, sans-serif !important;
+    font-size: 9pt !important;
+    margin-bottom: 20px;
+    background-color: #fff;
+    border: 1px solid transparent;
+
+    -webkit-box-shadow: 0 1px 1px rgba(0,0,0,0.05);
+    box-shadow: 0 1px 1px rgba(0,0,0,0.05)
+}
+.panel-body {
+    padding: 10px
+}
+.panel-body:before, .panel-body:after {
+    display: table;
+    content: " "
+}
+.panel-body:after {
+    clear: both
+}
+.panel-body:before, .panel-body:after {
+    display: table;
+    content: " "
+}
+.panel-body:after {
+    clear: both
+}
+.panel > .list-group {
+    margin-bottom: 0
+}
+.panel > .list-group .list-group-item {
+    border-width: 1px 0
+}
+.panel > .list-group .list-group-item:first-child {
+    border-top-right-radius: 0;
+    border-top-left-radius: 0
+}
+.panel > .list-group .list-group-item:last-child {
+    border-bottom: 0
+}
+.panel-heading+ .list-group .list-group-item:first-child {
+    border-top-width: 0
+}
+.panel > .table, .panel > .table-responsive {
+    margin-bottom: 0
+}
+.panel > .panel-body+ .table, .panel > .panel-body+ .table-responsive {
+    border-top: 1px solid #ddd
+}
+.panel > .table-bordered, .panel > .table-responsive > .table-bordered {
+    border: 0
+}
+.panel > .table-bordered > thead > tr > th:first-child, .panel > .table-responsive > .table-bordered > thead > tr > th:first-child, .panel > .table-bordered > tbody > tr > th:first-child, .panel > .table-responsive > .table-bordered > tbody > tr > th:first-child, .panel > .table-bordered > tfoot > tr > th:first-child, .panel > .table-responsive > .table-bordered > tfoot > tr > th:first-child, .panel > .table-bordered > thead > tr > td:first-child, .panel > .table-responsive > .table-bordered > thead > tr > td:first-child, .panel > .table-bordered > tbody > tr > td:first-child, .panel > .table-responsive > .table-bordered > tbody > tr > td:first-child, .panel > .table-bordered > tfoot > tr > td:first-child, .panel > .table-responsive > .table-bordered > tfoot > tr > td:first-child {
+    border-left: 0
+}
+.panel > .table-bordered > thead > tr > th:last-child, .panel > .table-responsive > .table-bordered > thead > tr > th:last-child, .panel > .table-bordered > tbody > tr > th:last-child, .panel > .table-responsive > .table-bordered > tbody > tr > th:last-child, .panel > .table-bordered > tfoot > tr > th:last-child, .panel > .table-responsive > .table-bordered > tfoot > tr > th:last-child, .panel > .table-bordered > thead > tr > td:last-child, .panel > .table-responsive > .table-bordered > thead > tr > td:last-child, .panel > .table-bordered > tbody > tr > td:last-child, .panel > .table-responsive > .table-bordered > tbody > tr > td:last-child, .panel > .table-bordered > tfoot > tr > td:last-child, .panel > .table-responsive > .table-bordered > tfoot > tr > td:last-child {
+    border-right: 0
+}
+.panel > .table-bordered > thead > tr:last-child > th, .panel > .table-responsive > .table-bordered > thead > tr:last-child > th, .panel > .table-bordered > tbody > tr:last-child > th, .panel > .table-responsive > .table-bordered > tbody > tr:last-child > th, .panel > .table-bordered > tfoot > tr:last-child > th, .panel > .table-responsive > .table-bordered > tfoot > tr:last-child > th, .panel > .table-bordered > thead > tr:last-child > td, .panel > .table-responsive > .table-bordered > thead > tr:last-child > td, .panel > .table-bordered > tbody > tr:last-child > td, .panel > .table-responsive > .table-bordered > tbody > tr:last-child > td, .panel > .table-bordered > tfoot > tr:last-child > td, .panel > .table-responsive > .table-bordered > tfoot > tr:last-child > td {
+    border-bottom: 0
+}
+.panel-heading {
+    font-family: LiberationSansRegular, arial, sans-serif !important;
+    font-size: 9pt !important;
+    padding: 5px 10px;
+    border-bottom: 1px solid transparent;
+
+}
+.panel-heading > .dropdown .dropdown-toggle {
+    color: inherit
+}
+.panel-title {
+    margin-top: 0;
+    margin-bottom: 0;
+    font-family: LiberationSansRegular, arial, sans-serif !important;
+    font-size: 9pt !important;
+}
+.panel-title > a {
+    color: #000;
+}
+.panel-footer {
+    padding: 10px 15px;
+    background-color: #f5f5f5;
+    border-top: 1px solid #ddd;
+
+}
+.panel-group .panel {
+    margin-bottom: 0;
+    overflow: hidden;
+
+}
+.panel-group .panel+ .panel {
+    margin-top: 5px
+}
+.panel-group .panel-heading {
+    border-bottom: 0
+}
+.panel-group .panel-heading+ .panel-collapse .panel-body {
+    border-top: 1px solid #ddd
+}
+.panel-group .panel-footer {
+    border-top: 0
+}
+.panel-group .panel-footer+ .panel-collapse .panel-body {
+    border-bottom: 1px solid #ddd
+}
+.panel-default {
+    border-color: #ddd
+}
+.panel-default > .panel-heading {
+    color: #333;
+    background-color: #f5f5f5;
+    border-color: #ddd
+}
+.panel-default > .panel-heading+ .panel-collapse .panel-body {
+    border-top-color: #ddd
+}
+.panel-default > .panel-heading > .dropdown .caret {
+    border-color: #333 transparent
+}
+.panel-default > .panel-footer+ .panel-collapse .panel-body {
+    border-bottom-color: #ddd
+}
+.panel-primary {
+    border-color: #428bca
+}
+.panel-primary > .panel-heading {
+    color: #fff;
+    background-color: #428bca;
+    border-color: #428bca
+}
+.panel-primary > .panel-heading+ .panel-collapse .panel-body {
+    border-top-color: #428bca
+}
+.panel-primary > .panel-heading > .dropdown .caret {
+    border-color: #fff transparent
+}
+.panel-primary > .panel-footer+ .panel-collapse .panel-body {
+    border-bottom-color: #428bca
+}
+.panel-success {
+    border-color: #d6e9c6
+}
+.panel-success > .panel-heading {
+    color: #468847;
+    background-color: #dff0d8;
+    border-color: #d6e9c6
+}
+.panel-success > .panel-heading+ .panel-collapse .panel-body {
+    border-top-color: #d6e9c6
+}
+.panel-success > .panel-heading > .dropdown .caret {
+    border-color: #468847 transparent
+}
+.panel-success > .panel-footer+ .panel-collapse .panel-body {
+    border-bottom-color: #d6e9c6
+}
+.panel-warning {
+    border-color: #faebcc
+}
+.panel-warning > .panel-heading {
+    color: #c09853;
+    background-color: #fcf8e3;
+    border-color: #faebcc
+}
+.panel-warning > .panel-heading+ .panel-collapse .panel-body {
+    border-top-color: #faebcc
+}
+.panel-warning > .panel-heading > .dropdown .caret {
+    border-color: #c09853 transparent
+}
+.panel-warning > .panel-footer+ .panel-collapse .panel-body {
+    border-bottom-color: #faebcc
+}
+.panel-danger {
+    border-color: #ebccd1
+}
+.panel-danger > .panel-heading {
+    color: #b94a48;
+    background-color: #f2dede;
+    border-color: #ebccd1
+}
+.panel-danger > .panel-heading+ .panel-collapse .panel-body {
+    border-top-color: #ebccd1
+}
+.panel-danger > .panel-heading > .dropdown .caret {
+    border-color: #b94a48 transparent
+}
+.panel-danger > .panel-footer+ .panel-collapse .panel-body {
+    border-bottom-color: #ebccd1
+}
+.panel-info {
+    border-color: #bce8f1
+}
+.panel-info > .panel-heading {
+    color: #3a87ad;
+    background-color: #d9edf7;
+    border-color: #bce8f1
+}
+.panel-info > .panel-heading+ .panel-collapse .panel-body {
+    border-top-color: #bce8f1
+}
+.panel-info > .panel-heading > .dropdown .caret {
+    border-color: #3a87ad transparent
+}
+.panel-info > .panel-footer+ .panel-collapse .panel-body {
+    border-bottom-color: #bce8f1
+}
+
+.contextMenuItems .divider {
+    height: 1px;
+    margin: 5px 0;
+    overflow: hidden;
+    background-color: #e5e5e5
+}
+
+/*----------------------------------------------------------------------------*/
+/* Tracked entity
+/*----------------------------------------------------------------------------*/
+
+.container-1-1 {
+    width: 100%;
+    float: left;
+    margin-top: 50px;
+    padding: 5px;
+}
+
+.container-1-2 {
+    width: 50%;
+    float: left;
+    position: relative;
+}
+
+.container-2-3 {
+    width: 75%;
+    float: left;
+    position: relative;
+}
+
+.container-1-4 {
+    width: 25%;
+    float: left;
+    position: relative;
+}
+
+.separator {
+    margin-bottom: 10px;
+}
+
+.dashboard-container {
+    margin-top: 50px;
+    padding-left: 5px;
+    position: relative;
+}
+
+.dashboard-element-container {
+    max-height: 250px !important;
+}
+
+.list-element {
+    position: relative;
+    display: block;
+    padding: 10px 15px;
+    margin-bottom: -1px;
+    background-color: #fff;
+    border: 1px solid #ddd;
+    margin-left: -16px;
+    margin-right: -16px;
+}
+
+.list-element:first-child {
+    margin-top: -15px;
+    border-top: none;
+}
+
+.list-element:last-child {
+    margin-bottom: -15px;
+    border-bottom: none;
+}
+
+.list-title 
+{
+    font-size: 12pt;
+    font-weight: normal;
+    color: #606060;
+}
+
+.horizonal-spacing{
+    margin-left: 20px;    
+}
+
+.vertial-spacing{
+    margin-top: 10px;
+}
+
+/*
+*
+*/
+.panel-heading {
+    padding: 10px 10px;	
+}
+
+.panel-body {
+	padding: 15px
+}
+.panel-body:before, .panel-body:after {
+	display: table;
+	content: " "
+}
+.panel-body:after {
+	clear: both
+}
+.panel-body:before, .panel-body:after {
+	display: table;
+	content: " "
+}
+.panel-body:after {
+	clear: both
+}
\ No newline at end of file

=== added file 'dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/tracker-capture-appcache'
--- dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/tracker-capture-appcache	1970-01-01 00:00:00 +0000
+++ dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/tracker-capture-appcache	2014-03-17 15:59:31 +0000
@@ -0,0 +1,91 @@
+CACHE MANIFEST
+
+CACHE:
+../dhis-web-commons/javascripts/jquery/js/jquery-1.8.3.js
+../dhis-web-commons/javascripts/jquery/js/jquery-ui-1.9.2.custom.js
+../dhis-web-commons/javascripts/jquery/css/ui-lightness/jquery-ui-1.9.2.custom.css
+
+../dhis-web-commons/fonts/LiberationSans-Regular-webfont.eot
+../dhis-web-commons/fonts/LiberationSans-Regular-webfont.woff
+../dhis-web-commons/fonts/LiberationSans-Regular-webfont.ttf
+../dhis-web-commons/fonts/LiberationSans-Regular-webfont.svg
+../dhis-web-commons/fonts/LiberationSans-Bold-webfont.eot
+../dhis-web-commons/fonts/LiberationSans-Bold-webfont.woff
+../dhis-web-commons/fonts/LiberationSans-Bold-webfont.ttf
+../dhis-web-commons/fonts/LiberationSans-Bold-webfont.svg
+
+../dhis-web-commons/font-awesome/css/font-awesome.min.css
+../dhis-web-commons/font-awesome/fonts/fontawesome-webfont.eot
+../dhis-web-commons/font-awesome/fonts/fontawesome-webfont.svg
+../dhis-web-commons/font-awesome/fonts/fontawesome-webfont.ttf
+../dhis-web-commons/font-awesome/fonts/fontawesome-webfont.woff
+../dhis-web-commons/font-awesome/fonts/FontAwesome.otf
+
+../dhis-web-commons/css/light_blue/light_blue.css
+../dhis-web-commons/css/widgets.css
+styles/style.css
+
+../dhis-web-commons/javascripts/bootstrap/js/bootstrap.min.js
+
+../dhis-web-commons/javascripts/angular/angular.js
+../dhis-web-commons/javascripts/angular/angular-resource.js
+../dhis-web-commons/javascripts/angular/angular-route.js
+../dhis-web-commons/javascripts/angular/angular-cookies.js
+../dhis-web-commons/javascripts/angular/angular-animate.js        
+../dhis-web-commons/javascripts/angular/ui-bootstrap-tpls-0.10.0.js
+
+../dhis-web-commons/javascripts/angular/plugins/angularLocalStorage.js
+../dhis-web-commons/javascripts/angular/plugins/angular-translate.min.js
+../dhis-web-commons/javascripts/angular/plugins/angular-translate-loader-static-files.min.js
+../dhis-web-commons/javascripts/angular/plugins/angular-translate-loader-url.min.js
+
+../dhis-web-commons/javascripts/moment/moment-with-langs.min.js       
+
+../dhis-web-commons/css/light_blue/logo_banner.png
+../images/ajax-loader-bar.gif
+../images/colapse.png
+../images/expand.png
+../images/transparent.gif
+../images/treeview-gray-line.gif
+
+../dhis-web-commons/javascripts/underscore.min.js
+../dhis-web-commons/javascripts/dhis2/dhis2.util.js
+../dhis-web-commons/javascripts/commons.js
+../dhis-web-commons/javascripts/commons.ajax.js
+../dhis-web-commons/javascripts/lists.js
+../dhis-web-commons/javascripts/periodType.js
+../dhis-web-commons/javascripts/date.js
+../dhis-web-commons/javascripts/json2.js
+../dhis-web-commons/javascripts/validationRules.js
+../dhis-web-commons/javascripts/dhis2/dhis2.array.js
+../dhis-web-commons/javascripts/dhis2/dhis2.select.js
+../dhis-web-commons/javascripts/dhis2/dhis2.comparator.js
+../dhis-web-commons/javascripts/dhis2/dhis2.availability.js
+../dhis-web-commons/javascripts/dhis2/dhis2.trigger.js
+../dhis-web-commons/javascripts/dhis2/dhis2.sharing.js
+../dhis-web-commons/javascripts/dhis2/dhis2.validation.js
+../dhis-web-commons/javascripts/dhis2/dhis2.storage.ss.js
+../dhis-web-commons/javascripts/dhis2/dhis2.storage.ls.js
+../dhis-web-commons/javascripts/dhis2/dhis2.storage.idb.js
+../dhis-web-commons/javascripts/dhis2/dhis2.storage.memory.js
+../dhis-web-commons/javascripts/dhis2/dhis2.storage.js
+../dhis-web-commons/javascripts/dhis2/dhis2.contextmenu.js
+../dhis-web-commons/javascripts/dhis2/dhis2.appcache.js
+../dhis-web-commons/ouwt/ouwt.js
+
+scripts/event-capture.js  
+scripts/app.js
+scripts/services.js
+scripts/directives.js
+scripts/controllers.js
+scripts/filters.js
+
+
+views/pagination.html
+views/modal.html
+views/dialog.html
+
+i18n/en.json
+
+NETWORK:
+*
\ No newline at end of file

=== added directory 'dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/views'
=== added file 'dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/views/dashboard.html'
--- dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/views/dashboard.html	1970-01-01 00:00:00 +0000
+++ dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/views/dashboard.html	2014-03-17 15:59:31 +0000
@@ -0,0 +1,129 @@
+<link rel="stylesheet" type="text/css" href="lib/bootstrap/css/bootstrap.min.css">
+
+<div class="container-1-1">
+
+    <div class="col-xs-12">
+        <div class="btn-toolbar" role="toolbar">
+            <button type="button" class="btn btn-default" ng-click="back()">{{'back'| translate}}</button>
+            <span class="horizonal-spacing">
+                <input type="text" placeholder="{{'search_for_dashboard'| translate}}" />
+                <button type="button" class="btn btn-default" ng-click="searchDashboard()">{{'search'| translate}}</button>
+            </span>
+
+            <!--<button type="button" class="btn btn-default" ng-click="remove()">{{'remove'| translate }} {{selectedProgram.trackedEntity.name|| 'entity' | translate}}</button>-->
+        </div>
+    </div>
+
+    <div class='clearfix separator'></div>
+
+    <div class='col-xs-12'>
+        <div class="row">
+            <div class="col-sm-3 col-md-3"> 
+                <accordion>
+                    <accordion-group is-open="{{selected.isOpen}}">
+                        <accordion-heading>
+                            <span class="list-title">{{selected.title| translate}}</span>
+                        </accordion-heading>
+                        <div class="list-element-container">
+                            <div class="list-element" ng-repeat="selection in selected.selections"> 
+                                {{selection.title| translate}}
+                                <span class="right">
+                                    {{selection.value| translate}}
+                                </span>
+                            </div>
+                        </div>
+                    </accordion-group>
+                </accordion>                
+            </div>
+            <div class="col-sm-3 col-md-3">
+                <accordion>
+                    <accordion-group is-open="{{profile.isOpen}}">
+                        <accordion-heading>
+                            <span class="list-title"> {{selectedProgram.trackedEntity.name|| 'entity' | translate}} {{profile.title| translate}}</span>
+                        </accordion-heading>
+                        <div>
+                            <div class="list-element" ng-repeat="attribute in selectedEntity.attributes">
+                                {{attribute.displayName}}
+                                <div class="right">
+                                    <div ng-switch="attribute.type">
+                                        <div ng-switch-when="date">
+                                            <input type="text" ng-date ng-model="attribute.value" value="attribute.value | date:'yyyy-MM-dd"/>
+                                        </div>
+                                        <div ng-switch-when="trueOnly">
+                                            <input type="checkbox" ng-model="attribute.value" />
+                                        </div>
+                                        <div ng-switch-when="bool">
+                                            <select ng-model="attribute.value" />
+                                            <option value="">{{'please_select'| translate}}</option>                        
+                                            <option value="0">{{'no'| translate}}</option>
+                                            <option value="1">{{'yes'| translate}}</option>
+                                            </select>
+                                        </div>
+                                        <div ng-switch-when="combo">
+                                            <input type="text" 
+                                                   ng-model="attribute.value"                                                 
+                                                   typeahead="option.name for option in attributes[attribute.attribute].personAttributeOptions | filter:$viewValue | limitTo:20" 
+                                                   typeahead-open-on-focus 
+                                                   />
+                                        </div>
+                                        <div ng-switch-when="number">
+                                            <input type="number" ng-model="attribute.value" />
+                                        </div>
+                                        <div ng-switch-default>
+                                            <input type="text" ng-model="attribute.value" />                                        
+                                        </div>
+                                    </div>                                                                                                    
+                                </div>
+                            </div>
+                        </div>                        
+                    </accordion-group>
+                </accordion>                
+            </div>
+            <div class="col-sm-3 col-md-3">
+                <accordion>
+                    <accordion-group is-open="{{enrollment.isOpen}}">
+                        <accordion-heading>
+                            <span class="list-title">{{enrollment.title| translate}}</span>
+                        </accordion-heading>                        
+                        <div class="list-element-container">
+                            <div class="list-element"> 
+                                {{'program'| translate}}
+                                <span class="right">
+                                    <select ng-model="selectedProgram" 
+                                            ng-options="program as program.name for program in programs | orderBy: 'name'" 
+                                            ng-change="showEnrollment()">
+                                        <option value="">{{'please_select'| translate}}</option>
+                                    </select>
+                                </span>
+                            </div>                            
+                        </div>                        
+                    </accordion-group>
+                </accordion>                
+            </div>
+            <div class="col-sm-3 col-md-3">
+                <accordion>
+                    <accordion-group is-open="{{notes.isOpen}}">
+                        <accordion-heading>
+                            <span class="list-title">{{notes.title| translate}}</span>
+                        </accordion-heading>                        
+                        This is notes.
+                    </accordion-group>
+                </accordion>               
+            </div>
+        </div>
+    </div>
+
+    <div class='separator'></div>
+
+    <div class="col-xs-12">
+        <accordion>
+            <accordion-group is-open="{{dataEntry.isOpen}}">
+                <accordion-heading>
+                    <span class="list-title">{{dataEntry.title| translate}}</span>
+                </accordion-heading>                        
+                This is data entry.
+            </accordion-group>
+        </accordion>
+    </div> 
+
+</div>
\ No newline at end of file

=== added file 'dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/views/dialog.html'
--- dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/views/dialog.html	1970-01-01 00:00:00 +0000
+++ dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/views/dialog.html	2014-03-17 15:59:31 +0000
@@ -0,0 +1,10 @@
+<div class="modal-header">
+    <h2>{{dialogOptions.headerText| translate}}</h2>
+</div>
+<div class="modal-body">
+    <p>{{dialogOptions.bodyText| translate}}</p>
+</div>
+
+<div class="modal-footer">
+    <button class="big-button grey" data-ng-click="dialogOptions.ok();">{{dialogOptions.closeButtonText| translate}}</button>
+</div>
\ No newline at end of file

=== added file 'dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/views/modal.html'
--- dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/views/modal.html	1970-01-01 00:00:00 +0000
+++ dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/views/modal.html	2014-03-17 15:59:31 +0000
@@ -0,0 +1,10 @@
+<div class="modal-header">
+  <h3>{{modalOptions.headerText | translate}}</h3>
+</div>
+<div class="modal-body">
+  <p>{{modalOptions.bodyText | translate}}</p>
+</div>
+<div class="modal-footer">
+  <button data-ng-click="modalOptions.close()">{{modalOptions.closeButtonText | translate}}</button>
+  <button data-ng-click="modalOptions.ok();">{{modalOptions.actionButtonText | translate}}</button>
+</div>
\ No newline at end of file

=== added file 'dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/views/pagination.html'
--- dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/views/pagination.html	1970-01-01 00:00:00 +0000
+++ dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/views/pagination.html	2014-03-17 15:59:31 +0000
@@ -0,0 +1,53 @@
+<div class="paging-container">
+    <table style="background-color: #ebf0f6;" width='100%'>
+        <tr>
+            <td>
+                {{'total_number_of_pages'| translate}}: {{paginator.pageCount()}}
+            </td>
+            <td>
+                <span>{{'rows_per_page'| translate}}:</span> <input type="text" style="width:50px;" ng-model="rowsPerPage"> 
+            </td>
+            <td>
+                <span>{{'jump_to_page'| translate}}:</span> <input type="text" style="width:50px;" ng-model="currentPage" value="{{paginator.page + 1}}" ng-blur="jumpToPage(currentPage)"> 
+            </td>
+        </tr>
+        <tr>
+            <td colspan="3"><hr/></td>
+        </tr>
+        <tr>
+            <td colspan="3">
+                <div class="paging">
+                    <span ng-show="(paginator.getPage() + 1) > 1">
+                        <a href ng-click="paginator.firstPage()" title="{{'first'| translate}}"> 
+                            &laquo;&laquo;
+                        </a>
+                        <a href ng-click="paginator.perviousPage()" title="{{'previous'| translate}}"> 
+                            &laquo;
+                        </a>                    
+                    </span>
+                    <span ng-hide="(paginator.getPage() + 1) > 1">
+                        <span title="{{'first'| translate}}">&laquo;&laquo;</span>
+                        <span title="{{'previous'| translate}}">&laquo;</span>
+                    </span>
+                    <a href ng-click="paginator.setPage(i)" title="{{'page'| translate}} {{i + 1}}" ng-repeat="i in []| forLoop:paginator.lowerLimit():paginator.pageCount() | limitTo : paginator.limitPerPage" ng-class="paginator.getPage() == i && 'active'">
+                        {{i + 1}}
+                    </a>
+
+                    <span ng-show="(paginator.getPage() + 1) < paginator.pageCount()">
+                        <a href ng-click="paginator.nextPage()" title="{{'next'| translate}}" > 
+                            &raquo;
+                        </a>
+                        <a href ng-click="paginator.lastPage()" title="{{'last'| translate}}"> 
+                            &raquo;&raquo;
+                        </a>
+                    </span>
+                    <span ng-hide="(paginator.getPage() + 1) < paginator.pageCount()">
+                        <span class="next" title="{{'next'| translate}}">&raquo; </span>
+                        <span class="last" title="{{'last'| translate}}">&raquo;&raquo;</span>
+                    </span>
+
+                </div>
+            </td>
+        </tr>
+    </table>   
+</div>
\ No newline at end of file

=== added file 'dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/views/search.html'
--- dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/views/search.html	1970-01-01 00:00:00 +0000
+++ dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/views/search.html	2014-03-17 15:59:31 +0000
@@ -0,0 +1,48 @@
+<accordion>
+    <accordion-group is-open="searchField.isOpen">
+        <accordion-heading>
+            {{searchField.label| translate}}
+            <span class="right">
+                <a href ng-click="closeSearch()" title="{{'close'| translate}}"><span class="black"><i class="fa fa-times"></i></span></a>
+            </span>
+        </accordion-heading>
+        <table>
+            <tr ng-repeat="attribute in attributes">
+                <td>
+                    {{attribute.name}}
+                </td>
+                <td>
+                    <div ng-switch="attribute.valueType">
+                        <div ng-switch-when="date">
+                            <input type="text" ng-date ng-model="attribute.value" />
+                        </div>
+                        <div ng-switch-when="trueOnly">
+                            <input type="checkbox" ng-model="attribute.value" />
+                        </div>
+                        <div ng-switch-when="bool">
+                            <select ng-model="attribute.value" />
+                            <option value="">{{'please_select'| translate}}</option>                        
+                            <option value="0">{{'no'| translate}}</option>
+                            <option value="1">{{'yes'| translate}}</option>
+                            </select>
+                        </div>
+                        <div ng-switch-when="combo">
+                            <input type="text" 
+                                   ng-model="attribute.value"                                                 
+                                   typeahead="option.name for option in attribute.personAttributeOptions | filter:$viewValue | limitTo:20" 
+                                   typeahead-open-on-focus 
+                                   />
+                        </div>
+                        <div ng-switch-when="number">
+                            <input type="number" ng-model="attribute.value" />
+                        </div>
+                        <div ng-switch-default>
+                            <input type="text" ng-model="attribute.value" />                                        
+                        </div>
+                    </div>                                                                
+                </td>
+            </tr>
+        </table>
+        <button ng-click="search()">{{'search'| translate}}</button>
+    </accordion-group>
+</accordion>                    
\ No newline at end of file

=== added file 'dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/views/selection.html'
--- dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/views/selection.html	1970-01-01 00:00:00 +0000
+++ dhis-2/dhis-web/dhis-web-tracker-capture/src/main/webapp/dhis-web-tracker-capture/views/selection.html	2014-03-17 15:59:31 +0000
@@ -0,0 +1,204 @@
+<script src="../dhis-web-commons/ouwt/ouwt.js"></script>
+<script src="scripts/tracker-capture.js"></script>
+
+<div id="leftBar">
+    <br/>
+    <br/>
+    <div id="orgUnitTree">
+        <ul>
+        </ul>
+    </div>
+    <img id="ouwt_loader" src="../images/ajax-loader-bar.gif"/>
+</div>
+<div class="page" id="mainPage">
+    <h1>
+        <span ng-show="!selectedProgram">
+            {{'search'| translate}} {{selectedProgram.trackedEntity.name}}
+        </span>
+        <span ng-show="selectedProgram">
+            {{'search_for'| translate}} {{selectedProgram.trackedEntity.name}}
+        </span>            
+        <a href ng-click="getHelpContent()" title="{{'help'| translate}}"><i class="fa fa-question-circle"></i></a>
+    </h1>
+
+    <!-- selection begins-->
+    <div>
+        <table>
+            <tr>
+                <td><label>{{'registering_unit'| translate}}</label></td>
+                <td><input type="text" selected-org-unit ng-model="selectedOrgUnit.name" value="{{selectedOrgUnit.name|| 'please_select'| translate}}" disabled=""></td>                           
+            </tr>
+            <tr>
+                <td><label>{{'program'| translate}}<em title="{{'required'| translate}}" class="required">*</em></label></td>
+                <td>
+                    <select id="programId" 
+                            name="programId" 
+                            ng-model="selectedProgram" 
+                            ng-options="program as program.name for program in programs | orderBy: 'name'" 
+                            ng-change="clearEntities()"
+                            ng-disabled="!selectedOrgUnit">
+                        <option value="">{{'view_all'| translate}}</option>
+                    </select>      
+                </td>
+                <td style='padding-left: 5px;'>
+                    <button class="button"
+                            ng-show="selectedOrgUnit" 
+                            ng-click="loadTrackedEntities()">
+                        {{'list_all_entities'| translate}}
+                    </button>  
+                </td>                
+                <td style='padding-left: 5px;'>
+                    <button class="button"
+                            ng-disabled="!selectedOrgUnit" 
+                            ng-click="showRegisteration()">
+                        {{'add_new'| translate}}
+                    </button>                                
+                </td>
+            </tr>                       
+        </table>                    
+    </div>                
+    <!-- selection ends -->   
+
+    <!-- search begins -->
+    <div style="width: 30%;">
+        <accordion>
+            <accordion>
+                <accordion-group is-open="{{searchField.isOpen}}">
+                    <accordion-heading>
+                        {{searchField.title| translate}}
+                    </accordion-heading>
+                    <div>
+                        <div class="list-element" ng-repeat="attribute in attributes">
+                            {{attribute.name}}
+                            <div class="right">
+                                <div ng-switch="attribute.valueType">
+                                    <div ng-switch-when="date">
+                                        <input type="text" ng-date ng-model="attribute.value" />
+                                    </div>
+                                    <div ng-switch-when="trueOnly">
+                                        <input type="checkbox" ng-model="attribute.value" />
+                                    </div>
+                                    <div ng-switch-when="bool">
+                                        <select ng-model="attribute.value" />
+                                        <option value="">{{'please_select'| translate}}</option>                        
+                                        <option value="0">{{'no'| translate}}</option>
+                                        <option value="1">{{'yes'| translate}}</option>
+                                        </select>
+                                    </div>
+                                    <div ng-switch-when="combo">
+                                        <input type="text" 
+                                               ng-model="attribute.value"                                                 
+                                               typeahead="option.name for option in attribute.personAttributeOptions | filter:$viewValue | limitTo:20" 
+                                               typeahead-open-on-focus 
+                                               />
+                                    </div>
+                                    <div ng-switch-when="number">
+                                        <input type="number" ng-model="attribute.value"/>
+                                    </div>
+                                    <div ng-switch-default>
+                                        <input type="text" ng-model="attribute.value" />                                        
+                                    </div>
+                                </div>                                                                                                    
+                            </div>
+                        </div>
+                        
+                        <div class="vertial-spacing">
+                            <button ng-click="search()">{{'search'| translate}}</button>
+                        </div>
+                    </div>                        
+                </accordion-group>
+            </accordion>                
+        </accordion>                	
+    </div>
+    <!-- search ends -->
+
+    <!-- entity grid begins -->
+    <div id="listDiv" ng-switch="trackedEntityList">                    
+        <div ng-switch-when=""></div>
+        <div ng-switch-default>
+            <h2>
+                {{selectedProgram.trackedEntity.name || 'entity' | translate}} {{'list'| translate}}
+            </h2>
+            <div ng-switch="trackedEntityList.length">
+                <div ng-switch-when="undefined">
+                    <p>
+                        {{'empty'| translate}} {{selectedProgram.trackedEntity.name || 'entity' | translate}} {{'list'| translate}}                        
+                    </p>
+                </div>
+                <div ng-switch-when="0">
+                    <p>
+                        {{'empty'| translate}} {{selectedProgram.trackedEntity.name || 'entity' | translate}} {{'list'| translate}}
+                    </p>
+                </div>
+                <div ng-switch-default>
+
+                    <!-- entity begins -->
+                    <table class="listTable dhis2-table-striped-border dhis2-table-hover">                    
+                        <thead>                        
+                            <tr>
+                                <th ng-show="!gridColumn.hide" 
+                                    class="max-column-width"                                                
+                                    ng-repeat="gridColumn in gridColumns">
+
+                                    <!-- sort icon begins -->
+                                    <span ng-hide="gridColumn.showFilter" class="bold" ng-click="sortGrid(gridColumn)">
+                                        <i ng-show="sortHeader == gridColumn.id && !reverse" class="fa fa-sort-desc"></i>
+                                        <i ng-show="sortHeader == gridColumn.id && reverse" class="fa fa-sort-asc"></i>
+                                        {{gridColumn.name}}
+                                    </span>
+                                    <!-- sort icon ends -->
+
+                                    <!-- filter icon begins -->
+                                    <span class='pull-right'>
+                                        <span ng-show="gridColumn.type !== 'date'">
+                                            <a href ng-click="filterInGrid(gridColumn)" title="{{'filter'| translate}}"><span ng-class="{true: 'filter-without-content', false: 'filter-with-content'} [filterText[gridColumn.id] == undefined || filterText[gridColumn.id] == '']"><i class="fa fa-filter"></i></span></a>
+                                        </span>
+                                        <span ng-show="gridColumn.type === 'date'">
+                                            <a href ng-click="filterInGrid(gridColumn)" title="{{'filter'| translate}}"><span ng-class="{true: 'filter-without-content', false: 'filter-with-content'} [(filterText[gridColumn.id].start == 'undefined' || filterText[gridColumn.id].start == '') && (filterText[gridColumn.id].end == 'undefined' || filterText[gridColumn.id].end == '')]"><i class="fa fa-filter"></i></span></a>
+                                        </span>                                                    
+                                    </span>
+                                    <!-- filter icon ends -->
+
+                                    <!-- filter input field begins -->
+                        <div ng-show="gridColumn.showFilter">
+                            <span ng-show="gridColumn.type !== 'date'">
+                                <input type="text" ng-model="filterText[gridColumn.id]" ng-blur="filterInGrid(gridColumn)">
+                            </span>                                                    
+                            <span ng-show="gridColumn.type === 'date'">
+                                <input placeholder="{{'start_date'| translate}}" type="text" ng-model="filterText[gridColumn.id].start" data-ng-date readonly="readonly">
+                                <span ng-hide="filterText[gridColumn.id].start == 'undefined' || filterText[gridColumn.id].start == ''">
+                                    <a href ng-click='removeStartFilterText(gridColumn.id)'><span class='black'><i class="fa fa-trash-o"></i></span></a>                                                        
+                                </span>
+                                <input placeholder="{{'end_date'| translate}}" type="text" ng-model="filterText[gridColumn.id].end" data-ng-date readonly="readonly">
+                                <span ng-hide="filterText[gridColumn.id].end == 'undefined' || filterText[gridColumn.id].end == ''">
+                                    <a href ng-click='removeEndFilterText(gridColumn.id)'><span class='black'><i class="fa fa-trash-o"></i></span></a>                                                        
+                                </span>
+                            </span>
+                        </div>
+                        <!-- filter input field ends -->
+                        </th>                                    
+                        </tr>                        
+                        </thead>
+                        <tbody id="list">
+                            <tr ng-repeat="trackedEntity in trackedEntityList| paginate:rowsPerPage | orderBy:sortHeader:reverse | gridFilter:filterText:currentFilter" 
+                                ng-click="showDashboard(trackedEntity)">
+
+                                <td class="max-column-width"                                              
+                                    ng-repeat="gridColumn in gridColumns">                                                
+                                    {{trackedEntity[gridColumn.id]}}                                                
+                                </td>
+
+                            </tr>
+                        </tbody>        
+                    </table>
+                    <paginator></paginator>
+                    <!-- entity ends -->                            
+                </div>
+            </div>                        
+        </div>
+
+    </div> 
+    <!-- entity grid ends -->
+</div>           
+
+

=== modified file 'dhis-2/dhis-web/pom.xml'
--- dhis-2/dhis-web/pom.xml	2014-03-02 03:01:49 +0000
+++ dhis-2/dhis-web/pom.xml	2014-03-17 15:59:31 +0000
@@ -25,10 +25,11 @@
     <module>dhis-web-mapping</module>
     <module>dhis-web-visualizer</module>
     <module>dhis-web-pivot</module>
+    <module>dhis-web-event-capture</module>
     <module>dhis-web-event-reports</module>
+    <module>dhis-web-tracker-capture</module>
     <module>dhis-web-dashboard-integration</module>
-    <module>dhis-web-caseentry</module>
-    <module>dhis-web-event-capture</module>
+    <module>dhis-web-caseentry</module>    
     <module>dhis-web-light</module>
     <module>dhis-web-mobile</module>
     <module>dhis-web-sms</module>