← Back to team overview

dhis2-devs team mailing list archive

[Branch ~dhis2-devs-core/dhis2/trunk] Rev 13046: implement context menus instead of icons in datadictionary-module, wip

 

------------------------------------------------------------
revno: 13046
committer: Morten Olav Hansen <mortenoh@xxxxxxxxx>
branch nick: dhis2
timestamp: Thu 2013-11-28 11:34:47 +0100
message:
  implement context menus instead of icons in datadictionary-module, wip
modified:
  dhis-2/dhis-web/dhis-web-commons-resources/src/main/webapp/dhis-web-commons/javascripts/commons.js
  dhis-2/dhis-web/dhis-web-commons-resources/src/main/webapp/dhis-web-commons/javascripts/dhis2/dhis2.contextmenu.js
  dhis-2/dhis-web/dhis-web-commons-resources/src/main/webapp/dhis-web-commons/javascripts/dhis2/dhis2.sharing.js
  dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-datadictionary/src/main/resources/struts.xml
  dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-datadictionary/src/main/webapp/dhis-web-maintenance-datadictionary/dataDictionary.vm
  dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-datadictionary/src/main/webapp/dhis-web-maintenance-datadictionary/dataElement.vm
  dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-datadictionary/src/main/webapp/dhis-web-maintenance-datadictionary/dataElementGroup.vm
  dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-datadictionary/src/main/webapp/dhis-web-maintenance-datadictionary/dataElementGroupSet.vm
  dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-datadictionary/src/main/webapp/dhis-web-maintenance-datadictionary/indicator.vm
  dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-datadictionary/src/main/webapp/dhis-web-maintenance-datadictionary/indicatorGroup.vm
  dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-datadictionary/src/main/webapp/dhis-web-maintenance-datadictionary/indicatorGroupSet.vm
  dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-datadictionary/src/main/webapp/dhis-web-maintenance-datadictionary/indicatorType.vm
  dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-datadictionary/src/main/webapp/dhis-web-maintenance-datadictionary/javascript/category.js
  dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-datadictionary/src/main/webapp/dhis-web-maintenance-datadictionary/javascript/categoryCombo.js
  dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-datadictionary/src/main/webapp/dhis-web-maintenance-datadictionary/javascript/dataDictionary.js
  dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-datadictionary/src/main/webapp/dhis-web-maintenance-datadictionary/javascript/dataElement.js
  dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-datadictionary/src/main/webapp/dhis-web-maintenance-datadictionary/javascript/dataElementGroup.js
  dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-datadictionary/src/main/webapp/dhis-web-maintenance-datadictionary/javascript/dataElementGroupSet.js
  dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-datadictionary/src/main/webapp/dhis-web-maintenance-datadictionary/javascript/indicator.js
  dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-datadictionary/src/main/webapp/dhis-web-maintenance-datadictionary/javascript/indicatorGroup.js
  dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-datadictionary/src/main/webapp/dhis-web-maintenance-datadictionary/javascript/indicatorGroupSet.js
  dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-datadictionary/src/main/webapp/dhis-web-maintenance-datadictionary/multidimensional/category.vm
  dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-datadictionary/src/main/webapp/dhis-web-maintenance-datadictionary/multidimensional/categoryCombo.vm
  dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-datadictionary/src/main/webapp/dhis-web-maintenance-datadictionary/multidimensional/categoryOption.vm
  dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-datadictionary/src/main/webapp/dhis-web-maintenance-datadictionary/multidimensional/concept.vm


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

Your team DHIS 2 developers is subscribed to branch lp:dhis2.
To unsubscribe from this branch go to https://code.launchpad.net/~dhis2-devs-core/dhis2/trunk/+edit-subscription
=== modified file 'dhis-2/dhis-web/dhis-web-commons-resources/src/main/webapp/dhis-web-commons/javascripts/commons.js'
--- dhis-2/dhis-web/dhis-web-commons-resources/src/main/webapp/dhis-web-commons/javascripts/commons.js	2013-11-20 14:47:27 +0000
+++ dhis-2/dhis-web/dhis-web-commons-resources/src/main/webapp/dhis-web-commons/javascripts/commons.js	2013-11-28 10:34:47 +0000
@@ -83,7 +83,16 @@
 
 /**
  * Redirects to the translate GUI.
- * 
+ *
+ * @param context Context vars from context menu
+ */
+function translateWithContext( context ) {
+  translate( context.type, context.id );
+}
+
+/**
+ * Redirects to the translate GUI.
+ *
  * @param className the name of the object class.
  * @param objectId the identifier of the object.
  */

=== modified file 'dhis-2/dhis-web/dhis-web-commons-resources/src/main/webapp/dhis-web-commons/javascripts/dhis2/dhis2.contextmenu.js'
--- dhis-2/dhis-web/dhis-web-commons-resources/src/main/webapp/dhis-web-commons/javascripts/dhis2/dhis2.contextmenu.js	2013-11-27 17:34:02 +0000
+++ dhis-2/dhis-web/dhis-web-commons-resources/src/main/webapp/dhis-web-commons/javascripts/dhis2/dhis2.contextmenu.js	2013-11-28 10:34:47 +0000
@@ -49,7 +49,7 @@
   listId: 'list',
   menuId: 'menu',
   menuItemActiveClass: 'menuItemActive',
-  listItemProps: ['id', 'uid', 'name'],
+  listItemProps: ['id', 'uid', 'name', 'type'],
   functionResolver: dhis2.contextmenu.utils.findFnInWindowScope
 };
 

=== modified file 'dhis-2/dhis-web/dhis-web-commons-resources/src/main/webapp/dhis-web-commons/javascripts/dhis2/dhis2.sharing.js'
--- dhis-2/dhis-web/dhis-web-commons-resources/src/main/webapp/dhis-web-commons/javascripts/dhis2/dhis2.sharing.js	2013-08-13 13:44:04 +0000
+++ dhis-2/dhis-web/dhis-web-commons-resources/src/main/webapp/dhis-web-commons/javascripts/dhis2/dhis2.sharing.js	2013-11-28 10:34:47 +0000
@@ -140,6 +140,12 @@
     return v;
 }
 
+function showSharingDialogWithContext( context ) {
+  // context always give type which starts with UpperCase
+  var type = context.type.charAt(0).toLowerCase() + context.type.slice(1);
+  showSharingDialog( type, context.uid );
+}
+
 function showSharingDialog( type, uid ) {
     loadSharingSettings( type, uid ).done( function ( data ) {
         setPublicAccess( data.object.publicAccess );

=== modified file 'dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-datadictionary/src/main/resources/struts.xml'
--- dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-datadictionary/src/main/resources/struts.xml	2013-10-13 16:15:28 +0000
+++ dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-datadictionary/src/main/resources/struts.xml	2013-11-28 10:34:47 +0000
@@ -457,7 +457,6 @@
     <action name="showAddIndicatorTypeForm" class="org.hisp.dhis.dd.action.NoAction">
       <result name="success" type="velocity">/main.vm</result>
       <param name="page">/dhis-web-maintenance-datadictionary/addIndicatorTypeForm.vm</param>
-      <param name="javascripts">javascript/indicatorType.js</param>
       <param name="requiredAuthorities">F_INDICATORTYPE_ADD</param>
     </action>
 
@@ -469,7 +468,6 @@
     <action name="showUpdateIndicatorTypeForm" class="org.hisp.dhis.dd.action.indicatortype.GetIndicatorTypeAction">
       <result name="success" type="velocity">/main.vm</result>
       <param name="page">/dhis-web-maintenance-datadictionary/updateIndicatorTypeForm.vm</param>
-      <param name="javascripts">javascript/indicatorType.js</param>
       <param name="requiredAuthorities">F_INDICATORTYPE_ADD</param>
     </action>
 

=== modified file 'dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-datadictionary/src/main/webapp/dhis-web-maintenance-datadictionary/dataDictionary.vm'
--- dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-datadictionary/src/main/webapp/dhis-web-maintenance-datadictionary/dataDictionary.vm	2013-06-29 14:16:34 +0000
+++ dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-datadictionary/src/main/webapp/dhis-web-maintenance-datadictionary/dataDictionary.vm	2013-11-28 10:34:47 +0000
@@ -14,6 +14,16 @@
 
 <h3>$i18n.getString( "data_dictionary_management" ) #openHelp( "dataDictionary" )</h3>
 
+<div id="contextMenu" class="contextMenu">
+  <ul id="contextMenuItems" class="contextMenuItems">
+    #if( $security.canManage( $dataDictionary ) )<li><a data-target-fn="showSharingDialogWithContext" href="#">$i18n.getString( "sharing_settings" )</a></li>#end
+    #if( $security.canUpdate( $dataDictionary ) )<li><a data-target-fn="showUpdateDataDictionaryForm" href="#">$i18n.getString( "edit" )</a></li>#end
+    #if( $security.canUpdate( $dataDictionary ) )<li><a data-target-fn="translateWithContext" href="#">$i18n.getString( "translation_translate" )</a></li>#end
+    #if( $security.canDelete( $dataDictionary ) )<li><a data-target-fn="removeDataDictionary" href="#">$i18n.getString( "remove" )</a></li>#end
+    <li><a data-target-fn="showDataDictionaryDetails" href="#">$i18n.getString( "show_details" )</a></li>
+  </ul>
+</div>
+
 <table class="mainPageTable">
 	<tr>
 		<td style="vertical-align:top">
@@ -24,49 +34,18 @@
 				</tr>
 			</table>
 			<table class="listTable" id="listTable">
-				<col/>
-				<col width="145px"/>
-                <thead>			
+        <thead>
 				<tr>
 					<th>$i18n.getString( "name" )</th>
-					<th class="{sorter: false}">$i18n.getString( "operations" )</th>
 				</tr>
-                </thead>
+        </thead>
 				<tbody id="list">
 				#foreach( $dataDictionary in $dataDictionaries )
-
-				<tr id="tr${dataDictionary.id}">
-					<td onclick="showDataDictionaryDetails( $dataDictionary.id )">$encoder.htmlEncode( $dataDictionary.name )</td>
-					<td style="text-align:right">
-
-                        #if ( $security.canManage( $dataDictionary ) )
-                        <a href="javascript:showSharingDialog('dataDictionary', '$dataDictionary.uid');" title="$i18n.getString( 'sharing_settings' )"><img src="../images/relationship.png" alt="$i18n.getString( 'sharing_settings' )"></a>
-                        #else
-                        <img src="../images/relationship-denied.png">
-                        #end
-
-                        #if( $security.canUpdate( $dataDictionary ) )
-                        <a href="showUpdateDataDictionaryForm.action?id=$dataDictionary.id" title="$i18n.getString( 'edit' )"><img src="../images/edit.png" alt="$i18n.getString( 'edit' )"/></a>
-                        #else
-                        <img src="../images/edit-denied.png">
-                        #end
-
-                        #if( $security.canUpdate( $dataDictionary ) )
-                        <a href="javascript:translate( 'DataDictionary', '$dataDictionary.id' )"><img src="../images/i18n.png" alt="$i18n.getString( 'translation_translate' )"/></a>
-                        #else
-                        <img src="../images/i18n-denied.png">
-                        #end
-
-                        #if( $security.canDelete( $dataDictionary ) )
-                        <a href="javascript:removeDataDictionary( $dataDictionary.id, '$encoder.jsEncode( $dataDictionary.name )' )" title="$i18n.getString( 'remove' )"><img src="../images/delete.png" alt="$i18n.getString( 'remove' )"/></a>
-                        #else
-                        <img src="../images/delete-denied.png">
-                        #end
-
-						<a href="javascript:showDataDictionaryDetails( $dataDictionary.id )" title="$i18n.getString( 'show_details' )"><img src="../images/information.png" alt="$i18n.getString( 'show_details' )"/></a>
-					</td>
+				<tr id="tr${dataDictionary.id}" style="height: 40px;">
+          <td data-id="$!dataDictionary.id" data-uid="$!dataDictionary.uid" data-type="DataDictionary" data-name="$encoder.htmlEncode( $!dataDictionary.displayName )">
+            $encoder.htmlEncode( $!dataDictionary.displayName )
+          </td>
 				</tr>
-
 				#end
 				</tbody>
 			</table>
@@ -74,8 +53,8 @@
 			#parse( "/dhis-web-commons/paging/paging.vm" )
 
 		</td>
+
 		<td id="detailsData">
-
 			<div id="detailsArea">
 				<div id="hideDetailsArea">
 					<a href="javascript:hideDetails()" title="$i18n.getString( 'hide_details' )"><img src="../images/hide.png" alt="$i18n.getString( 'hide_details' )"/></a>
@@ -85,12 +64,12 @@
 				<p><label>$i18n.getString( "region" ):</label><br/><span id="regionField"></span></p>				
 			</div>
 
-            <div id="warningArea" style="position:fixed;right:10px;top:200px;display:none">
-                <div id="hideDetailsArea">
-                    <a href="javascript:hideWarning()" title="$i18n.getString( 'hide_warning' )"><img src="../images/close.png" alt="$i18n.getString( 'hide_warning' )"/></a>
-                </div>
-                <p><span id="warningField"></span></p>
-            </div>
+      <div id="warningArea" style="position:fixed;right:10px;top:200px;display:none">
+        <div id="hideDetailsArea">
+          <a href="javascript:hideWarning()" title="$i18n.getString( 'hide_warning' )"><img src="../images/close.png" alt="$i18n.getString( 'hide_warning' )"/></a>
+        </div>
+        <p><span id="warningField"></span></p>
+      </div>
 			
 		</td>
 	</tr>

=== modified file 'dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-datadictionary/src/main/webapp/dhis-web-maintenance-datadictionary/dataElement.vm'
--- dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-datadictionary/src/main/webapp/dhis-web-maintenance-datadictionary/dataElement.vm	2013-11-21 09:39:43 +0000
+++ dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-datadictionary/src/main/webapp/dhis-web-maintenance-datadictionary/dataElement.vm	2013-11-28 10:34:47 +0000
@@ -30,6 +30,16 @@
 
 <h3>$i18n.getString( "data_element_management" ) #openHelp( "dataElement" )</h3>
 
+<div id="contextMenu" class="contextMenu">
+  <ul id="contextMenuItems" class="contextMenuItems">
+    #if( $security.canManage( $dataElement ) )<li><a data-target-fn="showSharingDialogWithContext" href="#">$i18n.getString( "sharing_settings" )</a></li>#end
+    #if( $security.canUpdate( $dataElement ) )<li><a data-target-fn="showUpdateDataElementForm" href="#">$i18n.getString( "edit" )</a></li>#end
+    #if( $security.canUpdate( $dataElement ) )<li><a data-target-fn="translateWithContext" href="#">$i18n.getString( "translation_translate" )</a></li>#end
+    #if( $security.canDelete( $dataElement ) )<li><a data-target-fn="removeDataElement" href="#">$i18n.getString( "remove" )</a></li>#end
+    <li><a data-target-fn="showDataElementDetails" href="#">$i18n.getString( "show_details" )</a></li>
+  </ul>
+</div>
+
 <table class="mainPageTable" >
 	<tr>
 		<td style="vertical-align:top">
@@ -53,50 +63,21 @@
 			</table>
 			<div id="content">
 			<table class="listTable" id="dataElementList">
-				<col/>				
-				<col width="145px"/>
-                <thead>
-					<tr>
-						<th>$i18n.getString( "name" )</th>
-						<th class="{sorter: false}">$i18n.getString( "operations" )</th>
-					</tr>
-				</thead>
-				<tbody id="list">
-				#foreach( $dataElement in $dataElements )
-				<tr id="tr${dataElement.id}">
-					<td onclick="showDataElementDetails( $dataElement.id )">$encoder.htmlEncode( $dataElement.displayName )</td>
-					<td style="text-align:right">
-
-                        #if ( $security.canManage( $dataElement ) )
-                        <a href="javascript:showSharingDialog('dataElement', '$dataElement.uid');" title="$i18n.getString( 'sharing_settings' )"><img src="../images/relationship.png" alt="$i18n.getString( 'sharing_settings' )"></a>
-                        #else
-                        <img src="../images/relationship-denied.png">
-                        #end
-
-                        #if( $security.canUpdate( $dataElement ) )
-                        <a href="showUpdateDataElementForm.action?id=$dataElement.id&update=true" title="$i18n.getString( 'edit' )"><img src="../images/edit.png" alt="$i18n.getString( 'edit' )"/></a>
-                        #else
-                        <img src="../images/edit-denied.png">
-                        #end
-
-                        #if( $security.canUpdate( $dataElement ) )
-                        <a href="javascript:translate( 'DataElement', '$dataElement.id' )" title="$i18n.getString( 'translation_translate' )"><img src="../images/i18n.png" alt="$i18n.getString( 'translation_translate' )"/></a>
-                        #else
-                        <img src="../images/edit-denied.png">
-                        #end
-
-                        #if( $security.canDelete( $dataElement ) )
-                        <a href="javascript:removeDataElement( $dataElement.id, '$encoder.jsEncode( $dataElement.displayName )' )" title="$i18n.getString( 'remove' )"><img src="../images/delete.png" alt="$i18n.getString( 'remove' )"/></a>
-                        #else
-                        <img src="../images/delete-denied.png">
-                        #end
-
-                        <a href="javascript:showDataElementDetails( $dataElement.id )" title="$i18n.getString( 'show_details' )"><img src="../images/information.png" alt="$i18n.getString( 'show_details' )"/></a>
-					</td>
-				</tr>
-				#end
-				</tbody>
-			</table>
+        <thead>
+        <tr>
+          <th>$i18n.getString( "name" )</th>
+        </tr>
+        </thead>
+        <tbody id="list">
+          #foreach( $dataElement in $dataElements )
+          <tr id="tr${dataElement.id}" style="height: 40px;">
+            <td data-id="$!dataElement.id" data-uid="$!dataElement.uid" data-type="DataElement" data-name="$encoder.htmlEncode( $!dataElement.displayName )">
+              $encoder.htmlEncode( $!dataElement.displayName )
+            </td>
+          </tr>
+          #end
+        </tbody>
+      </table>
 			<p></p>
 	  		#parse( "/dhis-web-commons/paging/paging.vm" )
 			</div>
@@ -117,16 +98,16 @@
 				<p><label>$i18n.getString( "aggregation_operator" ):</label><br/><span id="aggregationOperatorField"></span></p>                
 				<p><label>$i18n.getString( "category_combination" ):</label><br/><span id="categoryComboField"></span></p>
 				<p><label>$i18n.getString( "url" ):</label><br/><span id="urlField"></span></p>
-                <p><label>$i18n.getString( "last_updated" ):</label><br/><span id="lastUpdatedField"></span></p>
-                <p><label>$i18n.getString( "data_sets" ):</label><br/><span id="dataSetsField"></span></p>
+        <p><label>$i18n.getString( "last_updated" ):</label><br/><span id="lastUpdatedField"></span></p>
+        <p><label>$i18n.getString( "data_sets" ):</label><br/><span id="dataSetsField"></span></p>
 			</div>
 
-            <div id="warningArea">
-                <div id="hideDetailsArea">
-                    <a href="javascript:hideWarning()" title="$i18n.getString( 'hide_warning' )"><img src="../images/hide.png" alt="$i18n.getString( 'hide_warning' )"/></a>
-                </div>
-                <p><span id="warningField"></span></p>
-            </div>
+      <div id="warningArea">
+        <div id="hideDetailsArea">
+          <a href="javascript:hideWarning()" title="$i18n.getString( 'hide_warning' )"><img src="../images/hide.png" alt="$i18n.getString( 'hide_warning' )"/></a>
+        </div>
+        <p><span id="warningField"></span></p>
+      </div>
 
 		</td>
 	</tr>

=== modified file 'dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-datadictionary/src/main/webapp/dhis-web-maintenance-datadictionary/dataElementGroup.vm'
--- dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-datadictionary/src/main/webapp/dhis-web-maintenance-datadictionary/dataElementGroup.vm	2013-06-29 14:16:34 +0000
+++ dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-datadictionary/src/main/webapp/dhis-web-maintenance-datadictionary/dataElementGroup.vm	2013-11-28 10:34:47 +0000
@@ -1,18 +1,25 @@
 
-#* #sharingDialog() *#
-
 <script type="text/javascript">
 	jQuery(document).ready(function(){
 		tableSorter( 'dataElementGroupList' );	
 	});
 
-    var i18n_confirm_delete = '$encoder.jsEscape( $i18n.getString( "confirm_delete_data_element_group" ) , "'")';
+  var i18n_confirm_delete = '$encoder.jsEscape( $i18n.getString( "confirm_delete_data_element_group" ) , "'")';
 	var i18n_adding_data_element_group_failed = '$encoder.jsEscape( $i18n.getString( "adding_data_element_group_failed" ) , "'")';
 	var	i18n_saving_data_element_group_failed = '$encoder.jsEscape( $i18n.getString( "saving_data_element_group_failed" ) , "'")';
 </script>
 
 <h3>$i18n.getString( "data_element_group_management" ) #openHelp( "dataElementGroup" )</h3>
 
+<div id="contextMenu" class="contextMenu">
+  <ul id="contextMenuItems" class="contextMenuItems">
+    <li><a data-target-fn="showUpdateDataElementGroupForm" href="#">$i18n.getString( "edit" )</a></li>
+    <li><a data-target-fn="translateWithContext" href="#">$i18n.getString( "translation_translate" )</a></li>
+    <li><a data-target-fn="removeDataElementGroup" href="#">$i18n.getString( "remove" )</a></li>
+    <li><a data-target-fn="showDataElementGroupDetails" href="#">$i18n.getString( "show_details" )</a></li>
+  </ul>
+</div>
+
 <table class="mainPageTable">
 	<tr>
 		<td style="vertical-align:top">
@@ -24,51 +31,17 @@
 			</table>
 			<div id="content">
 			<table class="listTable" id="dataElementGroupList">			
-				<col/>
-				<col width="145px"/>
-				<thead>					
+				<thead>
 					<tr>
 						<th>$i18n.getString( "name" )</th>
-						<th class="{sorter: false}">$i18n.getString( "operations" )</th>
 					</tr>
 				</thead>
 				<tbody id="list">
 				#foreach( $dataElementGroup in $dataElementGroups )
-				<tr id="tr${dataElementGroup.id}">
-					<td onclick="showDataElementGroupDetails( $dataElementGroup.id )">$encoder.htmlEncode( $dataElementGroup.displayName )</td>
-					<td style="text-align:right">
-
-                        #* #if ( $security.canManage( $dataElementGroup ) )
-                        <a href="javascript:showSharingDialog('dataElementGroup', '$dataElementGroup.uid');"><img src="../images/relationship.png" alt="$i18n.getString( 'sharing_settings' )"></a>
-                        #else
-                        <img src="../images/relationship-denied.png">
-                        #end *#
-
-                        #* #if( $security.canUpdate( $dataElementGroup ) ) *#
-                        <a href="showUpdateDataElementGroupForm.action?id=$dataElementGroup.id" title="$i18n.getString( 'edit' )"><img src="../images/edit.png" alt="$i18n.getString( 'edit' )"/></a>
-                        #*
-                        #else
-                        <img src="../images/edit-denied.png">
-                        #end *#
-
-                        #* #if( $security.canUpdate( $dataElementGroup ) ) *#
-                        <a href="javascript:translate( 'DataElementGroup', '$dataElementGroup.id' )"><img src="../images/i18n.png" alt="$i18n.getString( 'translation_translate' )"/></a>
-                        #*
-                        #else
-                        <img src="../images/i18n-denied.png">
-                        #end
-                        *#
-
-                        #* #if( $security.canDelete( $dataElementGroup ) ) *#
-                        <a href="javascript:removeDataElementGroup( $dataElementGroup.id, '$encoder.jsEncode( $dataElementGroup.displayName )' )" title="$i18n.getString( 'remove' )"><img src="../images/delete.png" alt="$i18n.getString( 'remove' )"/></a>
-                        #* #else
-                        <img src="../images/delete-denied.png">
-                        #end
-                        *#
-
-						<a href="javascript:showDataElementGroupDetails( $dataElementGroup.id )" title="$i18n.getString( 'show_details' )"><img src="../images/information.png" alt="$i18n.getString( 'show_details' )"/></a>
-
-					</td>
+				<tr id="tr${dataElementGroup.id}" style="height: 40px;">
+          <td data-id="$!dataElementGroup.id" data-uid="$!dataElementGroup.uid" data-type="DataElementGroup" data-name="$encoder.htmlEncode( $!dataElementGroup.displayName )">
+            $encoder.htmlEncode( $!dataElementGroup.displayName )
+          </td>
 				</tr>
 				#end
 				</tbody>
@@ -77,8 +50,8 @@
 			#parse( "/dhis-web-commons/paging/paging.vm" )
 			</div>
 		</td>
+
 		<td id="detailsData">
-
 			<div id="detailsArea">
 				<div id="hideDetailsArea">
 					<a href="javascript:hideDetails()" title="$i18n.getString( 'hide_details' )"><img src="../images/hide.png" alt="$i18n.getString( 'hide_details' )"/></a>
@@ -90,11 +63,11 @@
 			</div>
 
 			<div id="warningArea">
-                <div id="hideDetailsArea">
-                    <a href="javascript:hideWarning()" title="$i18n.getString( 'hide_warning' )"><img src="../images/hide.png" alt="$i18n.getString( 'hide_warning' )"/></a>
-                </div>
-                <p><span id="warningField"></span></p>
-            </div>
+          <div id="hideDetailsArea">
+              <a href="javascript:hideWarning()" title="$i18n.getString( 'hide_warning' )"><img src="../images/hide.png" alt="$i18n.getString( 'hide_warning' )"/></a>
+          </div>
+          <p><span id="warningField"></span></p>
+      </div>
 			
 		</td>
 	</tr>

=== modified file 'dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-datadictionary/src/main/webapp/dhis-web-maintenance-datadictionary/dataElementGroupSet.vm'
--- dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-datadictionary/src/main/webapp/dhis-web-maintenance-datadictionary/dataElementGroupSet.vm	2013-06-29 14:16:34 +0000
+++ dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-datadictionary/src/main/webapp/dhis-web-maintenance-datadictionary/dataElementGroupSet.vm	2013-11-28 10:34:47 +0000
@@ -1,6 +1,4 @@
 
-#* #sharingDialog() *#
-
 <script type="text/javascript">
 	jQuery(document).ready(function(){
 		tableSorter( 'groupSetList' );	
@@ -14,61 +12,36 @@
 
 <h3>$i18n.getString( "data_element_group_set" ) #openHelp( "dataElementGroupSet" )</h3>
 
+<div id="contextMenu" class="contextMenu">
+  <ul id="contextMenuItems" class="contextMenuItems">
+    <li><a data-target-fn="showUpdateDataElementGroupSetForm" href="#">$i18n.getString( "edit" )</a></li>
+    <li><a data-target-fn="translateWithContext" href="#">$i18n.getString( "translation_translate" )</a></li>
+    <li><a data-target-fn="deleteDataElementGroupSet" href="#">$i18n.getString( "remove" )</a></li>
+    <li><a data-target-fn="showDataElementGroupSetDetails" href="#">$i18n.getString( "show_details" )</a></li>
+  </ul>
+</div>
+
 <table class="mainPageTable">
 	<tr>
 		<td style="vertical-align:top">
 			<table width="100%">
 				<tr>
-                    <td>#filterDiv( "dataElementGroupSet" )</td>
+          <td>#filterDiv( "dataElementGroupSet" )</td>
 					<td colspan="4" style="text-align:right"><input type="button" value="$i18n.getString( 'add_new' )" onclick="window.location='openAddDataElementGroupSet.action'"/></td>
 				</tr>
 			</table>
 			<table class="listTable" id="groupSetList">
-                <col/>              
-                <col width="145"/>
-                <thead>  
+        <thead>
 					<tr>
 						<th>$i18n.getString( "name" )</th>
-						<th colspan="4" class="{sorter: false}">$i18n.getString( "operations" )</th>
 					</tr>
 				</thead>
 				<tbody id="list">
 					#foreach( $dataElementGroupSet in $dataElementGroupSets )
-					<tr id="tr${dataElementGroupSet.id}">
-						<td onclick="showDataElementGroupSetDetails( $dataElementGroupSet.id )">$encoder.htmlEncode( $dataElementGroupSet.displayName )</td>
-						<td style="text-align:right">
-
-                            #* #if ( $security.canManage( $dataElementGroupSet ) )
-                            <a href="javascript:showSharingDialog('dataElementGroupSet', '$dataElementGroupSet.uid');"><img src="../images/relationship.png" alt="$i18n.getString( 'sharing_settings' )"></a>
-                            #else
-                            <img src="../images/relationship-denied.png">
-                            #end
-                            *#
-
-                            #* #if( $security.canUpdate( $dataElementGroupSet ) ) *#
-                            <a href="openUpdateDataElementGroupSet.action?id=$dataElementGroupSet.id" title="$i18n.getString( 'edit' )"><img src="../images/edit.png" alt="$i18n.getString( 'edit' )"/></a>
-                            #*
-                            #else
-                            <img src="../images/edit-denied.png">
-                            #end
-                             *#
-
-                            #* #if( $security.canUpdate( $dataElementGroupSet ) ) *#
-                            <a href="javascript:translate( 'DataElementGroupSet', '$dataElementGroupSet.id' )"><img src="../images/i18n.png" alt="$i18n.getString( 'translation_translate' )"/></a>
-                            #* #else
-                            <img src="../images/i18n-denied.png">
-                            #end *#
-
-                            #* #if( $security.canDelete( $dataElementGroupSet ) ) *#
-                            <a href="javascript:deleteDataElementGroupSet( $dataElementGroupSet.id, '$encoder.jsEncode( $dataElementGroupSet.displayName )' )" title="$i18n.getString( 'remove' )"><img src="../images/delete.png" alt="$i18n.getString( 'remove' )"/></a>
-                            #* #else
-                            <img src="../images/delete-denied.png">
-                            #end
-                            *#
-
-							<a href="javascript:showDataElementGroupSetDetails( $dataElementGroupSet.id )" title="$i18n.getString( 'show_details' )"><img src="../images/information.png" alt="$i18n.getString( 'show_details' )"/></a>
-
-						</td>
+					<tr id="tr${dataElementGroupSet.id}" style="height: 40px;">
+            <td data-id="$!dataElementGroupSet.id" data-uid="$!dataElementGroupSet.uid" data-type="DataElementGroupSet" data-name="$encoder.htmlEncode( $!dataElementGroupSet.displayName )">
+              $encoder.htmlEncode( $!dataElementGroupSet.displayName )
+            </td>
 					</tr>
 					#end
 				</tbody>
@@ -76,25 +49,24 @@
 			<p></p>
 			#parse( "/dhis-web-commons/paging/paging.vm" )
 		</td>
-		
+
 		<td id="detailsData">
-
-            <div id="detailsArea">
-                <div id="hideDetailsArea">
+      <div id="detailsArea">
+        <div id="hideDetailsArea">
 					<a href="javascript:hideDetails()" title="$i18n.getString( 'hide_details' )"><img src="../images/hide.png" alt="$i18n.getString( 'hide_details' )"/></a>
 				</div>
 				<p><label>$i18n.getString( "name" ):</label><br/><span id="nameField"></span></p>
 				<p><label>$i18n.getString( "number_of_members" ):</label><br/><span id="memberCountField"></span></p>
 			</div>
-			
+
 			<div id="warningArea">
-                <div id="hideDetailsArea">
-                    <a href="javascript:hideWarning()" title="$i18n.getString( 'hide_warning' )"><img src="../images/hide.png" alt="$i18n.getString( 'hide_warning' )"/></a>
-                </div>
-                <p><span id="warningField"></span></p>
-            </div>
-			
+        <div id="hideDetailsArea">
+          <a href="javascript:hideWarning()" title="$i18n.getString( 'hide_warning' )"><img src="../images/hide.png" alt="$i18n.getString( 'hide_warning' )"/></a>
+        </div>
+        <p><span id="warningField"></span></p>
+      </div>
+
 		</td>
-		
+
 	</tr>
 </table>

=== modified file 'dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-datadictionary/src/main/webapp/dhis-web-maintenance-datadictionary/indicator.vm'
--- dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-datadictionary/src/main/webapp/dhis-web-maintenance-datadictionary/indicator.vm	2013-10-13 16:15:28 +0000
+++ dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-datadictionary/src/main/webapp/dhis-web-maintenance-datadictionary/indicator.vm	2013-11-28 10:34:47 +0000
@@ -6,17 +6,27 @@
 		tableSorter( 'listTable' );	
 	});
 
-    var i18n_confirm_delete = '$encoder.jsEscape( $i18n.getString( "confirm_delete_indicator" ) , "'")';
+  var i18n_confirm_delete = '$encoder.jsEscape( $i18n.getString( "confirm_delete_indicator" ) , "'")';
 	// Are you sure you want to delete this?
 	var i18n_none = '$encoder.jsEscape( $i18n.getString( "none" ) , "'")';
 	var i18n_yes = '$encoder.jsEscape( $i18n.getString( "yes" ) , "'")';
-    var i18n_no = '$encoder.jsEscape( $i18n.getString( "no" ) , "'")';
+  var i18n_no = '$encoder.jsEscape( $i18n.getString( "no" ) , "'")';
 	var i18n_adding_indicator_failed = '$encoder.jsEscape( $i18n.getString( "adding_indicator_failed" ) , "'")';
 	var i18n_saving_indicator_failed = '$encoder.jsEscape( $i18n.getString( "saving_indicator_failed" ) , "'")';
 </script>
 
 <h3>$i18n.getString( "indicator_management" ) #openHelp( "indicator" )</h3>
 
+<div id="contextMenu" class="contextMenu">
+  <ul id="contextMenuItems" class="contextMenuItems">
+    #if( $security.canManage( $indicator ) )<li><a data-target-fn="showSharingDialogWithContext" href="#">$i18n.getString( "sharing_settings" )</a></li>#end
+    #if( $security.canUpdate( $indicator ) )<li><a data-target-fn="showUpdateIndicatorForm" href="#">$i18n.getString( "edit" )</a></li>#end
+    #if( $security.canUpdate( $indicator ) )<li><a data-target-fn="translateWithContext" href="#">$i18n.getString( "translation_translate" )</a></li>#end
+    #if( $security.canDelete( $indicator ) )<li><a data-target-fn="removeIndicator" href="#">$i18n.getString( "remove" )</a></li>#end
+    <li><a data-target-fn="showIndicatorDetails" href="#">$i18n.getString( "show_details" )</a></li>
+  </ul>
+</div>
+
 <table class="mainPageTable">
 	<tr>
 		<td style="vertical-align:top">
@@ -44,46 +54,17 @@
 				</tr>
 			</table>
 			<table class="listTable" id="listTable">				
-				<col/>				
-				<col width="145px"/>
-				<thead>	
+				<thead>
 				<tr>
 					<th>$i18n.getString( "name" )</th>
-					<th class="{sorter: false}">$i18n.getString( "operations" )</th>
 				</tr>
 				</thead>
 				<tbody id="list">
 				#foreach( $indicator in $indicators )
-				<tr id="tr${indicator.id}">
-					<td onclick="showIndicatorDetails( $indicator.id )">$encoder.htmlEncode( $indicator.displayName )</td>
-					<td style="text-align:right">
-
-                    #if ( $security.canManage( $indicator ) )
-                    <a href="javascript:showSharingDialog('indicator', '$indicator.uid');" title="$i18n.getString( 'sharing_settings' )"><img src="../images/relationship.png" alt="$i18n.getString( 'sharing_settings' )"></a>
-                    #else
-                    <img src="../images/relationship-denied.png">
-                    #end
-
-                    #if( $security.canUpdate( $indicator ) )
-                    <a href="showUpdateIndicatorForm.action?id=$indicator.id" title="$i18n.getString( 'edit' )"><img src="../images/edit.png" alt="$i18n.getString( 'edit' )"/></a>
-                    #else
-                    <img src="../images/edit-denied.png">
-                    #end
-
-                    #if( $security.canUpdate( $indicator ) )
-                    <a href="javascript:translate( 'Indicator', '$indicator.id' )" title="$i18n.getString( 'translation_translate' )"><img src="../images/i18n.png" alt="$i18n.getString( 'translation_translate' )"/></a>
-                    #else
-                    <img src="../images/i18n-denied.png">
-                    #end
-
-                    #if( $security.canDelete( $indicator ) )
-                    <a href="javascript:removeIndicator( $indicator.id, '$encoder.jsEncode( $indicator.displayName )' )" title="$i18n.getString( 'remove' )"><img src="../images/delete.png" alt="$i18n.getString( 'remove' )"/></a>
-                    #else
-                    <img src="../images/delete-denied.png">
-                    #end
-
-					<a href="javascript:showIndicatorDetails( $indicator.id )" title="$i18n.getString( 'show_details' )"><img src="../images/information.png" alt="$i18n.getString( 'show_details' )"/></a>
-					</td>
+				<tr id="tr${indicator.id}" style="height: 40px;">
+          <td data-id="$!indicator.id" data-uid="$!indicator.uid" data-type="Indicator" data-name="$encoder.htmlEncode( $!indicator.displayName )">
+            $encoder.htmlEncode( $!indicator.displayName )
+          </td>
 				</tr>
 				#end
 				</tbody>

=== modified file 'dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-datadictionary/src/main/webapp/dhis-web-maintenance-datadictionary/indicatorGroup.vm'
--- dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-datadictionary/src/main/webapp/dhis-web-maintenance-datadictionary/indicatorGroup.vm	2013-06-29 14:16:34 +0000
+++ dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-datadictionary/src/main/webapp/dhis-web-maintenance-datadictionary/indicatorGroup.vm	2013-11-28 10:34:47 +0000
@@ -6,7 +6,7 @@
 		tableSorter( 'listTable' );	
 	});
 	
-    var i18n_confirm_delete = '$encoder.jsEscape($i18n.getString( "confirm_delete_indicator_group" ) , "'")';
+  var i18n_confirm_delete = '$encoder.jsEscape($i18n.getString( "confirm_delete_indicator_group" ) , "'")';
 	// Are you sure you want to delete this?
 	var i18n_adding_indicator_group_failed = '$encoder.jsEscape($i18n.getString( "adding_indicator_group_failed" ) , "'")';
 	var i18n_saving_indicator_group_failed = '$encoder.jsEscape($i18n.getString( "saving_indicator_group_failed" ) , "'")';
@@ -14,6 +14,16 @@
 
 <h3>$i18n.getString( "indicator_group_management" ) #openHelp( "indicatorGroup" )</h3>
 
+<div id="contextMenu" class="contextMenu">
+  <ul id="contextMenuItems" class="contextMenuItems">
+    #if( $security.canManage( $indicatorGroup ) )<li><a data-target-fn="showSharingDialogWithContext" href="#">$i18n.getString( "sharing_settings" )</a></li>#end
+    #if( $security.canUpdate( $indicatorGroup ) )<li><a data-target-fn="showUpdateIndicatorGroupForm" href="#">$i18n.getString( "edit" )</a></li>#end
+    #if( $security.canUpdate( $indicatorGroup ) )<li><a data-target-fn="translateWithContext" href="#">$i18n.getString( "translation_translate" )</a></li>#end
+    #if( $security.canDelete( $indicatorGroup ) )<li><a data-target-fn="removeIndicatorGroup" href="#">$i18n.getString( "remove" )</a></li>#end
+    <li><a data-target-fn="showIndicatorGroupDetails" href="#">$i18n.getString( "show_details" )</a></li>
+  </ul>
+</div>
+
 <table class="mainPageTable">
 	<tr>
 		<td style="vertical-align:top">
@@ -24,47 +34,17 @@
 				</tr>
 			</table>
 			<table class="listTable" id="listTable">
-				<col/>
-				<col width="145px"/>
-                <thead>				
+        <thead>
 					<tr>
 						<th>$i18n.getString( "name" )</th>
-						<th class="{sorter: false}">$i18n.getString( "operations" )</th>
 					</tr>
-                </thead>
+        </thead>
 				<tbody id="list">
 				#foreach( $indicatorGroup in $indicatorGroups )
-				<tr id="tr${indicatorGroup.id}">
-					<td onclick="showIndicatorGroupDetails( $indicatorGroup.id )">$encoder.htmlEncode( $indicatorGroup.displayName )</td>
-					<td style="text-align:right">
-
-                        #if ( $security.canManage( $indicatorGroup ) )
-                        <a href="javascript:showSharingDialog('indicatorGroup', '$indicatorGroup.uid');" title="$i18n.getString( 'sharing_settings' )"><img src="../images/relationship.png" alt="$i18n.getString( 'sharing_settings' )"></a>
-                        #else
-                        <img src="../images/relationship-denied.png">
-                        #end
-
-                        #if( $security.canUpdate( $indicatorGroup ) )
-                        <a href="showUpdateIndicatorGroupForm.action?id=$indicatorGroup.id" title="$i18n.getString( 'edit' )"><img src="../images/edit.png" alt="$i18n.getString( 'edit' )"/></a>
-                        #else
-                        <img src="../images/edit-denied.png">
-                        #end
-
-                        #if( $security.canUpdate( $indicatorGroup ) )
-                        <a href="javascript:translate( 'IndicatorGroup', '$indicatorGroup.id' )" title="$i18n.getString( 'translation_translate' )"><img src="../images/i18n.png" alt="$i18n.getString( 'translation_translate' )"/></a>
-                        #else
-                        <img src="../images/i18n-denied.png">
-                        #end
-
-                        #if( $security.canDelete( $indicatorGroup ) )
-                        <a href="javascript:removeIndicatorGroup( $indicatorGroup.id, '$encoder.jsEncode( $indicatorGroup.displayName )' )" title="$i18n.getString( 'remove' )"><img src="../images/delete.png" alt="$i18n.getString( 'remove' )"/></a>
-                        #else
-                        <img src="../images/delete-denied.png">
-                        #end
-
-						<a href="javascript:showIndicatorGroupDetails( $indicatorGroup.id )" title="$i18n.getString( 'show_details' )"><img src="../images/information.png" alt="$i18n.getString( 'show_details' )"/></a>
-
-					</td>
+				<tr id="tr${indicatorGroup.id}" style="height: 40px;">
+          <td data-id="$!indicatorGroup.id" data-uid="$!indicatorGroup.uid" data-type="IndicatorGroup" data-name="$encoder.htmlEncode( $!indicatorGroup.displayName )">
+            $encoder.htmlEncode( $!indicatorGroup.displayName )
+          </td>
 				</tr>
 				#end
 				</tbody>
@@ -74,21 +54,20 @@
 		</td>
 
 		<td id="detailsData">
+      <div id="detailsArea">
+        <div id="hideDetailsArea">
+        <a href="javascript:hideDetails()" title="$i18n.getString( 'hide_details' )"><img src="../images/hide.png" alt="$i18n.getString( 'hide_details' )"/></a>
+      </div>
+      <p><label>$i18n.getString( "name" ):</label><br/><span id="nameField"></span></p>
+      <p><label>$i18n.getString( "number_of_members" ):</label><br/><span id="memberCountField"></span></p>
+      </div>
 
-            <div id="detailsArea">
-                <div id="hideDetailsArea">
-					<a href="javascript:hideDetails()" title="$i18n.getString( 'hide_details' )"><img src="../images/hide.png" alt="$i18n.getString( 'hide_details' )"/></a>
-				</div>				
-				<p><label>$i18n.getString( "name" ):</label><br/><span id="nameField"></span></p>
-				<p><label>$i18n.getString( "number_of_members" ):</label><br/><span id="memberCountField"></span></p>
-			</div>
-			
 			<div id="warningArea">
-                <div id="hideDetailsArea">
-                    <a href="javascript:hideWarning()" title="$i18n.getString( 'hide_warning' )"><img src="../images/hide.png" alt="$i18n.getString( 'hide_warning' )"/></a>
-                </div>
-                <p><span id="warningField"></span></p>
-            </div>
+        <div id="hideDetailsArea">
+          <a href="javascript:hideWarning()" title="$i18n.getString( 'hide_warning' )"><img src="../images/hide.png" alt="$i18n.getString( 'hide_warning' )"/></a>
+        </div>
+        <p><span id="warningField"></span></p>
+      </div>
 			
 		</td>
 	</tr>

=== modified file 'dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-datadictionary/src/main/webapp/dhis-web-maintenance-datadictionary/indicatorGroupSet.vm'
--- dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-datadictionary/src/main/webapp/dhis-web-maintenance-datadictionary/indicatorGroupSet.vm	2013-06-29 14:16:34 +0000
+++ dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-datadictionary/src/main/webapp/dhis-web-maintenance-datadictionary/indicatorGroupSet.vm	2013-11-28 10:34:47 +0000
@@ -14,57 +14,37 @@
 
 <h3>$i18n.getString( "indicator_group_set" ) #openHelp( "indicatorGroupSet" )</h3>
 
+<div id="contextMenu" class="contextMenu">
+  <ul id="contextMenuItems" class="contextMenuItems">
+    #if( $security.canManage( $indicatorGroupSet ) )<li><a data-target-fn="showSharingDialogWithContext" href="#">$i18n.getString( "sharing_settings" )</a></li>#end
+    #if( $security.canUpdate( $indicatorGroupSet ) )<li><a data-target-fn="showUpdateIndicatorGroupSetForm" href="#">$i18n.getString( "edit" )</a></li>#end
+    #if( $security.canUpdate( $indicatorGroupSet ) )<li><a data-target-fn="translateWithContext" href="#">$i18n.getString( "translation_translate" )</a></li>#end
+    #if( $security.canDelete( $indicatorGroupSet ) )<li><a data-target-fn="deleteIndicatorGroupSet" href="#">$i18n.getString( "remove" )</a></li>#end
+    <li><a data-target-fn="showIndicatorGroupSetDetails" href="#">$i18n.getString( "show_details" )</a></li>
+  </ul>
+</div>
+
 <table class="mainPageTable">
 	<tr>
 		<td style="vertical-align:top">
 			<table width="100%">
 				<tr>
-                    <td>#filterDiv( "indicatorGroupSet" )</td>
+          <td>#filterDiv( "indicatorGroupSet" )</td>
 					<td colspan="4" style="text-align:right"><input type=button value="$i18n.getString( 'add_new' )" onclick="window.location='openAddIndicatorGroupSet.action'"/></td>
 				</tr>
 			<table>
 			<table class="listTable" id="listTable">
-                <col/>
-                <col width="145px"/>
-                <thead>
+      <thead>
 				<tr>
 					<th>$i18n.getString( "name" )</th>
-					<th class="{sorter: false}">$i18n.getString( "operations" )</th>
 				</tr>
-                </thead>
-				<tbody id="list">
+      </thead>
+      <tbody id="list">
 					#foreach( $indicatorGroupSet in $indicatorGroupSets )
-					<tr id="tr${indicatorGroupSet.id}">
-						<td onclick="showIndicatorGroupSetDetails( $indicatorGroupSet.id )">$encoder.htmlEncode( $indicatorGroupSet.displayName )</td>
-						<td style="text-align:right">
-
-                            #if ( $security.canManage( $indicatorGroupSet ) )
-                            <a href="javascript:showSharingDialog('indicatorGroupSet', '$indicatorGroupSet.uid');" title="$i18n.getString( 'sharing_settings' )"><img src="../images/relationship.png" alt="$i18n.getString( 'sharing_settings' )"></a>
-                            #else
-                            <img src="../images/relationship-denied.png">
-                            #end
-
-                            #if( $security.canUpdate( $indicatorGroupSet ) )
-                            <a href="openUpdateIndicatorGroupSet.action?id=$indicatorGroupSet.id" title="$i18n.getString( 'edit' )"><img src="../images/edit.png" alt="$i18n.getString( 'edit' )"/></a>
-                            #else
-                            <img src="../images/edit-denied.png">
-                            #end
-
-                            #if( $security.canUpdate( $indicatorGroupSet ) )
-                            <a href="javascript:translate( 'IndicatorGroupSet', '$indicatorGroupSet.id' )"><img src="../images/i18n.png" alt="$i18n.getString( 'translation_translate' )"/></a>
-                            #else
-                            <img src="../images/i18n-denied.png">
-                            #end
-
-                            #if( $security.canDelete( $indicatorGroupSet ) )
-                            <a href="javascript:deleteIndicatorGroupSet( $indicatorGroupSet.id, '$encoder.jsEncode( $indicatorGroupSet.displayName )' )" title="$i18n.getString( 'remove' )"><img src="../images/delete.png" alt="$i18n.getString( 'remove' )"/></a>
-                            #else
-                            <img src="../images/delete-denied.png">
-                            #end
-
-							<a href="javascript:showIndicatorGroupSetDetails( $indicatorGroupSet.id )" title="$i18n.getString( 'show_details' )"><img src="../images/information.png" alt="$i18n.getString( 'show_details' )"/></a>
-
-						</td>
+					<tr id="tr${indicatorGroupSet.id}" style="height: 40px;">
+            <td data-id="$!indicatorGroupSet.id" data-uid="$!indicatorGroupSet.uid" data-type="IndicatorGroupSet" data-name="$encoder.htmlEncode( $!indicatorGroupSet.displayName )">
+              $encoder.htmlEncode( $!indicatorGroupSet.displayName )
+            </td>
 					</tr>
 					#end
 				</tbody>
@@ -74,21 +54,20 @@
 		</td>
 		
 		<td id="detailsData">
-
-            <div id="detailsArea">
-                <div id="hideDetailsArea">
-					<a href="javascript:hideDetails()" title="$i18n.getString( 'hide_details' )"><img src="../images/hide.png" alt="$i18n.getString( 'hide_details' )"/></a>
+      <div id="detailsArea">
+        <div id="hideDetailsArea">
+          <a href="javascript:hideDetails()" title="$i18n.getString( 'hide_details' )"><img src="../images/hide.png" alt="$i18n.getString( 'hide_details' )"/></a>
 				</div>
 				<p><label>$i18n.getString( "name" ):</label><br/><span id="nameField"></span></p>
 				<p><label>$i18n.getString( "number_of_members" ):</label><br/><span id="memberCountField"></span></p>
 			</div>
 
 			<div id="warningArea">
-                <div id="hideDetailsArea">
-                    <a href="javascript:hideWarning()" title="$i18n.getString( 'hide_warning' )"><img src="../images/hide.png" alt="$i18n.getString( 'hide_warning' )"/></a>
-                </div>
-                <p><span id="warningField"></span></p>
-            </div>
+        <div id="hideDetailsArea">
+          <a href="javascript:hideWarning()" title="$i18n.getString( 'hide_warning' )"><img src="../images/hide.png" alt="$i18n.getString( 'hide_warning' )"/></a>
+        </div>
+        <p><span id="warningField"></span></p>
+      </div>
 			
 		</td>
 		

=== modified file 'dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-datadictionary/src/main/webapp/dhis-web-maintenance-datadictionary/indicatorType.vm'
--- dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-datadictionary/src/main/webapp/dhis-web-maintenance-datadictionary/indicatorType.vm	2013-06-29 14:16:34 +0000
+++ dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-datadictionary/src/main/webapp/dhis-web-maintenance-datadictionary/indicatorType.vm	2013-11-28 10:34:47 +0000
@@ -1,31 +1,46 @@
 <script type="text/javascript">
-	jQuery(document).ready(function(){	
+	jQuery(document).ready(function() {
 		tableSorter( 'listTable' );	
+
+    dhis2.contextmenu.makeContextMenu({
+      menuId: 'contextMenu',
+      menuItemActiveClass: 'contextMenuItemActive'
+    });
 	});
 
-	function showIndicatorTypeDetails( indicatorTypeId )
-	{
-	    jQuery.get( 'getIndicatorType.action', { id: indicatorTypeId },
-			function( json ) {				
-				setInnerHTML( 'nameField', json.indicatorType.name );
-				setInnerHTML( 'factorField', json.indicatorType.factor );
+	function showIndicatorTypeDetails( context ) {
+    jQuery.get( 'getIndicatorType.action', { id: context.id }, function( json ) {
+      setInnerHTML( 'nameField', json.indicatorType.name );
+      setInnerHTML( 'factorField', json.indicatorType.factor );
 
-				showDetails();
+      showDetails();
 		});
 	}
 
-	function removeIndicatorType( indicatorTypeId, indicatorTypeName )
-	{
-	    removeItem( indicatorTypeId, indicatorTypeName, i18n_confirm_delete, 'removeIndicatorType.action' );
+	function removeIndicatorType( context ) {
+    removeItem( context.id, context.name, i18n_confirm_delete, 'removeIndicatorType.action' );
 	}
 
-    var i18n_confirm_delete = '$encoder.jsEscape( $i18n.getString( "confirm_delete_indicator_type" ) , "'")';
+  function showUpdateIndicatorTypeForm( context ) {
+    location.href = 'showUpdateIndicatorTypeForm.action?id=' + context.id;
+  }
+
+  var i18n_confirm_delete = '$encoder.jsEscape( $i18n.getString( "confirm_delete_indicator_type" ) , "'")';
 	var i18n_adding_indicator_type_failed = '$encoder.jsEscape( $i18n.getString( "adding_indicator_type_failed" ) , "'")';
 	var i18n_saving_indicator_type_failed = '$encoder.jsEscape( $i18n.getString( "saving_indicator_type_failed" ) , "'")';
 </script>
 
 <h3>$i18n.getString( "indicator_type_management" ) #openHelp( "indicatorType" )</h3>
 
+<div id="contextMenu" class="contextMenu">
+  <ul id="contextMenuItems" class="contextMenuItems">
+    <li><a data-target-fn="showUpdateIndicatorTypeForm" href="#">$i18n.getString( "edit" )</a></li>
+    <li><a data-target-fn="translateWithContext" href="#">$i18n.getString( "translation_translate" )</a></li>
+    <li><a data-target-fn="removeIndicatorType" href="#">$i18n.getString( "remove" )</a></li>
+    <li><a data-target-fn="showIndicatorTypeDetails" href="#">$i18n.getString( "show_details" )</a></li>
+  </ul>
+</div>
+
 <table class="mainPageTable">
 	<tr>
 		<td style="vertical-align:top">
@@ -36,48 +51,40 @@
 				</tr>
 			</table>
 			<table class="listTable" id="listTable">
-				<col/>
-				<col width="120px"/>				
-                <thead>				
+        <thead>
 				<tr>
 					<th>$i18n.getString( "name" )</th>
-					<th class="{sorter: false}">$i18n.getString( "operations" )</th>
 				</tr>
-                </thead>
+        </thead>
 				<tbody id="list">
 				#foreach( $indicatorType in $indicatorTypes )
-				<tr id="tr${indicatorType.id}">
-					<td onclick="javascript:showIndicatorTypeDetails( $indicatorType.id )">$encoder.htmlEncode( $indicatorType.displayName )</td>
-					<td style="text-align:right">
-						<a href="showUpdateIndicatorTypeForm.action?id=$indicatorType.id" title="$i18n.getString( 'edit' )"><img src="../images/edit.png" alt="$i18n.getString( 'edit' )"/></a>
-						<a href="javascript:translate( 'IndicatorType', '$indicatorType.id' )" title="$i18n.getString( 'translation_translate' )"><img src="../images/i18n.png" alt="$i18n.getString( 'translation_translate' )"/></a>
-						<a href="javascript:removeIndicatorType( $indicatorType.id, '$encoder.jsEncode( $indicatorType.displayName )' )" title="$i18n.getString( 'remove' )"><img src="../images/delete.png" alt="$i18n.getString( 'remove' )"/></a>
-						<a href="javascript:showIndicatorTypeDetails( $indicatorType.id )" title="$i18n.getString( 'show_details' )"><img src="../images/information.png" alt="$i18n.getString( 'show_details' )"/></a>
-					</td>
+				<tr id="tr${indicatorType.id}" style="height: 40px;">
+          <td data-id="$!indicatorType.id" data-uid="$!indicatorType.uid" data-type="IndicatorType" data-name="$encoder.htmlEncode( $!indicatorType.displayName )">
+            $encoder.htmlEncode( $!indicatorType.displayName )
+          </td>
 				</tr>
 				#end
 				</tbody>
 			</table>
 			<p></p>
 			#parse( "/dhis-web-commons/paging/paging.vm" )
+		</td>
 
-		</td>
 		<td id="detailsData">
-
-            <div id="detailsArea">
-                <div id="hideDetailsArea">
+      <div id="detailsArea">
+        <div id="hideDetailsArea">
 					<a href="javascript:hideDetails()" title="$i18n.getString( 'hide_details' )"><img src="../images/hide.png" alt="$i18n.getString( 'hide_details' )"/></a>
-				</div>
+        </div>
 				<p><label>$i18n.getString( "name"):</label><br/><span id="nameField"></span></p>
 				<p><label>$i18n.getString( "factor" ):</label><br/><span id="factorField"></span></p>
 			</div>
 
 			<div id="warningArea">
-                <div id="hideDetailsArea">
-                    <a href="javascript:hideWarning()" title="$i18n.getString( 'hide_warning' )"><img src="../images/hide.png" alt="$i18n.getString( 'hide_warning' )"/></a>
-                </div>
-                <p><span id="warningField"></span></p>
-            </div>
+        <div id="hideDetailsArea">
+          <a href="javascript:hideWarning()" title="$i18n.getString( 'hide_warning' )"><img src="../images/hide.png" alt="$i18n.getString( 'hide_warning' )"/></a>
+        </div>
+        <p><span id="warningField"></span></p>
+      </div>
 
 		</td>
 	</tr>

=== modified file 'dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-datadictionary/src/main/webapp/dhis-web-maintenance-datadictionary/javascript/category.js'
--- dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-datadictionary/src/main/webapp/dhis-web-maintenance-datadictionary/javascript/category.js	2013-02-22 11:39:14 +0000
+++ dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-datadictionary/src/main/webapp/dhis-web-maintenance-datadictionary/javascript/category.js	2013-11-28 10:34:47 +0000
@@ -1,5 +1,5 @@
 
-function removeDataElementCategory( categoryId, categoryName )
-{
-	removeItem( categoryId, categoryName, i18n_confirm_delete, 'removeDataElementCategory.action' );
+function removeDataElementCategory( context ) {
+	removeItem( context.id, context.name, i18n_confirm_delete, 'removeDataElementCategory.action' );
 }
+

=== modified file 'dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-datadictionary/src/main/webapp/dhis-web-maintenance-datadictionary/javascript/categoryCombo.js'
--- dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-datadictionary/src/main/webapp/dhis-web-maintenance-datadictionary/javascript/categoryCombo.js	2011-09-27 07:36:07 +0000
+++ dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-datadictionary/src/main/webapp/dhis-web-maintenance-datadictionary/javascript/categoryCombo.js	2013-11-28 10:34:47 +0000
@@ -1,6 +1,13 @@
-function showDataElementCategoryComboDetails( categoryComboId )
-{
-    jQuery.post( 'getDataElementCategoryCombo.action', { id: categoryComboId },
+
+$(function() {
+  dhis2.contextmenu.makeContextMenu({
+    menuId: 'contextMenu',
+    menuItemActiveClass: 'contextMenuItemActive'
+  });
+});
+
+function showDataElementCategoryComboDetails( context ) {
+    jQuery.post( 'getDataElementCategoryCombo.action', { id: context.id },
 		function ( json) {
 			setInnerHTML( 'nameField', json.dataElementCategoryCombo.name );
 			setInnerHTML( 'dataElementCategoryCountField', json.dataElementCategoryCombo.dataElementCategoryCount );
@@ -13,17 +20,15 @@
 // Delete Category
 // -----------------------------------------------------------------------------
 
-function removeDataElementCategoryCombo( categoryComboId, categoryComboName )
-{
-    removeItem( categoryComboId, categoryComboName, i18n_confirm_delete, 'removeDataElementCategoryCombo.action' );
+function removeDataElementCategoryCombo( context ) {
+    removeItem( context.id, context.name, i18n_confirm_delete, 'removeDataElementCategoryCombo.action' );
 }
 
 // ----------------------------------------------------------------------
 // Validation
 // ----------------------------------------------------------------------
 
-function validateSelectedCategories( form )
-{
+function validateSelectedCategories( form ) {
     var url = "validateDataElementCategoryCombo.action?";
     url += getParamString( "selectedList", "selectedCategories" );
 
@@ -37,3 +42,7 @@
     } );
 
 }
+
+function showUpdateDataElementCategoryComboForm( context ) {
+  location.href = 'showUpdateDataElementCategoryComboForm.action?id=' + context.id;
+}

=== modified file 'dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-datadictionary/src/main/webapp/dhis-web-maintenance-datadictionary/javascript/dataDictionary.js'
--- dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-datadictionary/src/main/webapp/dhis-web-maintenance-datadictionary/javascript/dataDictionary.js	2011-09-27 07:36:07 +0000
+++ dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-datadictionary/src/main/webapp/dhis-web-maintenance-datadictionary/javascript/dataDictionary.js	2013-11-28 10:34:47 +0000
@@ -1,10 +1,17 @@
+
+$(function() {
+  dhis2.contextmenu.makeContextMenu({
+    menuId: 'contextMenu',
+    menuItemActiveClass: 'contextMenuItemActive'
+  });
+});
+
 // -----------------------------------------------------------------------------
 // View details
 // -----------------------------------------------------------------------------
 
-function showDataDictionaryDetails( dataDictionaryId )
-{
-	jQuery.post( 'getDataDictionary.action', { id: dataDictionaryId },
+function showDataDictionaryDetails( context ) {
+	jQuery.post( 'getDataDictionary.action', { id: context.id },
 		function ( json ) {
 			setInnerHTML( 'nameField', json.dataDictionary.name );
 
@@ -22,8 +29,7 @@
 // Change DataDictionary
 // -----------------------------------------------------------------------------
 
-function dataDictionaryChanged( list )
-{
+function dataDictionaryChanged( list ) {
     var id = list.options[list.selectedIndex].value;
 
     var url = "setCurrentDataDictionary.action?id=" + id;
@@ -35,7 +41,10 @@
 // Remove DataDictionary
 // -----------------------------------------------------------------------------
 
-function removeDataDictionary( dataDictionaryId, dataDictionaryName )
-{
-    removeItem( dataDictionaryId, dataDictionaryName, i18n_confirm_delete, 'removeDataDictionary.action' );
+function removeDataDictionary( context ) {
+    removeItem( context.id, context.name, i18n_confirm_delete, 'removeDataDictionary.action' );
+}
+
+function showUpdateDataDictionaryForm( context ) {
+  location.href = 'showUpdateDataDictionaryForm.action?id=' + context.id;
 }

=== modified file 'dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-datadictionary/src/main/webapp/dhis-web-maintenance-datadictionary/javascript/dataElement.js'
--- dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-datadictionary/src/main/webapp/dhis-web-maintenance-datadictionary/javascript/dataElement.js	2013-11-21 09:39:43 +0000
+++ dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-datadictionary/src/main/webapp/dhis-web-maintenance-datadictionary/javascript/dataElement.js	2013-11-28 10:34:47 +0000
@@ -1,157 +1,146 @@
-
 $(function() {
-    $('#aggregationOperatorSelect').change(updateZeroIsSignificant);
-    $('#aggregationOperatorSelect').change();
+  $('#aggregationOperatorSelect').change(updateZeroIsSignificant);
+  $('#aggregationOperatorSelect').change();
+
+  dhis2.contextmenu.makeContextMenu({
+    menuId: 'contextMenu',
+    menuItemActiveClass: 'contextMenuItemActive'
+  });
 });
 
-function updateZeroIsSignificant()
-{
-    var $this = $('#aggregationOperatorSelect');
-
-    if( $this.val() == 'sum' )
-    {
-       $( '#zeroIsSignificant' ).removeAttr( 'disabled' );
-    }
-    else if( $this.val() == 'average' )
-    {
-       $( '#zeroIsSignificant' ).attr( 'disabled', true );
-    }
-}
-
-function exportPDF( type )
-{	
-	var params = "type=" + type;
-	params += "&dataDictionaryId=" + jQuery( '#dataDictionaryList' ).val();
-	
-	exportPdfByType( type, params );
-}
-
-function changeValueType( value )
-{
-	enable('aggregationOperatorSelect');
-    if ( value == 'int' )
-    {
-		showById( 'numberTypeTR' );
-        hideById( 'textTypeTR' );
-        enable( 'zeroIsSignificant' );
-    } else
-    {
-        disable( 'zeroIsSignificant' );
-		hideById( 'numberTypeTR' );
-		hideById( 'textTypeTR' );
-		disable('aggregationOperatorSelect');
-		if( value=='string' ){
-			showById( 'textTypeTR' );
-		}
-		else if(value=='bool'){
-			enable('aggregationOperatorSelect');
-		}
-    }
-
-    updateAggreationOperation( value );
-}
-
-function updateAggreationOperation( value )
-{
-    if ( value == 'string' || value == 'date' || value == 'trueOnly' )
-    {
-        hideById( "aggregationOperator" );
-    } else
-    {
-        showById( "aggregationOperator" );
-    }
+function updateZeroIsSignificant() {
+  var $this = $('#aggregationOperatorSelect');
+
+  if( $this.val() == 'sum' ) {
+    $('#zeroIsSignificant').removeAttr('disabled');
+  }
+  else if( $this.val() == 'average' ) {
+    $('#zeroIsSignificant').attr('disabled', true);
+  }
+}
+
+function exportPDF( type ) {
+  var params = "type=" + type;
+  params += "&dataDictionaryId=" + jQuery('#dataDictionaryList').val();
+
+  exportPdfByType(type, params);
+}
+
+function changeValueType( value ) {
+  enable('aggregationOperatorSelect');
+  if( value == 'int' ) {
+    showById('numberTypeTR');
+    hideById('textTypeTR');
+    enable('zeroIsSignificant');
+  } else {
+    disable('zeroIsSignificant');
+    hideById('numberTypeTR');
+    hideById('textTypeTR');
+    disable('aggregationOperatorSelect');
+
+    if( value == 'string' ) {
+      showById('textTypeTR');
+    }
+    else if( value == 'bool' ) {
+      enable('aggregationOperatorSelect');
+    }
+  }
+
+  updateAggreationOperation(value);
+}
+
+function updateAggreationOperation( value ) {
+  if( value == 'string' || value == 'date' || value == 'trueOnly' ) {
+    hideById("aggregationOperator");
+  } else {
+    showById("aggregationOperator");
+  }
 }
 
 // -----------------------------------------------------------------------------
 // Change data element group and data dictionary
 // -----------------------------------------------------------------------------
 
-function criteriaChanged()
-{
-    var domainType = getListValue( "domainTypeList" );
-
-    var url = "dataElement.action?domainType=" + domainType;
-
-    window.location.href = url;
+function criteriaChanged() {
+  var domainType = getListValue("domainTypeList");
+
+  var url = "dataElement.action?domainType=" + domainType;
+
+  window.location.href = url;
 }
 
 // -----------------------------------------------------------------------------
 // View details
 // -----------------------------------------------------------------------------
 
-function showDataElementDetails( dataElementId )
-{
-	jQuery.get( '../dhis-web-commons-ajax-json/getDataElement.action', 
-		{ "id": dataElementId }, function( json ) {
-		setInnerHTML( 'nameField', json.dataElement.name );
-		setInnerHTML( 'shortNameField', json.dataElement.shortName );
-
-		var description = json.dataElement.description;
-		setInnerHTML( 'descriptionField', description ? description : '[' + i18n_none + ']' );
-
-		var active = json.dataElement.active;
-		setInnerHTML( 'activeField', active == 'true' ? i18n_yes : i18n_no );
-
-		var typeMap = {
-			'int' : i18n_number,
-			'bool' : i18n_yes_no,
-			'trueOnly' : i18n_yes_only,
-			'string' : i18n_text,
-			'date' : i18n_date,
-			'username' : i18n_user_name
-		};
-		var type = json.dataElement.valueType;
-		setInnerHTML( 'typeField', typeMap[type] );
-
-		var domainTypeMap = {
-			'aggregate' : i18n_aggregate,
-			'patient' : i18n_patient
-		};
-		var domainType = json.dataElement.domainType;
-		setInnerHTML( 'domainTypeField', domainTypeMap[domainType] );
-
-		var aggregationOperator = json.dataElement.aggregationOperator;
-		var aggregationOperatorText = i18n_none;
-		if ( aggregationOperator == 'sum' )
-		{
-			aggregationOperatorText = i18n_sum;
-		} else if ( aggregationOperator == 'average' )
-		{
-			aggregationOperatorText = i18n_average;
-		}
-		setInnerHTML( 'aggregationOperatorField', aggregationOperatorText );
-
-		setInnerHTML( 'categoryComboField', json.dataElement.categoryCombo );
-
-		var url = json.dataElement.url;
-		setInnerHTML( 'urlField', url ? '<a href="' + url + '">' + url + '</a>' : '[' + i18n_none + ']' );
-
-		var lastUpdated = json.dataElement.lastUpdated;
-		setInnerHTML( 'lastUpdatedField', lastUpdated ? lastUpdated : '[' + i18n_none + ']' );
-
-		var dataSets = joinNameableObjects( json.dataElement.dataSets );
-		setInnerHTML( 'dataSetsField', dataSets ? dataSets : '[' + i18n_none + ']' );
-	
-		showDetails();
-	});
-}
-
-// -----------------------------------------------------------------------------
-// Remove data element
-// -----------------------------------------------------------------------------
-
-function removeDataElement( dataElementId, dataElementName )
-{
-    removeItem( dataElementId, dataElementName, i18n_confirm_delete, 'removeDataElement.action' );
-}
-
-function domainTypeChange( domainType )
-{
-	if( domainType=='aggregate'){
-		enable('selectedCategoryComboId');
-	}
-	else{
-		setFieldValue('selectedCategoryComboId', getFieldValue('defaultCategoryCombo'));
-		disable('selectedCategoryComboId');
-	}
+function showDataElementDetails( context ) {
+  jQuery.get('../dhis-web-commons-ajax-json/getDataElement.action',
+    { "id": context.id }, function( json ) {
+      setInnerHTML('nameField', json.dataElement.name);
+      setInnerHTML('shortNameField', json.dataElement.shortName);
+
+      var description = json.dataElement.description;
+      setInnerHTML('descriptionField', description ? description : '[' + i18n_none + ']');
+
+      var active = json.dataElement.active;
+      setInnerHTML('activeField', active == 'true' ? i18n_yes : i18n_no);
+
+      var typeMap = {
+        'int': i18n_number,
+        'bool': i18n_yes_no,
+        'trueOnly': i18n_yes_only,
+        'string': i18n_text,
+        'date': i18n_date,
+        'username': i18n_user_name
+      };
+      var type = json.dataElement.valueType;
+      setInnerHTML('typeField', typeMap[type]);
+
+      var domainTypeMap = {
+        'aggregate': i18n_aggregate,
+        'patient': i18n_patient
+      };
+      var domainType = json.dataElement.domainType;
+      setInnerHTML('domainTypeField', domainTypeMap[domainType]);
+
+      var aggregationOperator = json.dataElement.aggregationOperator;
+      var aggregationOperatorText = i18n_none;
+      if( aggregationOperator == 'sum' ) {
+        aggregationOperatorText = i18n_sum;
+      } else if( aggregationOperator == 'average' ) {
+        aggregationOperatorText = i18n_average;
+      }
+      setInnerHTML('aggregationOperatorField', aggregationOperatorText);
+
+      setInnerHTML('categoryComboField', json.dataElement.categoryCombo);
+
+      var url = json.dataElement.url;
+      setInnerHTML('urlField', url ? '<a href="' + url + '">' + url + '</a>' : '[' + i18n_none + ']');
+
+      var lastUpdated = json.dataElement.lastUpdated;
+      setInnerHTML('lastUpdatedField', lastUpdated ? lastUpdated : '[' + i18n_none + ']');
+
+      var dataSets = joinNameableObjects(json.dataElement.dataSets);
+      setInnerHTML('dataSetsField', dataSets ? dataSets : '[' + i18n_none + ']');
+
+      showDetails();
+    });
+}
+
+function removeDataElement( context ) {
+  removeItem(context.id, context.name, i18n_confirm_delete, 'removeDataElement.action');
+}
+
+function domainTypeChange( domainType ) {
+  if( domainType == 'aggregate' ) {
+    enable('selectedCategoryComboId');
+  }
+  else {
+    setFieldValue('selectedCategoryComboId', getFieldValue('defaultCategoryCombo'));
+    disable('selectedCategoryComboId');
+  }
+}
+
+function showUpdateDataElementForm( context ) {
+  location.href = 'showUpdateDataElementForm.action?id=' + context.id + '&update=true';
 }

=== modified file 'dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-datadictionary/src/main/webapp/dhis-web-maintenance-datadictionary/javascript/dataElementGroup.js'
--- dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-datadictionary/src/main/webapp/dhis-web-maintenance-datadictionary/javascript/dataElementGroup.js	2013-03-01 04:09:26 +0000
+++ dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-datadictionary/src/main/webapp/dhis-web-maintenance-datadictionary/javascript/dataElementGroup.js	2013-11-28 10:34:47 +0000
@@ -1,38 +1,45 @@
-function beforeSubmit()
-{
-    memberValidator = jQuery( "#memberValidator" );
-    memberValidator.children().remove();
-
-    jQuery.each( jQuery( "#groupMembers" ).children(), function( i, item )
-    {
-        item.selected = 'selected';
-        memberValidator.append( '<option value="' + item.value + '" selected="selected">' + item.value + '</option>' );
-    } );
+$(function() {
+  dhis2.contextmenu.makeContextMenu({
+    menuId: 'contextMenu',
+    menuItemActiveClass: 'contextMenuItemActive'
+  });
+});
+
+function beforeSubmit() {
+  memberValidator = jQuery("#memberValidator");
+  memberValidator.children().remove();
+
+  jQuery.each(jQuery("#groupMembers").children(), function( i, item ) {
+    item.selected = 'selected';
+    memberValidator.append('<option value="' + item.value + '" selected="selected">' + item.value + '</option>');
+  });
 }
 
 // -----------------------------------------------------------------------------
 // View details
 // -----------------------------------------------------------------------------
 
-function showDataElementGroupDetails( dataElementGroupId )
-{
-    jQuery.post( '../dhis-web-commons-ajax-json/getDataElementGroup.action',
-		{ id: dataElementGroupId }, function ( json ) {		
-	
-		setInnerHTML( 'nameField', json.dataElementGroup.name );
-		setInnerHTML( 'shortNameField', json.dataElementGroup.shortName );
-		setInnerHTML( 'codeField', json.dataElementGroup.code );
-		setInnerHTML( 'memberCountField', json.dataElementGroup.memberCount );
-
-		showDetails();
-	});
+function showDataElementGroupDetails( context ) {
+  jQuery.post('../dhis-web-commons-ajax-json/getDataElementGroup.action',
+    { id: context.id }, function( json ) {
+
+      setInnerHTML('nameField', json.dataElementGroup.name);
+      setInnerHTML('shortNameField', json.dataElementGroup.shortName);
+      setInnerHTML('codeField', json.dataElementGroup.code);
+      setInnerHTML('memberCountField', json.dataElementGroup.memberCount);
+
+      showDetails();
+    });
 }
 
 // -----------------------------------------------------------------------------
 // Remove data element group
 // -----------------------------------------------------------------------------
 
-function removeDataElementGroup( dataElementGroupId, dataElementGroupName )
-{
-    removeItem( dataElementGroupId, dataElementGroupName, i18n_confirm_delete, "removeDataElementGroup.action" );
+function removeDataElementGroup( context ) {
+  removeItem(context.id, context.name, i18n_confirm_delete, "removeDataElementGroup.action");
+}
+
+function showUpdateDataElementGroupForm( context ) {
+  location.href = 'showUpdateDataElementGroupForm.action?id=' + context.id;
 }

=== modified file 'dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-datadictionary/src/main/webapp/dhis-web-maintenance-datadictionary/javascript/dataElementGroupSet.js'
--- dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-datadictionary/src/main/webapp/dhis-web-maintenance-datadictionary/javascript/dataElementGroupSet.js	2013-04-30 08:12:53 +0000
+++ dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-datadictionary/src/main/webapp/dhis-web-maintenance-datadictionary/javascript/dataElementGroupSet.js	2013-11-28 10:34:47 +0000
@@ -1,35 +1,43 @@
-function beforeSubmit()
-{
-    memberValidator = jQuery( "#memberValidator" );
-    memberValidator.children().remove();
-
-    jQuery.each( jQuery( "#groupMembers" ).children(), function( i, item )
-    {
-        item.selected = 'selected';
-        memberValidator.append( '<option value="' + item.value + '" selected="selected">' + item.value + '</option>' );
-    } );
+
+$(function() {
+  dhis2.contextmenu.makeContextMenu({
+    menuId: 'contextMenu',
+    menuItemActiveClass: 'contextMenuItemActive'
+  });
+});
+
+function beforeSubmit() {
+  memberValidator = jQuery("#memberValidator");
+  memberValidator.children().remove();
+
+  jQuery.each(jQuery("#groupMembers").children(), function( i, item ) {
+    item.selected = 'selected';
+    memberValidator.append('<option value="' + item.value + '" selected="selected">' + item.value + '</option>');
+  });
 }
 
 // -----------------------------------------------------------------------------
 // Delete
 // -----------------------------------------------------------------------------
 
-function deleteDataElementGroupSet( groupSetId, groupSetName )
-{
-    removeItem( groupSetId, groupSetName, i18n_confirm_delete, "deleteDataElementGroupSet.action" );
+function deleteDataElementGroupSet( context ) {
+  removeItem(context.id, context.name, i18n_confirm_delete, "deleteDataElementGroupSet.action");
 }
 
 // -----------------------------------------------------------------------------
 // Show Data Element Group Set details
 // -----------------------------------------------------------------------------
 
-function showDataElementGroupSetDetails( id )
-{
-    jQuery.post( '../dhis-web-commons-ajax-json/getDataElementGroupSet.action', { id: id },
-		function ( json ) {
-			setInnerHTML( 'nameField', json.dataElementGroupSet.name );
-			setInnerHTML( 'memberCountField', json.dataElementGroupSet.memberCount );
-
-			showDetails();
-	});
+function showDataElementGroupSetDetails( context ) {
+  $.post('../dhis-web-commons-ajax-json/getDataElementGroupSet.action', { id: context.id },
+    function( json ) {
+      setInnerHTML('nameField', json.dataElementGroupSet.name);
+      setInnerHTML('memberCountField', json.dataElementGroupSet.memberCount);
+
+      showDetails();
+    });
+}
+
+function showUpdateDataElementGroupSetForm( context ) {
+  location.href = 'openUpdateDataElementGroupSet.action?id=' + context.id;
 }

=== modified file 'dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-datadictionary/src/main/webapp/dhis-web-maintenance-datadictionary/javascript/indicator.js'
--- dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-datadictionary/src/main/webapp/dhis-web-maintenance-datadictionary/javascript/indicator.js	2012-10-18 13:04:28 +0000
+++ dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-datadictionary/src/main/webapp/dhis-web-maintenance-datadictionary/javascript/indicator.js	2013-11-28 10:34:47 +0000
@@ -1,3 +1,10 @@
+$(function() {
+  dhis2.contextmenu.makeContextMenu({
+    menuId: 'contextMenu',
+    menuItemActiveClass: 'contextMenuItemActive'
+  });
+});
+
 function exportPDF( type )
 {
 	var params = "type=" + type;
@@ -45,10 +52,10 @@
 // View details
 // -----------------------------------------------------------------------------
 
-function showIndicatorDetails( indicatorId )
+function showIndicatorDetails( context )
 {
     jQuery.get( '../dhis-web-commons-ajax-json/getIndicator.action',
-		{ id: indicatorId }, function( json ) {
+		{ id: context.id }, function( json ) {
 		
 		setInnerHTML( 'nameField', json.indicator.name );
 
@@ -85,7 +92,10 @@
 // Remove indicator
 // -----------------------------------------------------------------------------
 
-function removeIndicator( indicatorId, indicatorName )
-{
-    removeItem( indicatorId, indicatorName, i18n_confirm_delete, 'removeIndicator.action' );
+function removeIndicator( context ) {
+    removeItem( context.id, context.name, i18n_confirm_delete, 'removeIndicator.action' );
+}
+
+function showUpdateIndicatorForm( context ) {
+  location.href = 'showUpdateIndicatorForm.action?id=' + context.id;
 }

=== modified file 'dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-datadictionary/src/main/webapp/dhis-web-maintenance-datadictionary/javascript/indicatorGroup.js'
--- dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-datadictionary/src/main/webapp/dhis-web-maintenance-datadictionary/javascript/indicatorGroup.js	2011-09-27 08:14:59 +0000
+++ dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-datadictionary/src/main/webapp/dhis-web-maintenance-datadictionary/javascript/indicatorGroup.js	2013-11-28 10:34:47 +0000
@@ -1,23 +1,32 @@
+$(function() {
+  dhis2.contextmenu.makeContextMenu({
+    menuId: 'contextMenu',
+    menuItemActiveClass: 'contextMenuItemActive'
+  });
+});
+
 // -----------------------------------------------------------------------------
 // Show Indicator Group details
 // -----------------------------------------------------------------------------
 
-function showIndicatorGroupDetails( indicatorGroupId )
-{
-	jQuery.get( '../dhis-web-commons-ajax-json/getIndicatorGroup.action',
-		{ id: indicatorGroupId }, function( json ) {
-		setInnerHTML( 'nameField', json.indicatorGroup.name );
-		setInnerHTML( 'memberCountField', json.indicatorGroup.memberCount );
+function showIndicatorGroupDetails( context ) {
+  jQuery.get('../dhis-web-commons-ajax-json/getIndicatorGroup.action',
+    { id: context.id }, function( json ) {
+      setInnerHTML('nameField', json.indicatorGroup.name);
+      setInnerHTML('memberCountField', json.indicatorGroup.memberCount);
 
-		showDetails();
-	});
+      showDetails();
+    });
 }
 
 // -----------------------------------------------------------------------------
 // Remove indicator group
 // -----------------------------------------------------------------------------
 
-function removeIndicatorGroup( indicatorGroupId, indicatorGroupName )
-{
-    removeItem( indicatorGroupId, indicatorGroupName, i18n_confirm_delete, 'removeIndicatorGroup.action' );
+function removeIndicatorGroup( context ) {
+  removeItem(context.id, context.name, i18n_confirm_delete, 'removeIndicatorGroup.action');
+}
+
+function showUpdateIndicatorGroupForm( context ) {
+  location.href = 'showUpdateIndicatorGroupForm.action?id=' + context.id;
 }

=== modified file 'dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-datadictionary/src/main/webapp/dhis-web-maintenance-datadictionary/javascript/indicatorGroupSet.js'
--- dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-datadictionary/src/main/webapp/dhis-web-maintenance-datadictionary/javascript/indicatorGroupSet.js	2011-09-27 08:14:59 +0000
+++ dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-datadictionary/src/main/webapp/dhis-web-maintenance-datadictionary/javascript/indicatorGroupSet.js	2013-11-28 10:34:47 +0000
@@ -1,23 +1,32 @@
+$(function() {
+  dhis2.contextmenu.makeContextMenu({
+    menuId: 'contextMenu',
+    menuItemActiveClass: 'contextMenuItemActive'
+  });
+});
+
 // -----------------------------------------------------------------------------
 // Show Indicator Group Set details
 // -----------------------------------------------------------------------------
 
-function showIndicatorGroupSetDetails( id )
-{
-	jQuery.post( '../dhis-web-commons-ajax-json/getIndicatorGroupSet.action',
-		{ id: id }, function( json ) {
-		setInnerHTML( 'nameField', json.indicatorGroupSet.name );
-		setInnerHTML( 'memberCountField', json.indicatorGroupSet.memberCount );
+function showIndicatorGroupSetDetails( context ) {
+  jQuery.post('../dhis-web-commons-ajax-json/getIndicatorGroupSet.action',
+    { id: context.id }, function( json ) {
+      setInnerHTML('nameField', json.indicatorGroupSet.name);
+      setInnerHTML('memberCountField', json.indicatorGroupSet.memberCount);
 
-		showDetails();
-	});
+      showDetails();
+    });
 }
 
 // -----------------------------------------------------------------------------
 // Delete Indicator Group Set
 // -----------------------------------------------------------------------------
 
-function deleteIndicatorGroupSet( groupSetId, groupSetName )
-{
-    removeItem( groupSetId, groupSetName, i18n_confirm_delete, "deleteIndicatorGroupSet.action" );
+function deleteIndicatorGroupSet( context ) {
+  removeItem(context.id, context.name, i18n_confirm_delete, "deleteIndicatorGroupSet.action");
+}
+
+function showUpdateIndicatorGroupSetForm( context ) {
+  location.href = 'openUpdateIndicatorGroupSet.action?id=' + context.id;
 }

=== modified file 'dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-datadictionary/src/main/webapp/dhis-web-maintenance-datadictionary/multidimensional/category.vm'
--- dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-datadictionary/src/main/webapp/dhis-web-maintenance-datadictionary/multidimensional/category.vm	2013-06-29 14:16:34 +0000
+++ dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-datadictionary/src/main/webapp/dhis-web-maintenance-datadictionary/multidimensional/category.vm	2013-11-28 10:34:47 +0000
@@ -1,30 +1,46 @@
 <script type="text/javascript">
 	jQuery(document).ready(function(){	
 		tableSorter( 'categoryList' );	
+
+    dhis2.contextmenu.makeContextMenu({
+      menuId: 'contextMenu',
+      menuItemActiveClass: 'contextMenuItemActive'
+    });
 	});
-	
-	function showDataElementCategoryDetails( categoryId )
-	{
-		jQuery.post( 'getDataElementCategory.action', { id: categoryId } ,
-			function ( json ) {
-			
-				setInnerHTML( 'nameField', json.dataElementCategory.name );    
-				setInnerHTML( 'categoryOptionsCountField', json.dataElementCategory.categoryOptionCount );
-					  
-				showDetails();
-		});
-	}
-	
-	function removeDataElementCategory( categoryId, categoryName )
-	{
-		removeItem( categoryId, categoryName, i18n_confirm_delete, 'removeDataElementCategory.action' );
-	}
-	
+
+  function showDataElementCategoryDetails( context ) {
+    jQuery.post('getDataElementCategory.action', { id: context.id },
+      function( json ) {
+
+        setInnerHTML('nameField', json.dataElementCategory.name);
+        setInnerHTML('categoryOptionsCountField', json.dataElementCategory.categoryOptionCount);
+
+        showDetails();
+      });
+  }
+
+  function removeDataElementCategory( context ) {
+		removeItem( context.id, context.name, i18n_confirm_delete, 'removeDataElementCategory.action' );
+	}
+
+  function showUpdateDataElementCategoryForm( context ) {
+    location.href = 'showUpdateDataElementCategoryForm.action?id=' + context.id;
+  }
+
 	var i18n_confirm_delete = '$encoder.jsEscape( $i18n.getString( "confirm_delete_data_element_category" ) , "'" )';
 </script>
 
 <h3>$i18n.getString( "data_element_category_management" ) #openHelp( "dataElementCategory" )</h3>
 
+<div id="contextMenu" class="contextMenu">
+  <ul id="contextMenuItems" class="contextMenuItems">
+    <li><a data-target-fn="showUpdateDataElementCategoryForm" href="#">$i18n.getString( "edit" )</a></li>
+    <li><a data-target-fn="translateWithContext" href="#">$i18n.getString( "translation_translate" )</a></li>
+    <li><a data-target-fn="removeDataElementCategory" href="#">$i18n.getString( "remove" )</a></li>
+    <li><a data-target-fn="showDataElementCategoryDetails" href="#">$i18n.getString( "show_details" )</a></li>
+  </ul>
+</div>
+
 <table class="mainPageTable">
   <tr>
     <td style="vertical-align:top">
@@ -35,38 +51,31 @@
 			</tr>
 		</table>
       <table class="listTable" id="categoryList">
-          <col/>
-          <col width="120px"/>        
-          <thead>		 
+      <thead>
 			  <tr>
 				<th>$i18n.getString( "name" )</th>
-				<th class="{sorter: false}">$i18n.getString( "operations" )</th>
 			  </tr>
-          </thead>
-          <tbody id="list">
-            #foreach( $dataElementCategory in $dataElementCategories )
-            #if( $dataElementCategory.id != $defaultCategory.id )
-              <tr id="tr${dataElementCategory.id}">                
-                <td onclick="showDataElementCategoryDetails( $dataElementCategory.id )">$encoder.htmlEncode( $dataElementCategory.displayName )</td>
-                <td style="text-align:right">
-					<a href="showUpdateDataElementCategoryForm.action?id=$dataElementCategory.id" title="$i18n.getString( 'edit' )"><img src="../images/edit.png" alt="$i18n.getString( 'edit' )"/></a>
-					<a href="javascript:translate( 'DataElementCategory', '$dataElementCategory.id' )" title="$i18n.getString( 'translation_translate' )"><img src="../images/i18n.png" alt="$i18n.getString( 'translation_translate' )"/></a>
-				    <a href="javascript:removeDataElementCategory( '$dataElementCategory.id', '$encoder.jsEncode( $dataElementCategory.name )' )" title="$i18n.getString( 'remove' )"><img src="../images/delete.png" alt="$i18n.getString( 'remove' )"/></a>
-					<a href="javascript:showDataElementCategoryDetails( $dataElementCategory.id )" title="$i18n.getString( 'show_details' )"><img src="../images/information.png" alt="$i18n.getString( 'show_details' )"/></a>
-				</td>
-              </tr>
-			#end
-            #end
-          </tbody>
+      </thead>
+      <tbody id="list">
+        #foreach( $dataElementCategory in $dataElementCategories )
+        #if( $dataElementCategory.id != $defaultCategory.id )
+        <tr id="tr${dataElementCategory.id}" style="height: 40px;">
+          <td data-id="$!dataElementCategory.id" data-uid="$!dataElementCategory.uid" data-type="DataElementCategory" data-name="$encoder.htmlEncode( $!dataElementCategory.displayName )">
+            $encoder.htmlEncode( $!dataElementCategory.displayName )
+          </td>
+        </tr>
+        #end
+        #end
+      </tbody>
 
-        </table>
+    </table>
 		<p></p>
 		#parse( "/dhis-web-commons/paging/paging.vm" )
     </td>
+
 		<td id="detailsData">
-
-            <div id="detailsArea">
-                <div id="hideDetailsArea">
+      <div id="detailsArea">
+        <div id="hideDetailsArea">
 					<a href="javascript:hideDetails()" title="$i18n.getString( 'hide_details' )"><img src="../images/hide.png" alt="$i18n.getString( 'hide_details' )"/></a>
 				</div>
 				<p><label>$i18n.getString( "name" ):</label><br/><span id="nameField"></span></p>
@@ -74,11 +83,11 @@
 			</div>
 
 			<div id="warningArea">
-                <div id="hideDetailsArea">
-                    <a href="javascript:hideWarning()" title="$i18n.getString( 'hide_warning' )"><img src="../images/hide.png" alt="$i18n.getString( 'hide_warning' )"/></a>
-                </div>
-                <p><span id="warningField"></span></p>
-            </div>
+        <div id="hideDetailsArea">
+          <a href="javascript:hideWarning()" title="$i18n.getString( 'hide_warning' )"><img src="../images/hide.png" alt="$i18n.getString( 'hide_warning' )"/></a>
+        </div>
+        <p><span id="warningField"></span></p>
+      </div>
 
 		</td>
   </tr>

=== modified file 'dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-datadictionary/src/main/webapp/dhis-web-maintenance-datadictionary/multidimensional/categoryCombo.vm'
--- dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-datadictionary/src/main/webapp/dhis-web-maintenance-datadictionary/multidimensional/categoryCombo.vm	2013-06-29 14:16:34 +0000
+++ dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-datadictionary/src/main/webapp/dhis-web-maintenance-datadictionary/multidimensional/categoryCombo.vm	2013-11-28 10:34:47 +0000
@@ -8,6 +8,15 @@
 
 <h3>$i18n.getString( "data_element_category_combo_management" ) #openHelp( "dataElementCategoryCombo" )</h3>
 
+<div id="contextMenu" class="contextMenu">
+  <ul id="contextMenuItems" class="contextMenuItems">
+    <li><a data-target-fn="showUpdateDataElementCategoryComboForm" href="#">$i18n.getString( "edit" )</a></li>
+    <li><a data-target-fn="translateWithContext" href="#">$i18n.getString( "translation_translate" )</a></li>
+    <li><a data-target-fn="removeDataElementCategoryCombo" href="#">$i18n.getString( "remove" )</a></li>
+    <li><a data-target-fn="showDataElementCategoryComboDetails" href="#">$i18n.getString( "show_details" )</a></li>
+  </ul>
+</div>
+
 <table class="mainPageTable">
   <tr>
     <td style="vertical-align:top">
@@ -17,51 +26,44 @@
 				<td colspan="3" style="text-align:right"><input type="button" value="$i18n.getString( 'add_new' )" onclick="window.location.href='showAddDataElementCategoryComboForm.action'"/></td>
 			</tr>
 		</table>
-      <table class="listTable" id="categoryComboList">
-          <col/>
-          <col width="120px"/>        
-          <thead>
-          <tr>
-            <th>$i18n.getString( "name" )</th>
-            <th class="{sorter: false}">$i18n.getString( "operations" )</th>
-          </tr>
-          </thead>
-          <tbody id="list">
-            #foreach( $dataElementCategoryCombo in $dataElementCategoryCombos )
-            #if( $dataElementCategoryCombo.id != $defaultCombo.id )
-              <tr id="tr${dataElementCategoryCombo.id}">
-                <td onclick="showDataElementCategoryComboDetails( $dataElementCategoryCombo.id )">$encoder.htmlEncode( $dataElementCategoryCombo.displayName )</td>
-                <td style="text-align:right">
-					<a href="showUpdateDataElementCategoryComboForm.action?id=$dataElementCategoryCombo.id" title="$i18n.getString( 'edit' )"><img src="../images/edit.png" alt="$i18n.getString( 'edit' )"/></a>
-					<a href="javascript:translate( 'DataElementCategoryCombo', '$dataElementCategoryCombo.id' )" title="$i18n.getString( 'translation_translate' )"><img src="../images/i18n.png" alt="$i18n.getString( 'translation_translate' )"/></a>
-				    <a href="javascript:removeDataElementCategoryCombo( '$dataElementCategoryCombo.id', '$encoder.jsEncode( $dataElementCategoryCombo.displayName )' )" title="$i18n.getString( 'remove' )"><img src="../images/delete.png" alt="$i18n.getString( 'remove' )"/></a>
-					<a href="javascript:showDataElementCategoryComboDetails( $dataElementCategoryCombo.id )" title="$i18n.getString( 'show_details' )"><img src="../images/information.png" alt="$i18n.getString( 'show_details' )"/></a>
-				</td>
-              </tr>
-			#end
-            #end
-          </tbody>
+    <table class="listTable" id="categoryComboList">
+      <thead>
+      <tr>
+        <th>$i18n.getString( "name" )</th>
+      </tr>
+      </thead>
 
-        </table>
+      <tbody id="list">
+        #foreach( $dataElementCategoryCombo in $dataElementCategoryCombos )
+        #if( $dataElementCategoryCombo.id != $defaultCombo.id )
+        <tr id="tr${dataElementCategoryCombo.id}" style="height: 40px;">
+          <td data-id="$!dataElementCategoryCombo.id" data-uid="$!dataElementCategoryCombo.uid" data-type="DataElementCategoryCombo" data-name="$encoder.htmlEncode( $!dataElementCategoryCombo.displayName )">
+            $encoder.htmlEncode( $!dataElementCategoryCombo.displayName )
+          </td>
+        </tr>
+        #end
+        #end
+      </tbody>
+    </table>
 		<p></p>
 		#parse( "/dhis-web-commons/paging/paging.vm" )
     </td>
+
 		<td id="detailsData">
-
-            <div id="detailsArea">
-                <div id="hideDetailsArea">
+      <div id="detailsArea">
+        <div id="hideDetailsArea">
 					<a href="javascript:hideDetails()" title="$i18n.getString( 'hide_details' )"><img src="../images/hide.png" alt="$i18n.getString( 'hide_details' )"/></a>
 				</div>
 				<p><label>$i18n.getString( "name" ):</label><br/><span id="nameField"></span></p>
 				<p><label>$i18n.getString( "number_of_categories" ):</label><br/><span id="dataElementCategoryCountField"></span></p>
 			</div>
 
-            <div id="warningArea">
-                <div id="hideDetailsArea">
-                    <a href="javascript:hideWarning()" title="$i18n.getString( 'hide_warning' )"><img src="../images/hide.png" alt="$i18n.getString( 'hide_warning' )"/></a>
-                </div>
-                <p><span id="warningField"></span></p>
-            </div>
+      <div id="warningArea">
+        <div id="hideDetailsArea">
+          <a href="javascript:hideWarning()" title="$i18n.getString( 'hide_warning' )"><img src="../images/hide.png" alt="$i18n.getString( 'hide_warning' )"/></a>
+        </div>
+        <p><span id="warningField"></span></p>
+      </div>
 			
 		</td>
   </tr>

=== modified file 'dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-datadictionary/src/main/webapp/dhis-web-maintenance-datadictionary/multidimensional/categoryOption.vm'
--- dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-datadictionary/src/main/webapp/dhis-web-maintenance-datadictionary/multidimensional/categoryOption.vm	2013-06-29 14:16:34 +0000
+++ dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-datadictionary/src/main/webapp/dhis-web-maintenance-datadictionary/multidimensional/categoryOption.vm	2013-11-28 10:34:47 +0000
@@ -1,11 +1,15 @@
 <script type="text/javascript">
 	jQuery(document).ready(function(){	
 		tableSorter( 'categoryList' );	
+
+    dhis2.contextmenu.makeContextMenu({
+      menuId: 'contextMenu',
+      menuItemActiveClass: 'contextMenuItemActive'
+    });
 	});
 	
-	function showDataElementCategoryOptionDetails( categoryOptionId )
-	{
-		jQuery.post( 'getDataElementCategoryOption.action', { id: categoryOptionId } ,
+	function showDataElementCategoryOptionDetails( context ) {
+		jQuery.post( 'getDataElementCategoryOption.action', { id: context.id } ,
 			function ( json ) {
 			
 				setInnerHTML( 'nameField', json.dataElementCategoryOption.name );  
@@ -16,16 +20,28 @@
 		});
 	}
 	
-	function removeDataElementCategoryOption( categoryOptionId, categoryName )
-	{
-		removeItem( categoryOptionId, categoryName, i18n_confirm_delete, 'removeDataElementCategoryOption.action' );
+	function removeDataElementCategoryOption( context ) {
+		removeItem( context.id, context.name, i18n_confirm_delete, 'removeDataElementCategoryOption.action' );
 	}
-	
+
+  function showUpdateDataElementCategoryOptionForm( context ) {
+    location.href = 'showUpdateDataElementCategoryOptionForm.action?id=' + context.id;
+  }
+
 	var i18n_confirm_delete = '$encoder.jsEscape( $i18n.getString( "confirm_delete_data_element_category_option" ) , "'" )';
 </script>
 
 <h3>$i18n.getString( "data_element_category_option_management" ) #openHelp( "dataElementCategoryOption" )</h3>
 
+<div id="contextMenu" class="contextMenu">
+  <ul id="contextMenuItems" class="contextMenuItems">
+    <li><a data-target-fn="showUpdateDataElementCategoryOptionForm" href="#">$i18n.getString( "edit" )</a></li>
+    <li><a data-target-fn="translateWithContext" href="#">$i18n.getString( "translation_translate" )</a></li>
+    <li><a data-target-fn="removeDataElementCategoryOption" href="#">$i18n.getString( "remove" )</a></li>
+    <li><a data-target-fn="showDataElementCategoryOptionDetails" href="#">$i18n.getString( "show_details" )</a></li>
+  </ul>
+</div>
+
 <table class="mainPageTable">
   <tr>
     <td style="vertical-align:top">
@@ -36,27 +52,20 @@
 			</tr>
 		</table>
       <table class="listTable" id="categoryList">
-          <col/>
-          <col width="120px"/>        
-          <thead>		 
-			  <tr>
-				<th>$i18n.getString( "name" )</th>
-				<th class="{sorter: false}">$i18n.getString( "operations" )</th>
-			  </tr>
-          </thead>
+        <thead>
+          <tr>
+            <th>$i18n.getString( "name" )</th>
+          </tr>
+        </thead>
           <tbody id="list">
             #foreach( $dataElementCategoryOption in $dataElementCategoryOptions )
             #if( $dataElementCategoryOption.id != $defaultCategory.id )
-              <tr id="tr${dataElementCategoryOption.id}">                
-                <td onclick="showDataElementCategoryOptionDetails( $dataElementCategoryOption.id )">$encoder.htmlEncode( $dataElementCategoryOption.displayName )</td>
-                <td style="text-align:right">
-					<a href="showUpdateDataElementCategoryOptionForm.action?id=$dataElementCategoryOption.id" title="$i18n.getString( 'edit' )"><img src="../images/edit.png" alt="$i18n.getString( 'edit' )"/></a>
-					<a href="javascript:translate( 'DataElementCategoryOption', '$dataElementCategoryOption.id' )" title="$i18n.getString( 'translation_translate' )"><img src="../images/i18n.png" alt="$i18n.getString( 'translation_translate' )"/></a>
-				    <a href="javascript:removeDataElementCategoryOption( '$dataElementCategoryOption.id', '$encoder.jsEncode( $dataElementCategoryOption.name )' )" title="$i18n.getString( 'remove' )"><img src="../images/delete.png" alt="$i18n.getString( 'remove' )"/></a>
-					<a href="javascript:showDataElementCategoryOptionDetails( $dataElementCategoryOption.id )" title="$i18n.getString( 'show_details' )"><img src="../images/information.png" alt="$i18n.getString( 'show_details' )"/></a>
-				</td>
+              <tr id="tr${dataElementCategoryOption.id}" style="height: 40px;">
+                <td data-id="$!dataElementCategoryOption.id" data-uid="$!dataElementCategoryOption.uid" data-type="DataElementCategoryOption" data-name="$encoder.htmlEncode( $!dataElementCategoryOption.displayName )">
+                  $encoder.htmlEncode( $!dataElementCategoryOption.displayName )
+                </td>
               </tr>
-			#end
+			      #end
             #end
           </tbody>
 
@@ -64,23 +73,23 @@
 		<p></p>
 		#parse( "/dhis-web-commons/paging/paging.vm" )
     </td>
+
 		<td id="detailsData">
-
-            <div id="detailsArea">
-                <div id="hideDetailsArea">
+      <div id="detailsArea">
+        <div id="hideDetailsArea">
 					<a href="javascript:hideDetails()" title="$i18n.getString( 'hide_details' )"><img src="../images/hide.png" alt="$i18n.getString( 'hide_details' )"/></a>
 				</div>
-				<p><label>$i18n.getString( "name" ):</label><br/><span id="nameField"></span></p>
+        <p><label>$i18n.getString( "name" ):</label><br/><span id="nameField"></span></p>
 				<p><label>$i18n.getString( "code" ):</label><br/><span id="codeField"></span></p>
 				<p><label>$i18n.getString( "concept" ):</label><br/><span id="conceptField"></span></p>
 			</div>
 
-			<div id="warningArea">
-                <div id="hideDetailsArea">
-                    <a href="javascript:hideWarning()" title="$i18n.getString( 'hide_warning' )"><img src="../images/hide.png" alt="$i18n.getString( 'hide_warning' )"/></a>
-                </div>
-                <p><span id="warningField"></span></p>
-            </div>
+      <div id="warningArea">
+        <div id="hideDetailsArea">
+          <a href="javascript:hideWarning()" title="$i18n.getString( 'hide_warning' )"><img src="../images/hide.png" alt="$i18n.getString( 'hide_warning' )"/></a>
+        </div>
+        <p><span id="warningField"></span></p>
+      </div>
 
 		</td>
   </tr>

=== modified file 'dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-datadictionary/src/main/webapp/dhis-web-maintenance-datadictionary/multidimensional/concept.vm'
--- dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-datadictionary/src/main/webapp/dhis-web-maintenance-datadictionary/multidimensional/concept.vm	2013-11-27 17:34:02 +0000
+++ dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-datadictionary/src/main/webapp/dhis-web-maintenance-datadictionary/multidimensional/concept.vm	2013-11-28 10:34:47 +0000
@@ -28,8 +28,6 @@
 				</tr>
 			</table>
 			<table class="listTable" id="listTable">
-				<col/>
-				<col width="96px"/>			
         <thead>
 				<tr>
 					<th>$i18n.getString( "name" )</th>
@@ -39,8 +37,8 @@
 				#foreach( $concept in $concepts )
 				#if( $concept.id != $defaultConcept.id )
 				<tr id="tr${concept.id}" style="height: 40px;">
-          <td data-id="$!concept.id" data-uid="$!concept.uid" data-name="$encoder.htmlEncode( $!concept.name )">
-            $encoder.htmlEncode( $!concept.name )
+          <td data-id="$!concept.id" data-uid="$!concept.uid" data-type="Concept" data-name="$encoder.htmlEncode( $!concept.displayName )">
+            $encoder.htmlEncode( $!concept.displayName )
           </td>
 				</tr>
 				#end