[Fusionforge-commits] FusionForge branch master updated. 21ff1f6bb4a439911257dac746f94d764095cdd3

Franck VILLAUME nerville at fusionforge.org
Tue Jan 15 20:10:17 CET 2013


This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "FusionForge".

The branch, master has been updated
       via  21ff1f6bb4a439911257dac746f94d764095cdd3 (commit)
       via  700e8885c3410d929b0174ae80309037ec10c9a8 (commit)
       via  9c404318436869742830c56cdfae74f4594c3138 (commit)
       via  d4975824d3f65c38b3c22ccfeded2ca433529913 (commit)
       via  f45038b0b4d3bc943ca277b587a46a32324d6b4a (commit)
       via  36d28c8de4839c160522e42e59a5f56d3d78fcac (commit)
       via  78e2cbd8e6709a0aba61f26aae72705088704612 (commit)
       via  660eaf89a682fbb8727165f583d5d82b99a180b2 (commit)
       via  eb0a6104efc8ffbd6f67f2a7a76286c7983464df (commit)
       via  6a44cd505b5eb46d5ed38882703edb141454571f (commit)
       via  2994be8618749e07c596e2b4da4e829aaf807db6 (commit)
       via  09012df4b26cf75305c7de60deaaa3cf969c9b5b (commit)
       via  4bcb05caa64ce606518aad696088d6e8caf7471c (commit)
       via  f4e778bf303f0aa287527a7e3f23de31d6c4943c (commit)
       via  b854f04d54b029ec0b0396f09c00f4bb8e5805b4 (commit)
       via  e0f49ffc3936fbe02bbb56690dbfed471452d51c (commit)
       via  046e73e007b1c05c7d62e4ab4811b8e67965cb88 (commit)
       via  9ecc5a34d1e6334e74f4a65f0cb7c2efd85d0668 (commit)
       via  33373c31732e65bb72bc39af948d42c242ddcded (commit)
       via  a3485c5bffcc054a8ca85ba1d4cf709780a09fcc (commit)
       via  161ce1192d9e64e99373f8e4cf7d5a6b78481887 (commit)
       via  e3ef7e0aa6ec1a92234e8c8c23ceb553cc2ff5f1 (commit)
       via  b14742c3b98ea23256f1c56cd481d92584291686 (commit)
       via  dc3f2903587ec46ec93eb097570369dfcbb91b5c (commit)
       via  b8a7855ee06bfb2160fe487a7c5bc565b2e78da2 (commit)
       via  b41cc64626e4e2fb6744e03f6bc39850b184bbed (commit)
       via  13f7262281106ed01c3259f45119a2d6a17c994f (commit)
       via  5b3fbc221f096665e1a3e967a4495d2a9453a320 (commit)
       via  6d60197369a9b316e091a432694dcf4e7ae4a415 (commit)
       via  6156169f1c31de2ffeaee1dafe85a0899b1ae6ab (commit)
       via  6fc185ab350b26a08d3839a2fadabf87e04fab43 (commit)
       via  f80aac50f0a246ad1705b8be2456f1cb7ffc3baa (commit)
       via  356fb8d91329bd65707005944cb350204a03d749 (commit)
       via  4b7db1ddc9540b01c2d38d2d902f6683e8b0d02b (commit)
       via  0676f91ca5a269efa210e5289bfe620c17fc78ff (commit)
       via  9e0e04dff8611a9ef54cb1aebc15f5bf39bdcc27 (commit)
       via  510cfd1b0071ea11194c76703f826b52931f7afc (commit)
       via  95e8d0dba6024c5c516ba47e4f002e9c8b2a5fed (commit)
       via  bf6274fedc2bf22c8a6fb8cc2415be5ff0a813d0 (commit)
       via  ee21d1af607f69e77f2c286741bb8f2ed8b8dca5 (commit)
       via  863f4122d1326a5a84d2d4a7b3c98d16982d3d56 (commit)
       via  b61dd5050669f424f12cb3460a2e4efd31cd0bf5 (commit)
       via  47a023494ec03b3170323af2d7b2f26c822048ed (commit)
       via  d90024436d97c13abebf025805b5fdbdfa2c5369 (commit)
       via  38ed5b26b6bf50ec9ab7303801e653d0931631bf (commit)
       via  7fb9c047dfbb1a2955d05e5ce1e7331bb8ff8c53 (commit)
       via  b21914ec31b87090c11f695f6516fea78048fe0c (commit)
       via  68fedbdceeefb3dd150bc17716ed42c38113a2d2 (commit)
       via  c7d4bb39139657319f495da779b8f7240475387b (commit)
       via  5836376760c33cecab4544c81d965dab2a66fc00 (commit)
       via  fa0d0f67cff1d7bb584eb7856724d1d856c8d9e4 (commit)
       via  86e98658a8503aaad70fa83a817551621d5cd894 (commit)
       via  6d8f34ada705fdd2d80ee9c00b16e7fffc9dc1e4 (commit)
       via  b8095e7efe4eb9f16b2e1d0188ebd515a5b3cd14 (commit)
       via  687a99794dae78f8f15f9549aba4aaf374ea5921 (commit)
       via  9dfc706aae1b800bab11d0ee940e6f122d92453b (commit)
       via  d82bd7925756e9ccf1ef0dd11c526f873e1d48e3 (commit)
       via  7269f4e7f0a482451a39f18fd5d344c7464f7f97 (commit)
       via  891bbfe5190026f00fc79ebec3f55506dd7339a5 (commit)
       via  224a9968b217024983e6de3a3daada4b9b53c33f (commit)
       via  0c7306f17fcd2fd7ca0c17eed7581664b02e436f (commit)
       via  cc69f88e9f1c13853fee77a949a9a200834346e5 (commit)
       via  7dcccf40805eb273d6ddb5db0409ee63590d1c5e (commit)
       via  f5c6dc80afa6c3c7a100af72e570b53d5c3db232 (commit)
       via  b41d7debabd7b193cc82ba6ec3fc2552d20d7737 (commit)
       via  6adf0b8d6a4feff910a2d0a70aaa028cab476e46 (commit)
       via  daed2417204c4366af722e84303ac39f882cef6b (commit)
      from  499bb4bd02e37e166330a3ff01674c31d733915b (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------
commit 21ff1f6bb4a439911257dac746f94d764095cdd3
Author: Franck Villaume <franck.villaume at trivialdev.com>
Date:   Tue Jan 15 20:07:59 2013 +0100

    fix updateLinkValue action

diff --git a/src/plugins/headermenu/action/addLink.php b/src/plugins/headermenu/action/addLink.php
index d6333d9..67f9caf 100644
--- a/src/plugins/headermenu/action/addLink.php
+++ b/src/plugins/headermenu/action/addLink.php
@@ -32,7 +32,7 @@ $htmlcode = getStringFromRequest('htmlcode');
 $type = getStringFromRequest('type');
 $iframed = getIntFromRequest('iframeview');
 
-$redirect_url = 'plugins/'.$headermenu->name.'/?type='.$type;
+$redirect_url = '/plugins/'.$headermenu->name.'/?type='.$type;
 if (isset($group_id) && $group_id) {
 	$redirect_url .= '&group_id='.$group_id;
 }
diff --git a/src/plugins/headermenu/action/updateLinkValue.php b/src/plugins/headermenu/action/updateLinkValue.php
index 69679db..70cbcb5 100644
--- a/src/plugins/headermenu/action/updateLinkValue.php
+++ b/src/plugins/headermenu/action/updateLinkValue.php
@@ -2,7 +2,7 @@
 /**
  * headermenu plugin : updateLinkValue action
  *
- * Copyright 2012, Franck Villaume - TrivialDev
+ * Copyright 2012-2013, Franck Villaume - TrivialDev
  * http://fusionforge.org
  *
  * This file is part of FusionForge. FusionForge is free software;
@@ -22,6 +22,7 @@
  */
 
 global $headermenu;
+global $group_id;
 
 $idLink = getIntFromRequest('linkid');
 $link = getStringFromRequest('link');
@@ -32,6 +33,11 @@ $linkmenu = getStringFromRequest('linkmenu');
 $htmlcode = getStringFromRequest('htmlcode');
 $type = getStringFromRequest('type');
 
+$redirect_url = '/plugins/'.$headermenu->name.'/?type='.$type;
+if (isset($group_id) && $group_id) {
+	$redirect_url .= '&group_id='.$group_id;
+}
+
 if (!empty($idLink) && !empty($name)) {
 	switch ($linkmenu) {
 		case 'headermenu': {
@@ -39,17 +45,17 @@ if (!empty($idLink) && !empty($name)) {
 				if (util_check_url($link)) {
 					if ($headermenu->updateLink($idLink, $link, $name, $description, $linkmenu)) {
 						$feedback = _('Task succeeded.');
-						session_redirect('plugins/'.$headermenu->name.'/?type='.$type.'&feedback='.urlencode($feedback));
+						session_redirect($redirect_url.'&feedback='.urlencode($feedback));
 					}
 					$error_msg = _('Task failed');
-					session_redirect('plugins/'.$headermenu->name.'/?type='.$type.'&error_msg='.urlencode($error_msg));
+					session_redirect($redirect_url.'&error_msg='.urlencode($error_msg));
 				} else {
 					$error_msg = _('Provided Link is not a valid URL.');
-					session_redirect('plugins/'.$headermenu->name.'/?type='.$type.'&error_msg='.urlencode($error_msg));
+					session_redirect($redirect_url.'&error_msg='.urlencode($error_msg));
 				}
 			}
 			$warning_msg = _('Missing Link URL.');
-			session_redirect('plugins/'.$headermenu->name.'/?type='.$type.'&warning_msg='.urlencode($warning_msg));
+			session_redirect($redirect_url.'&warning_msg='.urlencode($warning_msg));
 			break;
 		}
 		case 'outermenu':
@@ -58,27 +64,27 @@ if (!empty($idLink) && !empty($name)) {
 				if (util_check_url($link)) {
 					if ($headermenu->updateLink($idLink, $link, $name, $description, $linkmenu, $typemenu)) {
 						$feedback = _('Task succeeded.');
-						session_redirect('plugins/'.$headermenu->name.'/?type='.$type.'&feedback='.urlencode($feedback));
+						session_redirect($redirect_url.'&feedback='.urlencode($feedback));
 					}
 					$error_msg = _('Task failed');
-					session_redirect('plugins/'.$headermenu->name.'/?type='.$type.'&error_msg='.urlencode($error_msg));
+					session_redirect($redirect_url.'&error_msg='.urlencode($error_msg));
 				} else {
 					$error_msg = _('Provided Link is not a valid URL.');
-					session_redirect('plugins/'.$headermenu->name.'/?type='.$type.'&error_msg='.urlencode($error_msg));
+					session_redirect($redirect_url.'&error_msg='.urlencode($error_msg));
 				}
 			}
 			if (!empty($htmlcode) && $typemenu == 'htmlcode') {
 				if ($headermenu->updateLink($idLink, '', $name, $description, $linkmenu, 'htmlcode', $htmlcode)) {
 					$feedback = _('Task succeeded.');
-					session_redirect('plugins/'.$headermenu->name.'/?type='.$type.'&feedback='.urlencode($feedback));
+					session_redirect($redirect_url.'&feedback='.urlencode($feedback));
 				}
 				$error_msg = _('Task failed');
-				session_redirect('plugins/'.$headermenu->name.'/?type='.$type.'&error_msg='.urlencode($error_msg));
+				session_redirect($redirect_url.'&error_msg='.urlencode($error_msg));
 			}
 			$warning_msg = _('Missing Link URL or Html Code.');
-			session_redirect('plugins/'.$headermenu->name.'/?type='.$type.'&warning_msg='.urlencode($warning_msg));
+			session_redirect($redirect_url.'&warning_msg='.urlencode($warning_msg));
 		}
 	}
 }
 $warning_msg = _('No link to update or name missing.');
-session_redirect('plugins/'.$headermenu->name.'/?type='.$type.'&warning_msg='.urlencode($warning_msg));
+session_redirect($redirect_url.'&warning_msg='.urlencode($warning_msg));
diff --git a/src/plugins/headermenu/view/admin/updateLinkValue.php b/src/plugins/headermenu/view/admin/updateLinkValue.php
index 4b2e884..15e1db0 100644
--- a/src/plugins/headermenu/view/admin/updateLinkValue.php
+++ b/src/plugins/headermenu/view/admin/updateLinkValue.php
@@ -1,6 +1,6 @@
 <?php
 /**
- * headermenuPlugin Class
+ * headermenu plugin : updateLinkValue view
  *
  * Copyright 2012-2013, Franck Villaume - TrivialDev
  * http://fusionforge.org
@@ -24,8 +24,15 @@
 global $HTML;
 global $headermenu;
 global $type;
+global $group_id;
 
 $linkId = getIntFromRequest('linkid');
+$redirect_url = '/plugins/'.$headermenu->name.'/?type='.$type;
+$action_url = 'index.php?type='.$type.'&action=updateLinkValue';
+if (isset($group_id) && $group_id) {
+	$redirect_url .= '&group_id='.$group_id;
+	$action_url .= '&group_id='.$group_id;
+}
 ?>
 
 <script language="Javascript" type="text/javascript">//<![CDATA[
@@ -48,7 +55,7 @@ jQuery(document).ready(function() {
 <?php
 $linkValues = $headermenu->getLink($linkId);
 if (is_array($linkValues)) {
-	echo '<form method="POST" name="updateLink" action="index.php?type='.$type.'&action=updateLinkValue">';
+	echo '<form method="POST" name="updateLink" action="'.$action_url.'">';
 	echo '<table><tr>';
 	echo $HTML->boxTop(_('Update this link'));
 	echo '<td>'._('Displayed Name').'</td><td><input name="name" type="text" maxsize="255" value="'.$linkValues['name'].'" /></td>';
@@ -95,12 +102,12 @@ if (is_array($linkValues)) {
 	echo '<td>';
 	echo '<input type="hidden" name="linkid" value="'.$linkId.'" />';
 	echo '<input type="submit" value="'. _('Update') .'" />';
-	echo '<a href="/plugins/'.$headermenu->name.'/?type='.$type.'"><input type="button" value="'. _('Cancel') .'" /></a>';
+	echo '<a href="'.$redirect_url.'"><input type="button" value="'. _('Cancel') .'" /></a>';
 	echo '</td>';
 	echo $HTML->boxBottom();
 	echo '</tr></table>';
 	echo '</form>';
 } else {
 	$error_msg = _('Cannot retrieve value for this link:').' '.$linkId;
-	session_redirect('plugins/'.$headermenu->name.'/?type='.$type.'&error_msg='.urlencode($error_msg));
+	session_redirect($redirect_url.'&error_msg='.urlencode($error_msg));
 }

commit 700e8885c3410d929b0174ae80309037ec10c9a8
Author: Franck Villaume <franck.villaume at trivialdev.com>
Date:   Tue Jan 15 00:42:15 2013 +0100

    fix js syntax

diff --git a/src/plugins/headermenu/www/scripts/HeaderMenuController.js b/src/plugins/headermenu/www/scripts/HeaderMenuController.js
index 77ef7d8..f50e1da 100644
--- a/src/plugins/headermenu/www/scripts/HeaderMenuController.js
+++ b/src/plugins/headermenu/www/scripts/HeaderMenuController.js
@@ -107,7 +107,7 @@ HeaderMenuController.prototype =
 					action:		'validateOrder',
 					linkorder:	linkOrder,
 					type:		'globaladmin'
-				}
+				},
 				jQuery.proxy(function(data) {
 						jQuery('.feedback').remove();
 						jQuery('.error').remove();
@@ -128,7 +128,7 @@ HeaderMenuController.prototype =
 					action:		'validateOrder',
 					linkorder:	linkOrder,
 					type:		'globaladmin'
-				}
+				},
 				jQuery.proxy(function(data) {
 						jQuery('.feedback').remove();
 						jQuery('.error').remove();

commit 9c404318436869742830c56cdfae74f4594c3138
Merge: d497582 6156169
Author: Franck Villaume <franck.villaume at trivialdev.com>
Date:   Tue Jan 15 00:34:26 2013 +0100

    rebase master


commit d4975824d3f65c38b3c22ccfeded2ca433529913
Author: Franck Villaume <franck.villaume at trivialdev.com>
Date:   Mon Jan 14 23:44:56 2013 +0100

    modify CHANGES entry

diff --git a/src/CHANGES b/src/CHANGES
index 630233a..8dee1ba 100644
--- a/src/CHANGES
+++ b/src/CHANGES
@@ -15,8 +15,7 @@ FusionForge-5.3:
 * Docman: add report view as in FRS (TrivialDev)
 
 Plugins:
-* headermenu: new plugin to handle links in headermenu, outermenu & groupmenu
-              replace the old extratabs plugin (TrivialDev)
+* headermenu: new plugin to handle links in headermenu, outermenu & groupmenu (TrivialDev)
 * scmgit: add browsing capability for user personal repository (TrivialDev)
 * scmgit: basic activity support (TrivialDev).
 * scmgit: multiple repositories per project (developed for/sponsored by AdaCore)

commit f45038b0b4d3bc943ca277b587a46a32324d6b4a
Author: Franck Villaume <franck.villaume at trivialdev.com>
Date:   Mon Jan 14 22:57:18 2013 +0100

    better ajax handling

diff --git a/src/plugins/headermenu/view/admin/viewGlobalConfiguration.php b/src/plugins/headermenu/view/admin/viewGlobalConfiguration.php
index f6172f8..a7dde3b 100644
--- a/src/plugins/headermenu/view/admin/viewGlobalConfiguration.php
+++ b/src/plugins/headermenu/view/admin/viewGlobalConfiguration.php
@@ -41,6 +41,10 @@ jQuery(document).ready(function() {
 		tableHeaTbLink: jQuery('.sortable_headermenu_listlinks tbody'),
 		validOutButton:	jQuery('#linkorderoutervalidatebutton'),
 		validHeaButton:	jQuery('#linkorderheadervalidatebutton'),
+		validMessOut:	'<?php echo _('Outermenu Link Order successfully validated') ?>',
+		validMessHea:	'<?php echo _('Headermenu Link Order successfully validated') ?>',
+		errMessOut:	'<?php echo _('Error in Outermenu Link Order validation') ?>',
+		errMessHea:	'<?php echo _('Error in Headermenu Link Order validation') ?>',
 	});
 });
 
diff --git a/src/plugins/headermenu/view/admin/viewProjectConfiguration.php b/src/plugins/headermenu/view/admin/viewProjectConfiguration.php
index 75d671c..d119f70 100644
--- a/src/plugins/headermenu/view/admin/viewProjectConfiguration.php
+++ b/src/plugins/headermenu/view/admin/viewProjectConfiguration.php
@@ -40,7 +40,9 @@ jQuery(document).ready(function() {
 		tableTbodyLink:	jQuery('#sortable tbody'),
 		validateButton:	jQuery('#linkordervalidatebutton'),
 		groupId:	'<?php echo $group_id ?>',
-		headerMenuUrl:	'<?php util_make_uri("/plugins/headermenu") ?>'
+		headerMenuUrl:	'<?php util_make_uri("/plugins/headermenu") ?>',
+		validMessage:	'<?php echo _('Link Order successfully validated') ?>',
+		errorMessage:	'<?php echo _('Error in Link Order validation') ?>',
 	});
 });
 
diff --git a/src/plugins/headermenu/www/scripts/HeaderMenuController.js b/src/plugins/headermenu/www/scripts/HeaderMenuController.js
index 608bf4c..77ef7d8 100644
--- a/src/plugins/headermenu/www/scripts/HeaderMenuController.js
+++ b/src/plugins/headermenu/www/scripts/HeaderMenuController.js
@@ -102,26 +102,44 @@ HeaderMenuController.prototype =
 
 	validateOutLinkOrder: function() {
 		var linkOrder = jQuery(".sortable_outermenu_listlinks tbody").sortable('toArray').toString();
-		jQuery.get(this.params.headerMenuUrl, {
-				action:		'validateOrder',
-				linkorder:	linkOrder,
-				type:		'globaladmin'
-			});
-		jQuery('#validateLinkFeedback').remove();
-		jQuery('#maindiv').prepend('<p id="validateLinkFeedback" class="feedback">Outermenu Link Order successfully validated</p>');
-		this.params.validOutButton.hide();
+		jQuery.get(this.params.headerMenuUrl,
+				{
+					action:		'validateOrder',
+					linkorder:	linkOrder,
+					type:		'globaladmin'
+				}
+				jQuery.proxy(function(data) {
+						jQuery('.feedback').remove();
+						jQuery('.error').remove();
+						if (data == 0) {
+							jQuery('#maindiv').prepend('<p id="validateLinkMessage" class="feedback">'+this.params.validMessOut+'</p>');
+						} else {
+							jQuery('#maindiv').prepend('<p id="validateLinkMessage" class="error">'+this.params.errMessOut+'</p>');
+						}
+						this.params.validateButton.hide();
+					}, this)
+			);
 	},
 
 	validateHeaLinkOrder: function() {
 		var linkOrder = jQuery(".sortable_headermenu_listlinks tbody").sortable('toArray').toString();
-		jQuery.get(this.params.headerMenuUrl, {
-				action:		'validateOrder',
-				linkorder:	linkOrder,
-				type:		'globaladmin'
-			});
-		jQuery('#validateLinkFeedback').remove();
-		jQuery('#maindiv').prepend('<p id="validateLinkFeedback" class="feedback">Headermenu Link Order successfully validated</p>');
-		this.params.validHeaButton.hide();
+		jQuery.get(this.params.headerMenuUrl,
+				{
+					action:		'validateOrder',
+					linkorder:	linkOrder,
+					type:		'globaladmin'
+				}
+				jQuery.proxy(function(data) {
+						jQuery('.feedback').remove();
+						jQuery('.error').remove();
+						if (data == 0) {
+							jQuery('#maindiv').prepend('<p id="validateLinkMessage" class="feedback">'+this.params.validMessHea+'</p>');
+						} else {
+							jQuery('#maindiv').prepend('<p id="validateLinkMessage" class="error">'+this.params.errMessHea+'</p>');
+						}
+						this.params.validateButton.hide();
+					}, this)
+			);
 	},
 };
 
@@ -172,15 +190,25 @@ GroupMenuController.prototype =
 
 	validateProjectLinkOrder: function() {
 		var linkOrder = jQuery("#sortable tbody").sortable('toArray').toString();
-		jQuery.get(this.params.headerMenuUrl, {
-				group_id:	this.params.groupId,
-				action:		'validateOrder',
-				linkorder:	linkOrder,
-				type:		'projectadmin'
-			});
-		jQuery('#validateLinkFeedback').remove();
-		jQuery('#maindiv').prepend('<p id="validateLinkFeedback" class="feedback">Link Order successfully validated</p>');
-		this.params.validateButton.hide();
+		jQuery.get(this.params.headerMenuUrl,
+				{
+					group_id:	this.params.groupId,
+					action:		'validateOrder',
+					linkorder:	linkOrder,
+					type:		'projectadmin'
+				},
+				jQuery.proxy(function(data) {
+						jQuery('.feedback').remove();
+						jQuery('.error').remove();
+						if (data == 0) {
+							jQuery('#maindiv').prepend('<p id="validateLinkMessage" class="feedback">'+this.params.validMessage+'</p>');
+						} else {
+							jQuery('#maindiv').prepend('<p id="validateLinkMessage" class="error">'+this.params.errorMessage+'</p>');
+						}
+						this.params.validateButton.hide();
+					}, this)
+			);
+
 	},
 };
 

commit 36d28c8de4839c160522e42e59a5f56d3d78fcac
Author: Franck Villaume <franck.villaume at trivialdev.com>
Date:   Sun Jan 6 22:32:40 2013 +0100

    support ordering in globaladmin view

diff --git a/src/plugins/headermenu/view/admin/viewGlobalConfiguration.php b/src/plugins/headermenu/view/admin/viewGlobalConfiguration.php
index d3a6da4..f6172f8 100644
--- a/src/plugins/headermenu/view/admin/viewGlobalConfiguration.php
+++ b/src/plugins/headermenu/view/admin/viewGlobalConfiguration.php
@@ -2,7 +2,7 @@
 /**
  * headermenu : viewGlobalConfiguration page
  *
- * Copyright 2012 Franck Villaume - TrivialDev
+ * Copyright 2012-2013, Franck Villaume - TrivialDev
  * http://fusionforge.org
  *
  * This file is part of FusionForge. FusionForge is free software;
@@ -37,21 +37,29 @@ jQuery(document).ready(function() {
 		inputOuter:	jQuery('#linkmenu_outermenu'),
 		trHtmlCode:	jQuery('#htmlcode'),
 		trUrlCode:	jQuery('#urlcode'),
-		tableTbodyLink:	jQuery('#sortable tbody')
+		tableOutTbLink:	jQuery('.sortable_outermenu_listlinks tbody'),
+		tableHeaTbLink: jQuery('.sortable_headermenu_listlinks tbody'),
+		validOutButton:	jQuery('#linkorderoutervalidatebutton'),
+		validHeaButton:	jQuery('#linkorderheadervalidatebutton'),
 	});
 });
 
 //]]></script>
 
 <?php
-$linksArray = $headermenu->getAvailableLinks('headermenu');
-if (sizeof($linksArray)) {
+$linksHeaderMenuArray = $headermenu->getAvailableLinks('headermenu');
+$linksOuterMenuArray = $headermenu->getAvailableLinks('outermenu');
+
+if (sizeof($linksHeaderMenuArray) || sizeof($linksOuterMenuArray)) {
+	echo '<p class="information">'. _('You can reorder links, just drag & drop rows in the table below and save order. Please note that those extra tabs can only appear after the standard tabs. And you can only move them inside the set of extra tabs.').'</p>';
+}
+if (sizeof($linksHeaderMenuArray)) {
 	echo $HTML->boxTop(_('Manage available links in headermenu'));
-	$tabletop = array( _('Menu Type'), _('Displayed Name'), _('Description'), _('Status'), _('Actions'));
-	$classth = array('','','','','unsortable');
+	$tabletop = array(_('Order'), _('Menu Type'), _('Displayed Name'), _('Description'), _('Status'), _('Actions'));
+	$classth = array('', '', '', '', '', 'unsortable');
 	echo $HTML->listTableTop($tabletop, false, 'sortable_headermenu_listlinks', 'sortable', $classth);
-	foreach ($linksArray as $link) {
-		echo '<tr>';
+	foreach ($linksHeaderMenuArray as $link) {
+		echo '<tr id="'.$link['id_headermenu'].'" ><td>'.$link['ordering'].'</td>';
 		if (strlen($link['url']) > 0) {
 			echo '<td>'._('URL').' ('.htmlspecialchars($link['url']).')</td>';
 		} else {
@@ -73,17 +81,20 @@ if (sizeof($linksArray)) {
 	}
 	echo $HTML->listTableBottom();
 	echo $HTML->boxBottom();
+	echo '<input type="button" id="linkorderheadervalidatebutton" value="'._('Save Order').'" style="display:none;" />';
 	echo '</br>';
+} else {
+	echo '<p class="information">'._('No links available for headermenu').'</p>';
 }
 
-$linksArray = $headermenu->getAvailableLinks('outermenu');
-if (sizeof($linksArray)) {
+
+if (sizeof($linksOuterMenuArray)) {
 	echo $HTML->boxTop(_('Manage available links in outermenu'));
-	$tabletop = array(_('Menu Type'), _('Displayed Name'), _('Description'), _('Status'), _('Actions'));
-	$classth = array('','','','','unsortable');
+	$tabletop = array(_('Order'), _('Menu Type'), _('Displayed Name'), _('Description'), _('Status'), _('Actions'));
+	$classth = array('', '', '', '', '', 'unsortable');
 	echo $HTML->listTableTop($tabletop, false, 'sortable_outermenu_listlinks', 'sortable', $classth);
-	foreach ($linksArray as $link) {
-		echo '<tr>';
+	foreach ($linksOuterMenuArray as $link) {
+		echo '<tr id="'.$link['id_headermenu'].'" ><td>'.$link['ordering'].'</td>';
 		if (strlen($link['url']) > 0) {
 			echo '<td>'._('URL').' ('.htmlspecialchars($link['url']).')</td>';
 		} else {
@@ -105,9 +116,13 @@ if (sizeof($linksArray)) {
 	}
 	echo $HTML->listTableBottom();
 	echo $HTML->boxBottom();
+	echo '<input type="button" id="linkorderoutervalidatebutton" value="'._('Save Order').'" style="display:none;" />';
 	echo '</br>';
+} else {
+	echo '<p class="information">'._('No links available for outermenu').'</p>';
 }
 
+echo '<p class="information">'._('You can add specific tabs in outermenu (main tab) or headermenu (next to the login) with the form below.').'</p>';
 echo '<form method="POST" name="addLink" action="index.php?type=globaladmin&action=addLink">';
 echo '<table><tr>';
 echo $HTML->boxTop(_('Add a new link'));
diff --git a/src/plugins/headermenu/view/admin/viewProjectConfiguration.php b/src/plugins/headermenu/view/admin/viewProjectConfiguration.php
index 7ddde72..75d671c 100644
--- a/src/plugins/headermenu/view/admin/viewProjectConfiguration.php
+++ b/src/plugins/headermenu/view/admin/viewProjectConfiguration.php
@@ -52,7 +52,7 @@ if (sizeof($linksArray)) {
 	echo '<p class="information">'. _('You can reorder links, just drag & drop rows in the table below and save order. Please note that those extra tabs can only appear after the standard tabs. And you can only move them inside the set of extra tabs.').'</p>';
 	echo $HTML->boxTop(_('Manage available links'));
 	$tabletop = array(_('Order'), _('Menu Type'), _('Displayed Name'), _('Description'), _('Status'), _('Actions'));
-	$classth = array('', '','','','','unsortable');
+	$classth = array('', '', '', '', '', 'unsortable');
 	echo $HTML->listTableTop($tabletop, false, 'sortable_headermenu_listlinks', 'sortable', $classth);
 	foreach ($linksArray as $link) {
 		echo '<tr id="'.$link['id_headermenu'].'" ><td>'.$link['ordering'].'</td>';
@@ -81,7 +81,7 @@ if (sizeof($linksArray)) {
 	}
 	echo $HTML->listTableBottom();
 	echo $HTML->boxBottom();
-	echo '<input type="button" id="linkordervalidatebutton" value="'._('Validate Order').'" style="display:none;" />';
+	echo '<input type="button" id="linkordervalidatebutton" value="'._('Save Order').'" style="display:none;" />';
 	echo '</br>';
 }
 
diff --git a/src/plugins/headermenu/www/index.php b/src/plugins/headermenu/www/index.php
index 7d09739..a0ed5fa 100644
--- a/src/plugins/headermenu/www/index.php
+++ b/src/plugins/headermenu/www/index.php
@@ -45,7 +45,8 @@ switch ($type) {
 			case 'addLink':
 			case 'updateLinkValue':
 			case 'deleteLink':
-			case 'updateLinkStatus': {
+			case 'updateLinkStatus':
+			case 'validateOrder': {
 				global $gfplugins;
 				include($gfplugins.$headermenu->name.'/action/'.$action.'.php');
 				break;
diff --git a/src/plugins/headermenu/www/scripts/HeaderMenuController.js b/src/plugins/headermenu/www/scripts/HeaderMenuController.js
index 5ae0d34..608bf4c 100644
--- a/src/plugins/headermenu/www/scripts/HeaderMenuController.js
+++ b/src/plugins/headermenu/www/scripts/HeaderMenuController.js
@@ -45,6 +45,8 @@ HeaderMenuController.prototype =
 		this.params.inputURL.click(jQuery.proxy(this, "htmlUrlView"));
 		this.params.inputOuter.click(jQuery.proxy(this, "inputHtmlCodeView"));
 		this.params.inputHeader.click(jQuery.proxy(this, "initializeView"));
+		this.params.validOutButton.click(jQuery.proxy(this, "validateOutLinkOrder"));
+		this.params.validHeaButton.click(jQuery.proxy(this, "validateHeaLinkOrder"));
 	},
 
 	initializeView: function() {
@@ -52,11 +54,34 @@ HeaderMenuController.prototype =
 		this.params.trHtmlCode.hide();
 		this.params.trUrlCode.show();
 		this.params.inputURL.attr('checked', 'checked');
-		if (typeof(this.params.tableTbodyLink) != 'undefined') {
-			this.params.tableTbodyLink.sortable({
+		if (typeof(this.params.tableOutTbLink) != 'undefined') {
+			this.params.tableOutTbLink.sortable({
 				update: function(event, ui) {
-						jQuery(ui.item).attr("id", jQuery(ui.item).index());
-					}
+					jQuery(".sortable_outermenu_listlinks tbody").children().each(function() {
+						if (jQuery(this).index() % 2 === 0) {
+							jQuery(this).attr("class", "even");
+						} else {
+							jQuery(this).attr("class", "odd");
+						}
+						jQuery(this).children(":first").text(jQuery(this).index());
+					});
+					jQuery("#linkorderoutervalidatebutton").show();
+				}
+			});
+		}
+		if (typeof(this.params.tableHeaTbLink) != 'undefined') {
+			this.params.tableHeaTbLink.sortable({
+				update: function(event, ui) {
+					jQuery(".sortable_headermenu_listlinks tbody").children().each(function() {
+						if (jQuery(this).index() % 2 === 0) {
+							jQuery(this).attr("class", "even");
+						} else {
+							jQuery(this).attr("class", "odd");
+						}
+						jQuery(this).children(":first").text(jQuery(this).index());
+					});
+					jQuery("#linkorderheadervalidatebutton").show();
+				}
 			});
 		}
 	},
@@ -73,7 +98,31 @@ HeaderMenuController.prototype =
 
 	inputHtmlCodeView: function() {
 		this.params.inputHtmlCode.prop('disabled', false);
-	}
+	},
+
+	validateOutLinkOrder: function() {
+		var linkOrder = jQuery(".sortable_outermenu_listlinks tbody").sortable('toArray').toString();
+		jQuery.get(this.params.headerMenuUrl, {
+				action:		'validateOrder',
+				linkorder:	linkOrder,
+				type:		'globaladmin'
+			});
+		jQuery('#validateLinkFeedback').remove();
+		jQuery('#maindiv').prepend('<p id="validateLinkFeedback" class="feedback">Outermenu Link Order successfully validated</p>');
+		this.params.validOutButton.hide();
+	},
+
+	validateHeaLinkOrder: function() {
+		var linkOrder = jQuery(".sortable_headermenu_listlinks tbody").sortable('toArray').toString();
+		jQuery.get(this.params.headerMenuUrl, {
+				action:		'validateOrder',
+				linkorder:	linkOrder,
+				type:		'globaladmin'
+			});
+		jQuery('#validateLinkFeedback').remove();
+		jQuery('#maindiv').prepend('<p id="validateLinkFeedback" class="feedback">Headermenu Link Order successfully validated</p>');
+		this.params.validHeaButton.hide();
+	},
 };
 
 GroupMenuController.prototype =
@@ -81,7 +130,7 @@ GroupMenuController.prototype =
 	bindControls: function() {
 		this.params.inputHtmlCode.click(jQuery.proxy(this, "htmlCodeView"));
 		this.params.inputURL.click(jQuery.proxy(this, "htmlUrlView"));
-		this.params.validateButton.click(jQuery.proxy(this, "validateLinkOrder"));
+		this.params.validateButton.click(jQuery.proxy(this, "validateProjectLinkOrder"));
 	},
 
 	initializeView: function() {
@@ -121,7 +170,7 @@ GroupMenuController.prototype =
 		this.params.inputHtmlCode.prop('disabled', false);
 	},
 
-	validateLinkOrder: function() {
+	validateProjectLinkOrder: function() {
 		var linkOrder = jQuery("#sortable tbody").sortable('toArray').toString();
 		jQuery.get(this.params.headerMenuUrl, {
 				group_id:	this.params.groupId,

commit 78e2cbd8e6709a0aba61f26aae72705088704612
Author: Franck Villaume <franck.villaume at trivialdev.com>
Date:   Sun Jan 6 19:44:40 2013 +0100

    remove useless column

diff --git a/src/plugins/headermenu/view/admin/viewGlobalConfiguration.php b/src/plugins/headermenu/view/admin/viewGlobalConfiguration.php
index 9e622e1..d3a6da4 100644
--- a/src/plugins/headermenu/view/admin/viewGlobalConfiguration.php
+++ b/src/plugins/headermenu/view/admin/viewGlobalConfiguration.php
@@ -47,12 +47,11 @@ jQuery(document).ready(function() {
 $linksArray = $headermenu->getAvailableLinks('headermenu');
 if (sizeof($linksArray)) {
 	echo $HTML->boxTop(_('Manage available links in headermenu'));
-	$tabletop = array(_('Menu Location'), _('Menu Type'), _('Displayed Name'), _('Description'), _('Status'), _('Actions'));
-	$classth = array('', '','','','','unsortable');
+	$tabletop = array( _('Menu Type'), _('Displayed Name'), _('Description'), _('Status'), _('Actions'));
+	$classth = array('','','','','unsortable');
 	echo $HTML->listTableTop($tabletop, false, 'sortable_headermenu_listlinks', 'sortable', $classth);
 	foreach ($linksArray as $link) {
 		echo '<tr>';
-		echo '<td>'.htmlspecialchars($link['linkmenu']).'</td>';
 		if (strlen($link['url']) > 0) {
 			echo '<td>'._('URL').' ('.htmlspecialchars($link['url']).')</td>';
 		} else {
@@ -80,12 +79,11 @@ if (sizeof($linksArray)) {
 $linksArray = $headermenu->getAvailableLinks('outermenu');
 if (sizeof($linksArray)) {
 	echo $HTML->boxTop(_('Manage available links in outermenu'));
-	$tabletop = array(_('Menu Location'), _('Menu Type'), _('Displayed Name'), _('Description'), _('Status'), _('Actions'));
-	$classth = array('', '','','','','unsortable');
+	$tabletop = array(_('Menu Type'), _('Displayed Name'), _('Description'), _('Status'), _('Actions'));
+	$classth = array('','','','','unsortable');
 	echo $HTML->listTableTop($tabletop, false, 'sortable_outermenu_listlinks', 'sortable', $classth);
 	foreach ($linksArray as $link) {
 		echo '<tr>';
-		echo '<td>'.htmlspecialchars($link['linkmenu']).'</td>';
 		if (strlen($link['url']) > 0) {
 			echo '<td>'._('URL').' ('.htmlspecialchars($link['url']).')</td>';
 		} else {

commit 660eaf89a682fbb8727165f583d5d82b99a180b2
Author: Franck Villaume <franck.villaume at trivialdev.com>
Date:   Sun Jan 6 18:43:10 2013 +0100

    add copyright

diff --git a/src/www/themes/funky/Theme.class.php b/src/www/themes/funky/Theme.class.php
index 0451a71..b484e4d 100644
--- a/src/www/themes/funky/Theme.class.php
+++ b/src/www/themes/funky/Theme.class.php
@@ -5,7 +5,7 @@
  * Copyright 2010, Antoine Mercadal - Capgemini
  * Copyright 2010, Marc-Etienne Vargenau, Alcatel-Lucent
  * Copyright 2011, Franck Villaume - Capgemini
- * Copyright 2011 - 2012, Franck Villaume - TrivialDev
+ * Copyright 2011-2013, Franck Villaume - TrivialDev
  * Copyright (C) 2011 Alain Peyrat - Alcatel-Lucent
  *
  * This file is part of FusionForge. FusionForge is free software;

commit eb0a6104efc8ffbd6f67f2a7a76286c7983464df
Author: Franck Villaume <franck.villaume at trivialdev.com>
Date:   Sun Jan 6 17:44:34 2013 +0100

    implement backend action validateOrder

diff --git a/src/plugins/headermenu/action/deleteLink.php b/src/plugins/headermenu/action/deleteLink.php
index 8cf9ecc..3356fec 100644
--- a/src/plugins/headermenu/action/deleteLink.php
+++ b/src/plugins/headermenu/action/deleteLink.php
@@ -1,6 +1,6 @@
 <?php
 /**
- * headermenu plugin
+ * headermenu plugin: deleteLink action
  *
  * Copyright 2012, Franck Villaume - TrivialDev
  * http://fusionforge.org
diff --git a/src/plugins/headermenu/action/updateLinkStatus.php b/src/plugins/headermenu/action/updateLinkStatus.php
index 03cce2a..b91c682 100644
--- a/src/plugins/headermenu/action/updateLinkStatus.php
+++ b/src/plugins/headermenu/action/updateLinkStatus.php
@@ -1,6 +1,6 @@
 <?php
 /**
- * headermenu plugin
+ * headermenu plugin: updateLinkStatus action
  *
  * Copyright 2012, Franck Villaume - TrivialDev
  * http://fusionforge.org
diff --git a/src/plugins/headermenu/action/updateLinkValue.php b/src/plugins/headermenu/action/updateLinkValue.php
index caf7bd9..69679db 100644
--- a/src/plugins/headermenu/action/updateLinkValue.php
+++ b/src/plugins/headermenu/action/updateLinkValue.php
@@ -1,6 +1,6 @@
 <?php
 /**
- * headermenu plugin
+ * headermenu plugin : updateLinkValue action
  *
  * Copyright 2012, Franck Villaume - TrivialDev
  * http://fusionforge.org
diff --git a/src/plugins/headermenu/action/deleteLink.php b/src/plugins/headermenu/action/validateOrder.php
similarity index 54%
copy from src/plugins/headermenu/action/deleteLink.php
copy to src/plugins/headermenu/action/validateOrder.php
index 8cf9ecc..b16144c 100644
--- a/src/plugins/headermenu/action/deleteLink.php
+++ b/src/plugins/headermenu/action/validateOrder.php
@@ -1,8 +1,8 @@
 <?php
 /**
- * headermenu plugin
+ * headermenu plugin : validateOrder action
  *
- * Copyright 2012, Franck Villaume - TrivialDev
+ * Copyright 2013, Franck Villaume - TrivialDev
  * http://fusionforge.org
  *
  * This file is part of FusionForge. FusionForge is free software;
@@ -19,25 +19,19 @@
  * You should have received a copy of the GNU General Public License along
  * with FusionForge; if not, write to the Free Software Foundation, Inc.,
  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
+ */ 
 
 global $headermenu;
-global $type;
-global $group_id;
 
-$idLink = getIntFromRequest('linkid');
-$redirect_url = 'plugins/'.$headermenu->name.'/?type='.$type;
-if (isset($group_id) && $group_id) {
-	$redirect_url .= '&group_id='.$group_id;
-}
+$sysdebug_enable = false;
+
+$linksOrder = getStringFromRequest('linkorder');
+$returnValue = 1;
 
-if (!empty($idLink)) {
-	if ($headermenu->deleteLink($idLink)) {
-		$feedback = _('Link deleted');
-		session_redirect($redirect_url.'&feedback='.urlencode($feedback));
-	}
-	$error_msg = _('Task failed');
-	session_redirect($redirect_url.'&error_msg='.urlencode($error_msg));
+if ($linksOrder && strlen($linksOrder)) {
+	$linksOrderArr = explode(',', $linksOrder);
+	if ($headermenu->setLinksOrder($linksOrderArr))
+		$returnValue = 0;
 }
-$warning_msg = _('Missing Link to be deleted.');
-session_redirect($redirect_url.'&warning_msg='.urlencode($warning_msg));
+echo $returnValue;
+exit;
\ No newline at end of file
diff --git a/src/plugins/headermenu/common/headermenuPlugin.class.php b/src/plugins/headermenu/common/headermenuPlugin.class.php
index 69c41ac..222c3b2 100644
--- a/src/plugins/headermenu/common/headermenuPlugin.class.php
+++ b/src/plugins/headermenu/common/headermenuPlugin.class.php
@@ -168,7 +168,7 @@ class headermenuPlugin extends Plugin {
 	 * @return	array	the available links
 	 */
 	function getAvailableLinks($linkmenu) {
-		$links = db_query_params('select * FROM plugin_headermenu where linkmenu = $1 order by ordering', array($linkmenu));
+		$links = db_query_params('select * FROM plugin_headermenu where linkmenu = $1 order by ordering asc', array($linkmenu));
 		$availableLinks = array();
 		while ($arr = db_fetch_array($links)) {
 			$availableLinks[] = $arr;
@@ -188,6 +188,21 @@ class headermenuPlugin extends Plugin {
 	}
 
 	/**
+	 * setLinksOrder - set the linkOrder for a set of links id
+	 *
+	 * @param	array	$linksOrder array of ordered links id
+	 * @return	bool	success or not
+	 */
+	function setLinksOrder($linksOrder) {
+		for ($i =0; $i < count($linksOrder); $i++) {
+			$res = db_query_params('update plugin_headermenu set ordering = $1 where id_headermenu = $2', array($i, $linksOrder[$i]));
+			if (!$res)
+				return false;
+		}
+		return true;
+	}
+
+	/**
 	 * addLink - add a new valid link
 	 *
 	 * @param	string	$url the url
@@ -352,7 +367,11 @@ class headermenuPlugin extends Plugin {
 				html_use_jqueryui();
 				use_javascript('scripts/HeaderMenuController.js');
 				use_javascript('/js/sortable.js');
-				site_header(array('title'=>_('Project Menu Admin'), 'toptab' => ''));
+				$group_id = getIntFromRequest('group_id');
+				$params['toptab'] = 'admin';
+				$params['group'] = $group_id;
+				$params['title'] = _('Project groupmenu Admin');
+				site_project_header($params);
 				$returned = true;
 				break;
 			}
diff --git a/src/plugins/headermenu/view/admin/viewProjectConfiguration.php b/src/plugins/headermenu/view/admin/viewProjectConfiguration.php
index 70af91d..7ddde72 100644
--- a/src/plugins/headermenu/view/admin/viewProjectConfiguration.php
+++ b/src/plugins/headermenu/view/admin/viewProjectConfiguration.php
@@ -2,7 +2,7 @@
 /**
  * headermenu : viewProjectConfiguration page
  *
- * Copyright 2012 Franck Villaume - TrivialDev
+ * Copyright 2012-2013, Franck Villaume - TrivialDev
  * http://fusionforge.org
  *
  * This file is part of FusionForge. FusionForge is free software;
@@ -49,7 +49,7 @@ jQuery(document).ready(function() {
 <?php
 $linksArray = $headermenu->getAvailableLinks('groupmenu');
 if (sizeof($linksArray)) {
-	echo '<p class="information">'. _('You can reorder links, just drag & drop rows in the table and save order. Please note that those extra tabs can only appear after the standard tabs. And you can only move them inside the set of extra tabs.').'</p>';
+	echo '<p class="information">'. _('You can reorder links, just drag & drop rows in the table below and save order. Please note that those extra tabs can only appear after the standard tabs. And you can only move them inside the set of extra tabs.').'</p>';
 	echo $HTML->boxTop(_('Manage available links'));
 	$tabletop = array(_('Order'), _('Menu Type'), _('Displayed Name'), _('Description'), _('Status'), _('Actions'));
 	$classth = array('', '','','','','unsortable');
diff --git a/src/plugins/headermenu/www/index.php b/src/plugins/headermenu/www/index.php
index 9388241..7d09739 100644
--- a/src/plugins/headermenu/www/index.php
+++ b/src/plugins/headermenu/www/index.php
@@ -90,7 +90,8 @@ switch ($type) {
 			case 'addLink':
 			case 'updateLinkValue':
 			case 'deleteLink':
-			case 'updateLinkStatus': {
+			case 'updateLinkStatus':
+			case 'validateOrder': {
 				global $gfplugins;
 				include($gfplugins.$headermenu->name.'/action/'.$action.'.php');
 				break;
diff --git a/src/plugins/headermenu/www/scripts/HeaderMenuController.js b/src/plugins/headermenu/www/scripts/HeaderMenuController.js
index d81654a..5ae0d34 100644
--- a/src/plugins/headermenu/www/scripts/HeaderMenuController.js
+++ b/src/plugins/headermenu/www/scripts/HeaderMenuController.js
@@ -129,7 +129,8 @@ GroupMenuController.prototype =
 				linkorder:	linkOrder,
 				type:		'projectadmin'
 			});
-		jQuery('#maindiv').prepend('<p class="feedback">Link Order successfully validated</p>');
+		jQuery('#validateLinkFeedback').remove();
+		jQuery('#maindiv').prepend('<p id="validateLinkFeedback" class="feedback">Link Order successfully validated</p>');
 		this.params.validateButton.hide();
 	},
 };

commit 6a44cd505b5eb46d5ed38882703edb141454571f
Author: Franck Villaume <franck.villaume at trivialdev.com>
Date:   Sun Jan 6 15:07:14 2013 +0100

    complete support for reorder link in groupmenu

diff --git a/src/plugins/headermenu/common/headermenuPlugin.class.php b/src/plugins/headermenu/common/headermenuPlugin.class.php
index 6cc2c60..69c41ac 100644
--- a/src/plugins/headermenu/common/headermenuPlugin.class.php
+++ b/src/plugins/headermenu/common/headermenuPlugin.class.php
@@ -168,7 +168,7 @@ class headermenuPlugin extends Plugin {
 	 * @return	array	the available links
 	 */
 	function getAvailableLinks($linkmenu) {
-		$links = db_query_params('select * FROM plugin_headermenu where linkmenu = $1', array($linkmenu));
+		$links = db_query_params('select * FROM plugin_headermenu where linkmenu = $1 order by ordering', array($linkmenu));
 		$availableLinks = array();
 		while ($arr = db_fetch_array($links)) {
 			$availableLinks[] = $arr;
@@ -230,6 +230,13 @@ class headermenuPlugin extends Plugin {
 		return false;
 	}
 
+	/**
+	 * updateLinkStatus - update the link status
+	 *
+	 * @param	int	$idLink the link id
+	 * @param	int	$linkStatus the new status of the link id
+	 * @return	bool	success or not
+	 */
 	function updateLinkStatus($idLink, $linkStatus) {
 		$res = db_query_params('update plugin_headermenu set is_enable = $1 where id_headermenu = $2', array($linkStatus, $idLink));
 		if ($res) {
@@ -238,6 +245,12 @@ class headermenuPlugin extends Plugin {
 		return false;
 	}
 
+	/**
+	 * getLink - get all informations about a link
+	 *
+	 * @param	int	$idLink the link id
+	 * @return	array	the link informations
+	 */
 	function getLink($idLink) {
 		$res = db_query_params('select * from plugin_headermenu where id_headermenu = $1', array($idLink));
 		if (db_numrows($res) == 1) {
@@ -276,7 +289,11 @@ class headermenuPlugin extends Plugin {
 	 */
 	function pageView($pageid) {
 		$link = $this->getLink($pageid);
-		return $link['htmlcode'];
+		if ($link) {
+			return $link['htmlcode'];
+		} else {
+			return '<p class="error" >'._('Cannot retrieve the page').'</p>';
+		}
 	}
 
 	/**
@@ -287,7 +304,11 @@ class headermenuPlugin extends Plugin {
 	 */
 	 function iframeView($pageid) {
 		$link = $this->getLink($pageid);
-		return '<iframe src="'.rtrim($link['url'],'/').'" frameborder="0" height="600px" width="100%"></iframe>';
+		if ($link) {
+			return '<iframe src="'.rtrim($link['url'],'/').'" frameborder="0" height="600px" width="100%"></iframe>';
+		} else {
+			return '<p class="error" >'._('Cannot retrieve the page').'</p>';
+		}
 	 }
 
 	/**
diff --git a/src/plugins/headermenu/view/admin/viewProjectConfiguration.php b/src/plugins/headermenu/view/admin/viewProjectConfiguration.php
index 810f133..70af91d 100644
--- a/src/plugins/headermenu/view/admin/viewProjectConfiguration.php
+++ b/src/plugins/headermenu/view/admin/viewProjectConfiguration.php
@@ -37,7 +37,10 @@ jQuery(document).ready(function() {
 		trHtmlCode:	jQuery('#htmlcode'),
 		trUrlCode:	jQuery('#urlcode'),
 		trIframeView:	jQuery('#iframe'),
-		tableTbodyLink:	jQuery('#sortable tbody')
+		tableTbodyLink:	jQuery('#sortable tbody'),
+		validateButton:	jQuery('#linkordervalidatebutton'),
+		groupId:	'<?php echo $group_id ?>',
+		headerMenuUrl:	'<?php util_make_uri("/plugins/headermenu") ?>'
 	});
 });
 
@@ -46,13 +49,13 @@ jQuery(document).ready(function() {
 <?php
 $linksArray = $headermenu->getAvailableLinks('groupmenu');
 if (sizeof($linksArray)) {
-	echo '<p class="information">'. _('You can reorder links, just drag & drop rows in the table and save order.').'</p>';
+	echo '<p class="information">'. _('You can reorder links, just drag & drop rows in the table and save order. Please note that those extra tabs can only appear after the standard tabs. And you can only move them inside the set of extra tabs.').'</p>';
 	echo $HTML->boxTop(_('Manage available links'));
 	$tabletop = array(_('Order'), _('Menu Type'), _('Displayed Name'), _('Description'), _('Status'), _('Actions'));
 	$classth = array('', '','','','','unsortable');
 	echo $HTML->listTableTop($tabletop, false, 'sortable_headermenu_listlinks', 'sortable', $classth);
 	foreach ($linksArray as $link) {
-		echo '<tr id="'.$link['ordering'].'" ><td>'.$link['ordering'].'</td>';
+		echo '<tr id="'.$link['id_headermenu'].'" ><td>'.$link['ordering'].'</td>';
 		if (strlen($link['url']) > 0) {
 			echo '<td>'._('URL');
 			if ($link['linktype'] == 'iframe') {
@@ -78,9 +81,11 @@ if (sizeof($linksArray)) {
 	}
 	echo $HTML->listTableBottom();
 	echo $HTML->boxBottom();
+	echo '<input type="button" id="linkordervalidatebutton" value="'._('Validate Order').'" style="display:none;" />';
 	echo '</br>';
 }
 
+echo '<p class="information">'._('You can add your own tabs in the menu bar with the form below.').'</p>';
 echo '<form method="POST" name="addLink" action="index.php?type=projectadmin&group_id='.$group_id.'&action=addLink">';
 echo '<table><tr>';
 echo $HTML->boxTop(_('Add a new link'));
diff --git a/src/plugins/headermenu/www/scripts/HeaderMenuController.js b/src/plugins/headermenu/www/scripts/HeaderMenuController.js
index 0da2b5c..d81654a 100644
--- a/src/plugins/headermenu/www/scripts/HeaderMenuController.js
+++ b/src/plugins/headermenu/www/scripts/HeaderMenuController.js
@@ -81,6 +81,7 @@ GroupMenuController.prototype =
 	bindControls: function() {
 		this.params.inputHtmlCode.click(jQuery.proxy(this, "htmlCodeView"));
 		this.params.inputURL.click(jQuery.proxy(this, "htmlUrlView"));
+		this.params.validateButton.click(jQuery.proxy(this, "validateLinkOrder"));
 	},
 
 	initializeView: function() {
@@ -91,14 +92,14 @@ GroupMenuController.prototype =
 			this.params.tableTbodyLink.sortable({
 				update: function(event, ui) {
 					jQuery("#sortable tbody").children().each(function() {
-						jQuery(this).attr("id", jQuery(this).index())
-						if (jQuery(this).attr("id") % 2 === 0) {
+						if (jQuery(this).index() % 2 === 0) {
 							jQuery(this).attr("class", "even");
 						} else {
 							jQuery(this).attr("class", "odd");
 						}
-						jQuery(this).children(":first").text(jQuery(this).attr("id"));
+						jQuery(this).children(":first").text(jQuery(this).index());
 					});
+					jQuery("#linkordervalidatebutton").show();
 				}
 			});
 		}
@@ -118,7 +119,19 @@ GroupMenuController.prototype =
 
 	inputHtmlCodeView: function() {
 		this.params.inputHtmlCode.prop('disabled', false);
-	}
+	},
+
+	validateLinkOrder: function() {
+		var linkOrder = jQuery("#sortable tbody").sortable('toArray').toString();
+		jQuery.get(this.params.headerMenuUrl, {
+				group_id:	this.params.groupId,
+				action:		'validateOrder',
+				linkorder:	linkOrder,
+				type:		'projectadmin'
+			});
+		jQuery('#maindiv').prepend('<p class="feedback">Link Order successfully validated</p>');
+		this.params.validateButton.hide();
+	},
 };
 
 EditHeaderMenuController.prototype =
diff --git a/src/www/themes/funky/Theme.class.php b/src/www/themes/funky/Theme.class.php
index f234281..0451a71 100644
--- a/src/www/themes/funky/Theme.class.php
+++ b/src/www/themes/funky/Theme.class.php
@@ -444,7 +444,10 @@ class Theme extends Layout {
 		jQuery.noConflict();
 		jQuery(window).load(function(){
 			jQuery(".quicknews").hide();
+			setTimeout("jQuery('.feedback').hide('slow')", 5000);
+			setInterval(function() {
 					setTimeout("jQuery('.feedback').hide('slow')", 5000);
+				}, 5000);
 		});
 		//]]></script>
 		<?php

commit 2994be8618749e07c596e2b4da4e829aaf807db6
Author: Franck Villaume <franck.villaume at trivialdev.com>
Date:   Sat Jan 5 13:32:10 2013 +0100

    add support for reorder in js controler

diff --git a/src/plugins/headermenu/view/admin/viewProjectConfiguration.php b/src/plugins/headermenu/view/admin/viewProjectConfiguration.php
index f200b60..810f133 100644
--- a/src/plugins/headermenu/view/admin/viewProjectConfiguration.php
+++ b/src/plugins/headermenu/view/admin/viewProjectConfiguration.php
@@ -52,7 +52,7 @@ if (sizeof($linksArray)) {
 	$classth = array('', '','','','','unsortable');
 	echo $HTML->listTableTop($tabletop, false, 'sortable_headermenu_listlinks', 'sortable', $classth);
 	foreach ($linksArray as $link) {
-		echo '<tr><td>'.$link['ordering'].'</td>';
+		echo '<tr id="'.$link['ordering'].'" ><td>'.$link['ordering'].'</td>';
 		if (strlen($link['url']) > 0) {
 			echo '<td>'._('URL');
 			if ($link['linktype'] == 'iframe') {
diff --git a/src/plugins/headermenu/www/scripts/HeaderMenuController.js b/src/plugins/headermenu/www/scripts/HeaderMenuController.js
index eb11f3d..0da2b5c 100644
--- a/src/plugins/headermenu/www/scripts/HeaderMenuController.js
+++ b/src/plugins/headermenu/www/scripts/HeaderMenuController.js
@@ -53,7 +53,11 @@ HeaderMenuController.prototype =
 		this.params.trUrlCode.show();
 		this.params.inputURL.attr('checked', 'checked');
 		if (typeof(this.params.tableTbodyLink) != 'undefined') {
-			this.params.tableTbodyLink.sortable();
+			this.params.tableTbodyLink.sortable({
+				update: function(event, ui) {
+						jQuery(ui.item).attr("id", jQuery(ui.item).index());
+					}
+			});
 		}
 	},
 
@@ -84,7 +88,19 @@ GroupMenuController.prototype =
 		this.params.trUrlCode.show();
 		this.params.inputURL.attr('checked', 'checked');
 		if (typeof(this.params.tableTbodyLink) != 'undefined') {
-			this.params.tableTbodyLink.sortable();
+			this.params.tableTbodyLink.sortable({
+				update: function(event, ui) {
+					jQuery("#sortable tbody").children().each(function() {
+						jQuery(this).attr("id", jQuery(this).index())
+						if (jQuery(this).attr("id") % 2 === 0) {
+							jQuery(this).attr("class", "even");
+						} else {
+							jQuery(this).attr("class", "odd");
+						}
+						jQuery(this).children(":first").text(jQuery(this).attr("id"));
+					});
+				}
+			});
 		}
 	},
 

commit 09012df4b26cf75305c7de60deaaa3cf969c9b5b
Author: Franck Villaume <franck.villaume at trivialdev.com>
Date:   Mon Dec 31 17:56:38 2012 +0100

    add support for iframe in groupmenu

diff --git a/src/plugins/headermenu/action/addLink.php b/src/plugins/headermenu/action/addLink.php
index f9a7f02..d6333d9 100644
--- a/src/plugins/headermenu/action/addLink.php
+++ b/src/plugins/headermenu/action/addLink.php
@@ -37,11 +37,6 @@ if (isset($group_id) && $group_id) {
 	$redirect_url .= '&group_id='.$group_id;
 }
 
-$redirect_url = 'plugins/'.$headermenu->name.'/?type='.$type;
-if (isset($group_id) && $group_id) {
-	$redirect_url .= '&group_id='.$group_id;
-}
-
 if (!empty($name) && !empty($linkmenu)) {
 	switch ($linkmenu) {
 		case 'headermenu': {

commit 4bcb05caa64ce606518aad696088d6e8caf7471c
Author: Franck Villaume <franck.villaume at trivialdev.com>
Date:   Mon Dec 31 11:27:22 2012 +0100

    add support for html page in groupmenu

diff --git a/src/plugins/headermenu/common/headermenuPlugin.class.php b/src/plugins/headermenu/common/headermenuPlugin.class.php
index 0024cb4..6cc2c60 100644
--- a/src/plugins/headermenu/common/headermenuPlugin.class.php
+++ b/src/plugins/headermenu/common/headermenuPlugin.class.php
@@ -335,14 +335,6 @@ class headermenuPlugin extends Plugin {
 				$returned = true;
 				break;
 			}
-			case 'projectadmin': {
-				html_use_jquery();
-				use_javascript('scripts/HeaderMenuController.js');
-				use_javascript('/js/sortable.js');
-				site_header(array('title'=>_('Project Menu Admin'), 'toptab' => ''));
-				$returned = true;
-				break;
-			}
 		}
 		return $returned;
 	}

commit f4e778bf303f0aa287527a7e3f23de31d6c4943c
Author: Franck Villaume <franck.villaume at trivialdev.com>
Date:   Sun Dec 30 20:38:42 2012 +0100

    start htmlcode support in groupmenu

diff --git a/src/plugins/headermenu/common/headermenuPlugin.class.php b/src/plugins/headermenu/common/headermenuPlugin.class.php
index 882c0e0..0024cb4 100644
--- a/src/plugins/headermenu/common/headermenuPlugin.class.php
+++ b/src/plugins/headermenu/common/headermenuPlugin.class.php
@@ -337,6 +337,7 @@ class headermenuPlugin extends Plugin {
 			}
 			case 'projectadmin': {
 				html_use_jquery();
+				use_javascript('scripts/HeaderMenuController.js');
 				use_javascript('/js/sortable.js');
 				site_header(array('title'=>_('Project Menu Admin'), 'toptab' => ''));
 				$returned = true;

commit b854f04d54b029ec0b0396f09c00f4bb8e5805b4
Author: Franck Villaume <franck.villaume at trivialdev.com>
Date:   Sun Dec 30 19:56:25 2012 +0100

    support delete link in groupmenu

diff --git a/src/plugins/headermenu/action/addLink.php b/src/plugins/headermenu/action/addLink.php
index d6333d9..f9a7f02 100644
--- a/src/plugins/headermenu/action/addLink.php
+++ b/src/plugins/headermenu/action/addLink.php
@@ -37,6 +37,11 @@ if (isset($group_id) && $group_id) {
 	$redirect_url .= '&group_id='.$group_id;
 }
 
+$redirect_url = 'plugins/'.$headermenu->name.'/?type='.$type;
+if (isset($group_id) && $group_id) {
+	$redirect_url .= '&group_id='.$group_id;
+}
+
 if (!empty($name) && !empty($linkmenu)) {
 	switch ($linkmenu) {
 		case 'headermenu': {
diff --git a/src/plugins/headermenu/common/headermenuPlugin.class.php b/src/plugins/headermenu/common/headermenuPlugin.class.php
index 1939271..882c0e0 100644
--- a/src/plugins/headermenu/common/headermenuPlugin.class.php
+++ b/src/plugins/headermenu/common/headermenuPlugin.class.php
@@ -337,6 +337,7 @@ class headermenuPlugin extends Plugin {
 			}
 			case 'projectadmin': {
 				html_use_jquery();
+				use_javascript('/js/sortable.js');
 				site_header(array('title'=>_('Project Menu Admin'), 'toptab' => ''));
 				$returned = true;
 				break;

commit e0f49ffc3936fbe02bbb56690dbfed471452d51c
Author: Franck Villaume <franck.villaume at trivialdev.com>
Date:   Sat Dec 22 20:28:10 2012 +0100

    start implement groupmenu hook in headermenu

diff --git a/src/plugins/headermenu/common/headermenuPlugin.class.php b/src/plugins/headermenu/common/headermenuPlugin.class.php
index 6cc2c60..1939271 100644
--- a/src/plugins/headermenu/common/headermenuPlugin.class.php
+++ b/src/plugins/headermenu/common/headermenuPlugin.class.php
@@ -335,6 +335,12 @@ class headermenuPlugin extends Plugin {
 				$returned = true;
 				break;
 			}
+			case 'projectadmin': {
+				html_use_jquery();
+				site_header(array('title'=>_('Project Menu Admin'), 'toptab' => ''));
+				$returned = true;
+				break;
+			}
 		}
 		return $returned;
 	}
diff --git a/src/plugins/headermenu/www/index.php b/src/plugins/headermenu/www/index.php
index 1f053ea..9388241 100644
--- a/src/plugins/headermenu/www/index.php
+++ b/src/plugins/headermenu/www/index.php
@@ -107,6 +107,7 @@ switch ($type) {
 				break;
 		}
 		break;
+		$headermenu->getHeader($type);
 	}
 }
 

commit 046e73e007b1c05c7d62e4ab4811b8e67965cb88
Author: Franck Villaume <franck.villaume at trivialdev.com>
Date:   Tue Jan 1 20:47:10 2013 +0100

    add notice and reorg display in global

diff --git a/src/plugins/headermenu/view/admin/viewGlobalConfiguration.php b/src/plugins/headermenu/view/admin/viewGlobalConfiguration.php
index eaa3252..9e622e1 100644
--- a/src/plugins/headermenu/view/admin/viewGlobalConfiguration.php
+++ b/src/plugins/headermenu/view/admin/viewGlobalConfiguration.php
@@ -36,16 +36,17 @@ jQuery(document).ready(function() {
 		inputHeader:	jQuery('#linkmenu_headermenu'),
 		inputOuter:	jQuery('#linkmenu_outermenu'),
 		trHtmlCode:	jQuery('#htmlcode'),
-		trUrlCode:	jQuery('#urlcode')
-    });
+		trUrlCode:	jQuery('#urlcode'),
+		tableTbodyLink:	jQuery('#sortable tbody')
+	});
 });
 
 //]]></script>
 
 <?php
-$linksArray = $headermenu->getAllAvailableLinks();
+$linksArray = $headermenu->getAvailableLinks('headermenu');
 if (sizeof($linksArray)) {
-	echo $HTML->boxTop(_('Manage available links'));
+	echo $HTML->boxTop(_('Manage available links in headermenu'));
 	$tabletop = array(_('Menu Location'), _('Menu Type'), _('Displayed Name'), _('Description'), _('Status'), _('Actions'));
 	$classth = array('', '','','','','unsortable');
 	echo $HTML->listTableTop($tabletop, false, 'sortable_headermenu_listlinks', 'sortable', $classth);
@@ -76,6 +77,39 @@ if (sizeof($linksArray)) {
 	echo '</br>';
 }
 
+$linksArray = $headermenu->getAvailableLinks('outermenu');
+if (sizeof($linksArray)) {
+	echo $HTML->boxTop(_('Manage available links in outermenu'));
+	$tabletop = array(_('Menu Location'), _('Menu Type'), _('Displayed Name'), _('Description'), _('Status'), _('Actions'));
+	$classth = array('', '','','','','unsortable');
+	echo $HTML->listTableTop($tabletop, false, 'sortable_outermenu_listlinks', 'sortable', $classth);
+	foreach ($linksArray as $link) {
+		echo '<tr>';
+		echo '<td>'.htmlspecialchars($link['linkmenu']).'</td>';
+		if (strlen($link['url']) > 0) {
+			echo '<td>'._('URL').' ('.htmlspecialchars($link['url']).')</td>';
+		} else {
+			echo '<td>'._('static html code').'</td>';
+		}
+		echo '<td>'.htmlspecialchars($link['name']).'</td>';
+		echo '<td>'.htmlspecialchars($link['description']).'</td>';
+		if ($link['is_enable']) {
+			echo '<td>'.html_image('docman/validate.png', 22, 22, array('alt'=>_('link is on'), 'class'=>'tabtitle', 'title'=>_('link is on'))).'</td>';
+			echo '<td><a class="tabtitle-ne" title="'._('Desactivate this link').'" href="index.php?type=globaladmin&action=updateLinkStatus&linkid='.$link['id_headermenu'].'&linkstatus=0">'.html_image('docman/release-document.png', 22, 22, array('alt'=>_('Desactivate this link'))). '</a>';
+		} else {
+			echo '<td>'.html_image('docman/delete-directory.png', 22, 22, array('alt'=>_('link is off'), 'class'=>'tabtitle', 'title'=>_('link is off'))).'</td>';
+			echo '<td><a class="tabtitle-ne" title="'._('Activate this link').'" href="index.php?type=globaladmin&action=updateLinkStatus&linkid='.$link['id_headermenu'].'&linkstatus=1">'.html_image('docman/reserve-document.png', 22, 22, array('alt'=>_('Activate this link'))). '</a>';
+		}
+		echo '<a class="tabtitle-ne" title="'._('Edit this link').'" href="index.php?type=globaladmin&view=updateLinkValue&linkid='.$link['id_headermenu'].'">'.html_image('docman/edit-file.png',22,22, array('alt'=>_('Edit this link'))). '</a>';
+		echo '<a class="tabtitle-ne" title="'._('Delete this link').'" href="index.php?type=globaladmin&action=deleteLink&linkid='.$link['id_headermenu'].'">'.html_image('docman/trash-empty.png',22,22, array('alt'=>_('Delete this link'))). '</a>';
+		echo '</td>';
+		echo '</tr>';
+	}
+	echo $HTML->listTableBottom();
+	echo $HTML->boxBottom();
+	echo '</br>';
+}
+
 echo '<form method="POST" name="addLink" action="index.php?type=globaladmin&action=addLink">';
 echo '<table><tr>';
 echo $HTML->boxTop(_('Add a new link'));
diff --git a/src/plugins/headermenu/view/admin/viewProjectConfiguration.php b/src/plugins/headermenu/view/admin/viewProjectConfiguration.php
index 1ad33f4..f200b60 100644
--- a/src/plugins/headermenu/view/admin/viewProjectConfiguration.php
+++ b/src/plugins/headermenu/view/admin/viewProjectConfiguration.php
@@ -46,12 +46,13 @@ jQuery(document).ready(function() {
 <?php
 $linksArray = $headermenu->getAvailableLinks('groupmenu');
 if (sizeof($linksArray)) {
+	echo '<p class="information">'. _('You can reorder links, just drag & drop rows in the table and save order.').'</p>';
 	echo $HTML->boxTop(_('Manage available links'));
-	$tabletop = array(_('Menu Type'), _('Displayed Name'), _('Description'), _('Status'), _('Actions'));
-	$classth = array('','','','','unsortable');
+	$tabletop = array(_('Order'), _('Menu Type'), _('Displayed Name'), _('Description'), _('Status'), _('Actions'));
+	$classth = array('', '','','','','unsortable');
 	echo $HTML->listTableTop($tabletop, false, 'sortable_headermenu_listlinks', 'sortable', $classth);
 	foreach ($linksArray as $link) {
-		echo '<tr>';
+		echo '<tr><td>'.$link['ordering'].'</td>';
 		if (strlen($link['url']) > 0) {
 			echo '<td>'._('URL');
 			if ($link['linktype'] == 'iframe') {

commit 9ecc5a34d1e6334e74f4a65f0cb7c2efd85d0668
Author: Franck Villaume <franck.villaume at trivialdev.com>
Date:   Tue Jan 1 16:35:35 2013 +0100

    start implement reorder

diff --git a/src/plugins/headermenu/common/headermenuPlugin.class.php b/src/plugins/headermenu/common/headermenuPlugin.class.php
index 93efda2..6cc2c60 100644
--- a/src/plugins/headermenu/common/headermenuPlugin.class.php
+++ b/src/plugins/headermenu/common/headermenuPlugin.class.php
@@ -3,7 +3,7 @@
 /**
  * headermenuPlugin Class
  *
- * Copyright 2012 Franck Villaume - TrivialDev
+ * Copyright 2012-2013, Franck Villaume - TrivialDev
  * http://fusionforge.org
  *
  * This file is part of FusionForge. FusionForge is free software;
@@ -61,7 +61,7 @@ class headermenuPlugin extends Plugin {
 				$group_id = $params['group_id'];
 				$project = group_get_object($group_id);
 				if ($project->usesPlugin($this->name)) {
-					echo '<p>'.util_make_link('/plugins/headermenu/?type=projectadmin&group_id='.$group_id,
+					echo '<p>'.util_make_link('/plugins/'.$this->name.'/?type=projectadmin&group_id='.$group_id,
 					     _('Project GroupMenu Admin'), array('class' => 'tabtitle', 'title' => _('Add/Remove/Activate/Desactivate tabs'))) . '</p>';
 				}
 				break;
@@ -304,6 +304,7 @@ class headermenuPlugin extends Plugin {
 				global $gfwww;
 				require_once($gfwww.'admin/admin_utils.php');
 				html_use_jquery();
+				html_use_jqueryui();
 				use_javascript('scripts/HeaderMenuController.js');
 				use_javascript('/js/sortable.js');
 				site_admin_header(array('title'=>_('Site Global Menu Admin'), 'toptab' => ''));
@@ -315,18 +316,19 @@ class headermenuPlugin extends Plugin {
 				$link = $this->getLink($this->pageid);
 				$group_id = getIntFromRequest('group_id');
 				if ($group_id) {
-					$params['toptab'] = '/plugins/headermenu/?type='.$type.'&group_id='.$group_id.'&pageid='.$this->pageid;
+					$params['toptab'] = '/plugins/'.$this->name.'/?type='.$type.'&group_id='.$group_id.'&pageid='.$this->pageid;
 					$params['group'] = $group_id;
 					$params['title'] = $link['name'];
 					site_project_header($params);
 				} else {
-					site_header(array('title'=> $link['name'], 'toptab' => '/plugins/headermenu/?type='.$type.'&pageid='.$this->pageid));
+					site_header(array('title'=> $link['name'], 'toptab' => '/plugins/'.$this->name.'/?type='.$type.'&pageid='.$this->pageid));
 				}
 				$returned = true;
 				break;
 			}
 			case 'projectadmin': {
 				html_use_jquery();
+				html_use_jqueryui();
 				use_javascript('scripts/HeaderMenuController.js');
 				use_javascript('/js/sortable.js');
 				site_header(array('title'=>_('Project Menu Admin'), 'toptab' => ''));
diff --git a/src/plugins/headermenu/view/admin/viewProjectConfiguration.php b/src/plugins/headermenu/view/admin/viewProjectConfiguration.php
index 72c7018..1ad33f4 100644
--- a/src/plugins/headermenu/view/admin/viewProjectConfiguration.php
+++ b/src/plugins/headermenu/view/admin/viewProjectConfiguration.php
@@ -37,7 +37,8 @@ jQuery(document).ready(function() {
 		trHtmlCode:	jQuery('#htmlcode'),
 		trUrlCode:	jQuery('#urlcode'),
 		trIframeView:	jQuery('#iframe'),
-    });
+		tableTbodyLink:	jQuery('#sortable tbody')
+	});
 });
 
 //]]></script>
diff --git a/src/plugins/headermenu/www/scripts/HeaderMenuController.js b/src/plugins/headermenu/www/scripts/HeaderMenuController.js
index 84f2dce..eb11f3d 100644
--- a/src/plugins/headermenu/www/scripts/HeaderMenuController.js
+++ b/src/plugins/headermenu/www/scripts/HeaderMenuController.js
@@ -52,6 +52,9 @@ HeaderMenuController.prototype =
 		this.params.trHtmlCode.hide();
 		this.params.trUrlCode.show();
 		this.params.inputURL.attr('checked', 'checked');
+		if (typeof(this.params.tableTbodyLink) != 'undefined') {
+			this.params.tableTbodyLink.sortable();
+		}
 	},
 
 	htmlCodeView: function() {
@@ -80,6 +83,9 @@ GroupMenuController.prototype =
 		this.params.trHtmlCode.hide();
 		this.params.trUrlCode.show();
 		this.params.inputURL.attr('checked', 'checked');
+		if (typeof(this.params.tableTbodyLink) != 'undefined') {
+			this.params.tableTbodyLink.sortable();
+		}
 	},
 
 	htmlCodeView: function() {

commit 33373c31732e65bb72bc39af948d42c242ddcded
Author: Franck Villaume <franck.villaume at trivialdev.com>
Date:   Tue Jan 1 15:01:46 2013 +0100

    make the update works

diff --git a/src/plugins/headermenu/action/updateLinkValue.php b/src/plugins/headermenu/action/updateLinkValue.php
index e9706ba..caf7bd9 100644
--- a/src/plugins/headermenu/action/updateLinkValue.php
+++ b/src/plugins/headermenu/action/updateLinkValue.php
@@ -23,7 +23,6 @@
 
 global $headermenu;
 
-session_require_global_perm('forge_admin');
 $idLink = getIntFromRequest('linkid');
 $link = getStringFromRequest('link');
 $name = strip_tags(getStringFromRequest('name'));
@@ -31,53 +30,55 @@ $description = strip_tags(getStringFromRequest('description'));
 $typemenu = getStringFromRequest('typemenu');
 $linkmenu = getStringFromRequest('linkmenu');
 $htmlcode = getStringFromRequest('htmlcode');
+$type = getStringFromRequest('type');
 
 if (!empty($idLink) && !empty($name)) {
 	switch ($linkmenu) {
-		case "headermenu": {
+		case 'headermenu': {
 			if (!empty($link)) {
 				if (util_check_url($link)) {
 					if ($headermenu->updateLink($idLink, $link, $name, $description, $linkmenu)) {
 						$feedback = _('Task succeeded.');
-						session_redirect('plugins/'.$headermenu->name.'/?type=globaladmin&feedback='.urlencode($feedback));
+						session_redirect('plugins/'.$headermenu->name.'/?type='.$type.'&feedback='.urlencode($feedback));
 					}
 					$error_msg = _('Task failed');
-					session_redirect('plugins/'.$headermenu->name.'/?type=globaladmin&error_msg='.urlencode($error_msg));
+					session_redirect('plugins/'.$headermenu->name.'/?type='.$type.'&error_msg='.urlencode($error_msg));
 				} else {
 					$error_msg = _('Provided Link is not a valid URL.');
-					session_redirect('plugins/'.$headermenu->name.'/?type=globaladmin&error_msg='.urlencode($error_msg));
+					session_redirect('plugins/'.$headermenu->name.'/?type='.$type.'&error_msg='.urlencode($error_msg));
 				}
 			}
 			$warning_msg = _('Missing Link URL.');
-			session_redirect('plugins/'.$headermenu->name.'/?type=globaladmin&warning_msg='.urlencode($warning_msg));
+			session_redirect('plugins/'.$headermenu->name.'/?type='.$type.'&warning_msg='.urlencode($warning_msg));
 			break;
 		}
-		case "outermenu": {
-			if (!empty($link) && $typemenu == 'url') {
+		case 'outermenu':
+		case 'groupmenu': {
+			if (!empty($link) && ($typemenu == 'url' || $typemenu == 'iframe')) {
 				if (util_check_url($link)) {
-					if ($headermenu->updateLink($idLink, $link, $name, $description, $linkmenu)) {
+					if ($headermenu->updateLink($idLink, $link, $name, $description, $linkmenu, $typemenu)) {
 						$feedback = _('Task succeeded.');
-						session_redirect('plugins/'.$headermenu->name.'/?type=globaladmin&feedback='.urlencode($feedback));
+						session_redirect('plugins/'.$headermenu->name.'/?type='.$type.'&feedback='.urlencode($feedback));
 					}
 					$error_msg = _('Task failed');
-					session_redirect('plugins/'.$headermenu->name.'/?type=globaladmin&error_msg='.urlencode($error_msg));
+					session_redirect('plugins/'.$headermenu->name.'/?type='.$type.'&error_msg='.urlencode($error_msg));
 				} else {
 					$error_msg = _('Provided Link is not a valid URL.');
-					session_redirect('plugins/'.$headermenu->name.'/?type=globaladmin&error_msg='.urlencode($error_msg));
+					session_redirect('plugins/'.$headermenu->name.'/?type='.$type.'&error_msg='.urlencode($error_msg));
 				}
 			}
 			if (!empty($htmlcode) && $typemenu == 'htmlcode') {
 				if ($headermenu->updateLink($idLink, '', $name, $description, $linkmenu, 'htmlcode', $htmlcode)) {
 					$feedback = _('Task succeeded.');
-					session_redirect('plugins/'.$headermenu->name.'/?type=globaladmin&feedback='.urlencode($feedback));
+					session_redirect('plugins/'.$headermenu->name.'/?type='.$type.'&feedback='.urlencode($feedback));
 				}
 				$error_msg = _('Task failed');
-				session_redirect('plugins/'.$headermenu->name.'/?type=globaladmin&error_msg='.urlencode($error_msg));
+				session_redirect('plugins/'.$headermenu->name.'/?type='.$type.'&error_msg='.urlencode($error_msg));
 			}
 			$warning_msg = _('Missing Link URL or Html Code.');
-			session_redirect('plugins/'.$headermenu->name.'/?type=globaladmin&warning_msg='.urlencode($warning_msg));
+			session_redirect('plugins/'.$headermenu->name.'/?type='.$type.'&warning_msg='.urlencode($warning_msg));
 		}
 	}
 }
 $warning_msg = _('No link to update or name missing.');
-session_redirect('plugins/'.$headermenu->name.'/?type=globaladmin&warning_msg='.urlencode($warning_msg));
+session_redirect('plugins/'.$headermenu->name.'/?type='.$type.'&warning_msg='.urlencode($warning_msg));
diff --git a/src/plugins/headermenu/view/admin/updateLinkValue.php b/src/plugins/headermenu/view/admin/updateLinkValue.php
index 6edb149..4b2e884 100644
--- a/src/plugins/headermenu/view/admin/updateLinkValue.php
+++ b/src/plugins/headermenu/view/admin/updateLinkValue.php
@@ -63,15 +63,14 @@ if (is_array($linkValues)) {
 		echo html_build_radio_buttons_from_arrays($vals, $texts, $select_name, $linkValues['linkmenu'], false);
 		echo '</td>';
 		echo '</tr><tr>';
+		$texts = array('URL', 'New Page');
+		$vals = array('url', 'htmlcode');
 	}
 	echo '<td>'._('Menu Type').'</td><td>';
 	if ($type == 'projectadmin') {
 		$texts = array('URL', 'URL as iframe', 'New Page');
 		$vals = array('url', 'iframe', 'htmlcode');
-	}
-	if ($type == 'globaladmin') {
-		$texts = array('URL', 'New Page');
-		$vals = array('url', 'htmlcode');
+		echo '<input type="hidden" name="linkmenu" value="groupmenu" />';
 	}
 	$select_name = 'typemenu';
 	echo html_build_radio_buttons_from_arrays($vals, $texts, $select_name, $linkValues['linktype'], false);

commit a3485c5bffcc054a8ca85ba1d4cf709780a09fcc
Author: Franck Villaume <franck.villaume at trivialdev.com>
Date:   Tue Jan 1 14:44:52 2013 +0100

    support for edit link in groupmenu

diff --git a/src/plugins/headermenu/action/addLink.php b/src/plugins/headermenu/action/addLink.php
index 665e460..d6333d9 100644
--- a/src/plugins/headermenu/action/addLink.php
+++ b/src/plugins/headermenu/action/addLink.php
@@ -2,7 +2,7 @@
 /**
  * headermenu plugin : addLink action
  *
- * Copyright 2012, Franck Villaume - TrivialDev
+ * Copyright 2012-2013, Franck Villaume - TrivialDev
  * http://fusionforge.org
  *
  * This file is part of FusionForge. FusionForge is free software;
@@ -61,7 +61,7 @@ if (!empty($name) && !empty($linkmenu)) {
 		case 'groupmenu': {
 			if (!empty($link)) {
 				if (util_check_url($link)) {
-					$linktype = 'URL';
+					$linktype = 'url';
 					if ($iframed) {
 						$linktype = 'iframe';
 					}
diff --git a/src/plugins/headermenu/db/20121231-reorderentry.sql b/src/plugins/headermenu/db/20121231-reorderentry.sql
index 2f1dccf..865b851 100644
--- a/src/plugins/headermenu/db/20121231-reorderentry.sql
+++ b/src/plugins/headermenu/db/20121231-reorderentry.sql
@@ -1 +1,2 @@
+UPDATE plugin_headermenu SET linktype = 'url' where linktype = 'URL';
 ALTER TABLE plugin_headermenu ADD COLUMN ordering integer DEFAULT 0 NOT NULL;
diff --git a/src/plugins/headermenu/view/admin/updateLinkValue.php b/src/plugins/headermenu/view/admin/updateLinkValue.php
index 1209aa8..6edb149 100644
--- a/src/plugins/headermenu/view/admin/updateLinkValue.php
+++ b/src/plugins/headermenu/view/admin/updateLinkValue.php
@@ -2,7 +2,7 @@
 /**
  * headermenuPlugin Class
  *
- * Copyright 2012 Franck Villaume - TrivialDev
+ * Copyright 2012-2013, Franck Villaume - TrivialDev
  * http://fusionforge.org
  *
  * This file is part of FusionForge. FusionForge is free software;
@@ -23,8 +23,8 @@
 
 global $HTML;
 global $headermenu;
+global $type;
 
-session_require_global_perm('forge_admin');
 $linkId = getIntFromRequest('linkid');
 ?>
 
@@ -35,6 +35,7 @@ jQuery(document).ready(function() {
 	controllerHeaderMenu = new EditHeaderMenuController({
 		inputHtmlCode:	jQuery('#typemenu_htmlcode'),
 		inputURL:	jQuery('#typemenu_url'),
+		inputURLIframe:	jQuery('#typemenu_iframe'),
 		inputHeader:	jQuery('#linkmenu_headermenu'),
 		inputOuter:	jQuery('#linkmenu_outermenu'),
 		trHtmlCode:	jQuery('#htmlcode'),
@@ -47,23 +48,31 @@ jQuery(document).ready(function() {
 <?php
 $linkValues = $headermenu->getLink($linkId);
 if (is_array($linkValues)) {
-	echo '<form method="POST" name="updateLink" action="index.php?type=globaladmin&action=updateLinkValue">';
+	echo '<form method="POST" name="updateLink" action="index.php?type='.$type.'&action=updateLinkValue">';
 	echo '<table><tr>';
 	echo $HTML->boxTop(_('Update this link'));
 	echo '<td>'._('Displayed Name').'</td><td><input name="name" type="text" maxsize="255" value="'.$linkValues['name'].'" /></td>';
 	echo '</tr><tr>';
 	echo '<td>'._('Description').'</td><td><input name="description" type="text" maxsize="255" value="'.$linkValues['description'].'" /></td>';
 	echo '</tr><tr>';
-	echo '<td>'._('Menu Location').'</td><td>';
-	$vals = array('headermenu', 'outermenu');
-	$texts = array('headermenu', 'outermenu');
-	$select_name = 'linkmenu';
-	echo html_build_radio_buttons_from_arrays($vals, $texts, $select_name, $linkValues['linkmenu'], false);
-	echo '</td>';
-	echo '</tr><tr>';
+	if ($type == 'globaladmin') {
+		echo '<td>'._('Menu Location').'</td><td>';
+		$vals = array('headermenu', 'outermenu');
+		$texts = array('headermenu', 'outermenu');
+		$select_name = 'linkmenu';
+		echo html_build_radio_buttons_from_arrays($vals, $texts, $select_name, $linkValues['linkmenu'], false);
+		echo '</td>';
+		echo '</tr><tr>';
+	}
 	echo '<td>'._('Menu Type').'</td><td>';
-	$texts = array('URL', 'New Page');
-	$vals = array('url', 'htmlcode');
+	if ($type == 'projectadmin') {
+		$texts = array('URL', 'URL as iframe', 'New Page');
+		$vals = array('url', 'iframe', 'htmlcode');
+	}
+	if ($type == 'globaladmin') {
+		$texts = array('URL', 'New Page');
+		$vals = array('url', 'htmlcode');
+	}
 	$select_name = 'typemenu';
 	echo html_build_radio_buttons_from_arrays($vals, $texts, $select_name, $linkValues['linktype'], false);
 	echo '</td>';
@@ -81,20 +90,18 @@ if (is_array($linkValues)) {
 		echo '<textarea name="htmlcode" rows="5" cols="80">'.$body.'</textarea>';
 	}
 	unset($GLOBALS['editor_was_set_up']);
-	echo '</td></tr><tr id="urlcode" >';
-	echo '<td>'._('URL').'</td><td><input name="link" type="text" maxsize="255" /></td>';
-	echo '</tr><tr id="urlcode"  style="display:none" >';
+	echo '</td></tr><tr id="urlcode"  style="display:none" >';
 	echo '<td>'._('URL').'</td><td><input name="link" type="text" maxsize="255" value="'.$linkValues['url'].'" /></td>';
 	echo '</tr><tr>';
 	echo '<td>';
 	echo '<input type="hidden" name="linkid" value="'.$linkId.'" />';
 	echo '<input type="submit" value="'. _('Update') .'" />';
-	echo '<a href="/plugins/'.$headermenu->name.'/?type=globaladmin"><input type="button" value="'. _('Cancel') .'" /></a>';
+	echo '<a href="/plugins/'.$headermenu->name.'/?type='.$type.'"><input type="button" value="'. _('Cancel') .'" /></a>';
 	echo '</td>';
 	echo $HTML->boxBottom();
 	echo '</tr></table>';
 	echo '</form>';
 } else {
 	$error_msg = _('Cannot retrieve value for this link:').' '.$linkId;
-	session_redirect('plugins/'.$headermenu->name.'/?type=globaladmin&error_msg='.urlencode($error_msg));
+	session_redirect('plugins/'.$headermenu->name.'/?type='.$type.'&error_msg='.urlencode($error_msg));
 }
diff --git a/src/plugins/headermenu/www/scripts/HeaderMenuController.js b/src/plugins/headermenu/www/scripts/HeaderMenuController.js
index 68aee35..84f2dce 100644
--- a/src/plugins/headermenu/www/scripts/HeaderMenuController.js
+++ b/src/plugins/headermenu/www/scripts/HeaderMenuController.js
@@ -1,7 +1,7 @@
 /**
  * headerMenu Plugin Js Controller
  *
- * Copyright 2012, Franck Villaume - TrivialDev
+ * Copyright 2012-2013, Franck Villaume - TrivialDev
  * http://fusionforge.org
  *
  * This file is part of FusionForge. FusionForge is free software;
@@ -104,8 +104,15 @@ EditHeaderMenuController.prototype =
 	bindControls: function() {
 		this.params.inputHtmlCode.click(jQuery.proxy(this, "htmlCodeView"));
 		this.params.inputURL.click(jQuery.proxy(this, "htmlUrlView"));
-		this.params.inputOuter.click(jQuery.proxy(this, "inputHtmlCodeView"));
-		this.params.inputHeader.click(jQuery.proxy(this, "headerView"));
+		if (typeof(this.params.inputOuter) != 'undefined') {
+			this.params.inputOuter.click(jQuery.proxy(this, "inputHtmlCodeView"));
+		}
+		if (typeof(this.params.inputHeader) != 'undefined') {
+			this.params.inputHeader.click(jQuery.proxy(this, "headerView"));
+		}
+		if (typeof(this.params.inputURLIframe) != 'undefined') {
+			this.params.inputURLIframe.click(jQuery.proxy(this, "htmlUrlView"));
+		}
 	},
 
 	initializeView: function() {
@@ -120,6 +127,12 @@ EditHeaderMenuController.prototype =
 			this.params.trHtmlCode.hide();
 			this.params.trUrlCode.show();
 		}
+		if (typeof(this.params.inputURLIframe) != 'undefined') {
+			if (this.params.inputURLIframe.attr("checked")) {
+				this.params.trHtmlCode.hide();
+				this.params.trUrlCode.show();
+			}
+		}
 	},
 
 	htmlUrlView: function() {

commit 161ce1192d9e64e99373f8e4cf7d5a6b78481887
Author: Franck Villaume <franck.villaume at trivialdev.com>
Date:   Mon Dec 31 18:10:59 2012 +0100

    add new column: ordering, to support order between link

diff --git a/src/plugins/headermenu/db/20121231-reorderentry.sql b/src/plugins/headermenu/db/20121231-reorderentry.sql
new file mode 100644
index 0000000..2f1dccf
--- /dev/null
+++ b/src/plugins/headermenu/db/20121231-reorderentry.sql
@@ -0,0 +1 @@
+ALTER TABLE plugin_headermenu ADD COLUMN ordering integer DEFAULT 0 NOT NULL;

commit e3ef7e0aa6ec1a92234e8c8c23ceb553cc2ff5f1
Author: Franck Villaume <franck.villaume at trivialdev.com>
Date:   Mon Dec 31 17:56:38 2012 +0100

    add support for iframe in groupmenu

diff --git a/src/plugins/headermenu/action/addLink.php b/src/plugins/headermenu/action/addLink.php
index a31060f..665e460 100644
--- a/src/plugins/headermenu/action/addLink.php
+++ b/src/plugins/headermenu/action/addLink.php
@@ -30,6 +30,7 @@ $name = strip_tags(getStringFromRequest('name'));
 $linkmenu = getStringFromRequest('linkmenu');
 $htmlcode = getStringFromRequest('htmlcode');
 $type = getStringFromRequest('type');
+$iframed = getIntFromRequest('iframeview');
 
 $redirect_url = 'plugins/'.$headermenu->name.'/?type='.$type;
 if (isset($group_id) && $group_id) {
@@ -60,7 +61,11 @@ if (!empty($name) && !empty($linkmenu)) {
 		case 'groupmenu': {
 			if (!empty($link)) {
 				if (util_check_url($link)) {
-					if ($headermenu->addLink($link, $name, $description, $linkmenu)) {
+					$linktype = 'URL';
+					if ($iframed) {
+						$linktype = 'iframe';
+					}
+					if ($headermenu->addLink($link, $name, $description, $linkmenu, $linktype)) {
 						$feedback = _('Task succeeded.');
 						session_redirect($redirect_url.'&feedback='.urlencode($feedback));
 					}
diff --git a/src/plugins/headermenu/common/headermenuPlugin.class.php b/src/plugins/headermenu/common/headermenuPlugin.class.php
index d9debd0..93efda2 100644
--- a/src/plugins/headermenu/common/headermenuPlugin.class.php
+++ b/src/plugins/headermenu/common/headermenuPlugin.class.php
@@ -147,10 +147,10 @@ class headermenuPlugin extends Plugin {
 						break;
 					}
 					case 'iframe': {
-						$params['DIRS'][] = '/plugins/'.$this->name.'/?type=iframe&group_id='.$params['group'].'&pageid='.$link['id_headermenu'];
+						$params['DIRS'][] = '/plugins/'.$this->name.'/?type=iframeview&group_id='.$params['group'].'&pageid='.$link['id_headermenu'];
 						$params['TITLES'][] = $link['name'];
 						$params['TOOLTIPS'][] = $link['description'];
-						if ($params['toptab'] == '/plugins/'.$this->name.'/?type=iframe&group_id='.$params['group'].'&pageid='.$link['id_headermenu']) {
+						if ($params['toptab'] == '/plugins/'.$this->name.'/?type=iframeview&group_id='.$params['group'].'&pageid='.$link['id_headermenu']) {
 							$params['selected'] = (count($params['DIRS'])-1);
 						}
 						break;
@@ -286,7 +286,8 @@ class headermenuPlugin extends Plugin {
 	 * @return	string	the html code
 	 */
 	 function iframeView($pageid) {
-		return true;
+		$link = $this->getLink($pageid);
+		return '<iframe src="'.rtrim($link['url'],'/').'" frameborder="0" height="600px" width="100%"></iframe>';
 	 }
 
 	/**
@@ -309,16 +310,17 @@ class headermenuPlugin extends Plugin {
 				$returned = true;
 				break;
 			}
-			case 'pageview': {
+			case 'pageview':
+			case 'iframeview': {
 				$link = $this->getLink($this->pageid);
 				$group_id = getIntFromRequest('group_id');
 				if ($group_id) {
-					$params['toptab'] = '/plugins/headermenu/?type=pageview&group_id='.$group_id.'&pageid='.$this->pageid;
+					$params['toptab'] = '/plugins/headermenu/?type='.$type.'&group_id='.$group_id.'&pageid='.$this->pageid;
 					$params['group'] = $group_id;
 					$params['title'] = $link['name'];
 					site_project_header($params);
 				} else {
-					site_header(array('title'=> $link['name'], 'toptab' => '/plugins/headermenu/?type=pageview&pageid='.$this->pageid));
+					site_header(array('title'=> $link['name'], 'toptab' => '/plugins/headermenu/?type='.$type.'&pageid='.$this->pageid));
 				}
 				$returned = true;
 				break;
diff --git a/src/plugins/headermenu/view/admin/viewProjectConfiguration.php b/src/plugins/headermenu/view/admin/viewProjectConfiguration.php
index 08a5691..72c7018 100644
--- a/src/plugins/headermenu/view/admin/viewProjectConfiguration.php
+++ b/src/plugins/headermenu/view/admin/viewProjectConfiguration.php
@@ -35,7 +35,8 @@ jQuery(document).ready(function() {
 		inputHtmlCode:	jQuery('#typemenu_htmlcode'),
 		inputURL:	jQuery('#typemenu_url'),
 		trHtmlCode:	jQuery('#htmlcode'),
-		trUrlCode:	jQuery('#urlcode')
+		trUrlCode:	jQuery('#urlcode'),
+		trIframeView:	jQuery('#iframe'),
     });
 });
 
@@ -51,7 +52,11 @@ if (sizeof($linksArray)) {
 	foreach ($linksArray as $link) {
 		echo '<tr>';
 		if (strlen($link['url']) > 0) {
-			echo '<td>'._('URL').' ('.htmlspecialchars($link['url']).')</td>';
+			echo '<td>'._('URL');
+			if ($link['linktype'] == 'iframe') {
+				echo ' '._('displayed as iframe');
+			}
+			echo ' ('.htmlspecialchars($link['url']).')</td>';
 		} else {
 			echo '<td>'._('static html code').'</td>';
 		}
@@ -103,6 +108,8 @@ if (!$GLOBALS['editor_was_set_up']) {
 unset($GLOBALS['editor_was_set_up']);
 echo '</td></tr><tr id="urlcode" >';
 echo '<td>'._('URL').'</td><td><input name="link" type="text" maxsize="255" /></td>';
+echo '</td></tr><tr id="iframe" >';
+echo '<td colspan="2" ><input name="iframeview" type="checkbox" value="1" />Display URL as iframe.</td>';
 echo '</tr><tr>';
 echo '<td>';
 echo '<input type="hidden" name="linkmenu" value="groupmenu" />';
diff --git a/src/plugins/headermenu/www/index.php b/src/plugins/headermenu/www/index.php
index 7418170..1f053ea 100644
--- a/src/plugins/headermenu/www/index.php
+++ b/src/plugins/headermenu/www/index.php
@@ -70,6 +70,13 @@ switch ($type) {
 		echo $headermenu->pageView($pageid);
 		break;
 	}
+	case 'iframeview': {
+		$pageid = getIntFromRequest('pageid');
+		$headermenu->pageid = $pageid;
+		$headermenu->getHeader($type);
+		echo $headermenu->iframeView($pageid);
+		break;
+	}
 	case 'projectadmin': {
 		if (!session_loggedin()) {
 			exit_not_logged_in();
diff --git a/src/plugins/headermenu/www/scripts/HeaderMenuController.js b/src/plugins/headermenu/www/scripts/HeaderMenuController.js
index 8d91e36..68aee35 100644
--- a/src/plugins/headermenu/www/scripts/HeaderMenuController.js
+++ b/src/plugins/headermenu/www/scripts/HeaderMenuController.js
@@ -85,11 +85,13 @@ GroupMenuController.prototype =
 	htmlCodeView: function() {
 		this.params.trHtmlCode.show();
 		this.params.trUrlCode.hide();
+		this.params.trIframeView.hide();
 	},
 
 	htmlUrlView: function() {
 		this.params.trHtmlCode.hide();
 		this.params.trUrlCode.show();
+		this.params.trIframeView.show();
 	},
 
 	inputHtmlCodeView: function() {

commit b14742c3b98ea23256f1c56cd481d92584291686
Author: Franck Villaume <franck.villaume at trivialdev.com>
Date:   Mon Dec 31 15:23:15 2012 +0100

    fix selected entry in html code for groupmenu

diff --git a/src/plugins/headermenu/common/headermenuPlugin.class.php b/src/plugins/headermenu/common/headermenuPlugin.class.php
index 2aa7f74..d9debd0 100644
--- a/src/plugins/headermenu/common/headermenuPlugin.class.php
+++ b/src/plugins/headermenu/common/headermenuPlugin.class.php
@@ -141,12 +141,18 @@ class headermenuPlugin extends Plugin {
 						$params['DIRS'][] = '/plugins/'.$this->name.'/?type=pageview&group_id='.$params['group'].'&pageid='.$link['id_headermenu'];
 						$params['TITLES'][] = $link['name'];
 						$params['TOOLTIPS'][] = $link['description'];
+						if ($params['toptab'] == '/plugins/'.$this->name.'/?type=pageview&group_id='.$params['group'].'&pageid='.$link['id_headermenu']) {
+							$params['selected'] = (count($params['DIRS'])-1);
+						}
 						break;
 					}
 					case 'iframe': {
 						$params['DIRS'][] = '/plugins/'.$this->name.'/?type=iframe&group_id='.$params['group'].'&pageid='.$link['id_headermenu'];
 						$params['TITLES'][] = $link['name'];
 						$params['TOOLTIPS'][] = $link['description'];
+						if ($params['toptab'] == '/plugins/'.$this->name.'/?type=iframe&group_id='.$params['group'].'&pageid='.$link['id_headermenu']) {
+							$params['selected'] = (count($params['DIRS'])-1);
+						}
 						break;
 					}
 				}
@@ -307,11 +313,9 @@ class headermenuPlugin extends Plugin {
 				$link = $this->getLink($this->pageid);
 				$group_id = getIntFromRequest('group_id');
 				if ($group_id) {
-					$params['toptab'] = '/plugins/headermenu/?type=pageview&group_id='.$group_id.'pageid='.$this->pageid;
+					$params['toptab'] = '/plugins/headermenu/?type=pageview&group_id='.$group_id.'&pageid='.$this->pageid;
 					$params['group'] = $group_id;
 					$params['title'] = $link['name'];
-					$params['pagename'] = $link['name'];
-					$params['sectionvals'] = array(group_getname($group_id));
 					site_project_header($params);
 				} else {
 					site_header(array('title'=> $link['name'], 'toptab' => '/plugins/headermenu/?type=pageview&pageid='.$this->pageid));

commit dc3f2903587ec46ec93eb097570369dfcbb91b5c
Author: Franck Villaume <franck.villaume at trivialdev.com>
Date:   Mon Dec 31 11:27:22 2012 +0100

    add support for html page in groupmenu

diff --git a/src/plugins/headermenu/action/addLink.php b/src/plugins/headermenu/action/addLink.php
index 2bbb69c..a31060f 100644
--- a/src/plugins/headermenu/action/addLink.php
+++ b/src/plugins/headermenu/action/addLink.php
@@ -56,7 +56,8 @@ if (!empty($name) && !empty($linkmenu)) {
 			session_redirect($redirect_url.'&warning_msg='.urlencode($warning_msg));
 			break;
 		}
-		case 'outermenu': {
+		case 'outermenu':
+		case 'groupmenu': {
 			if (!empty($link)) {
 				if (util_check_url($link)) {
 					if ($headermenu->addLink($link, $name, $description, $linkmenu)) {
@@ -81,21 +82,6 @@ if (!empty($name) && !empty($linkmenu)) {
 			$warning_msg = _('Missing Link URL or Html Code.');
 			session_redirect($redirect_url.'&warning_msg='.urlencode($warning_msg));
 		}
-		case 'groupmenu': {
-			if (!empty($link)) {
-				if (util_check_url($link)) {
-					if ($headermenu->addLink($link, $name, $description, $linkmenu)) {
-						$feedback = _('Task succeeded.');
-						session_redirect($redirect_url.'&feedback='.urlencode($feedback));
-					}
-					$error_msg = _('Task failed');
-					session_redirect($redirect_url.'&error_msg='.urlencode($error_msg));
-				} else {
-					$error_msg = _('Provided Link is not a valid URL.');
-					session_redirect($redirect_url.'&error_msg='.urlencode($error_msg));
-				}
-			}
-		}
 	}
 }
 $warning_msg = _('No link to create or name missing.');
diff --git a/src/plugins/headermenu/common/headermenuPlugin.class.php b/src/plugins/headermenu/common/headermenuPlugin.class.php
index 4a9b0da..2aa7f74 100644
--- a/src/plugins/headermenu/common/headermenuPlugin.class.php
+++ b/src/plugins/headermenu/common/headermenuPlugin.class.php
@@ -138,13 +138,13 @@ class headermenuPlugin extends Plugin {
 						break;
 					}
 					case 'htmlcode': {
-						$params['DIRS'][] = '/plugins/'.$this->name.'/?type=pageview&pageid='.$link['id_headermenu'];
+						$params['DIRS'][] = '/plugins/'.$this->name.'/?type=pageview&group_id='.$params['group'].'&pageid='.$link['id_headermenu'];
 						$params['TITLES'][] = $link['name'];
 						$params['TOOLTIPS'][] = $link['description'];
 						break;
 					}
 					case 'iframe': {
-						$params['DIRS'][] = '/plugins/'.$this->name.'/?type=iframe&pageid='.$link['id_headermenu'];
+						$params['DIRS'][] = '/plugins/'.$this->name.'/?type=iframe&group_id='.$params['group'].'&pageid='.$link['id_headermenu'];
 						$params['TITLES'][] = $link['name'];
 						$params['TOOLTIPS'][] = $link['description'];
 						break;
@@ -305,7 +305,17 @@ class headermenuPlugin extends Plugin {
 			}
 			case 'pageview': {
 				$link = $this->getLink($this->pageid);
-				site_header(array('title'=> $link['name'], 'toptab' => '/plugins/headermenu/?pageview&pageid='.$this->pageid));
+				$group_id = getIntFromRequest('group_id');
+				if ($group_id) {
+					$params['toptab'] = '/plugins/headermenu/?type=pageview&group_id='.$group_id.'pageid='.$this->pageid;
+					$params['group'] = $group_id;
+					$params['title'] = $link['name'];
+					$params['pagename'] = $link['name'];
+					$params['sectionvals'] = array(group_getname($group_id));
+					site_project_header($params);
+				} else {
+					site_header(array('title'=> $link['name'], 'toptab' => '/plugins/headermenu/?type=pageview&pageid='.$this->pageid));
+				}
 				$returned = true;
 				break;
 			}

commit b8a7855ee06bfb2160fe487a7c5bc565b2e78da2
Author: Franck Villaume <franck.villaume at trivialdev.com>
Date:   Sun Dec 30 20:38:42 2012 +0100

    start htmlcode support in groupmenu

diff --git a/src/plugins/headermenu/action/updateLinkStatus.php b/src/plugins/headermenu/action/updateLinkStatus.php
index ff482e8..03cce2a 100644
--- a/src/plugins/headermenu/action/updateLinkStatus.php
+++ b/src/plugins/headermenu/action/updateLinkStatus.php
@@ -22,18 +22,23 @@
  */
 
 global $headermenu;
+global $type;
+global $group_id;
 
-session_require_global_perm('forge_admin');
 $idLink = getIntFromRequest('linkid');
 $linkStatus = getIntFromRequest('linkstatus');
+$redirect_url = 'plugins/'.$headermenu->name.'/?type='.$type;
+if (isset($group_id) && $group_id) {
+	$redirect_url .= '&group_id='.$group_id;
+}
 
 if (!empty($idLink)) {
 	if ($headermenu->updateLinkStatus($idLink, $linkStatus)) {
 		$feedback = _('Link Status updated');
-		session_redirect('plugins/'.$headermenu->name.'/?type=globaladmin&feedback='.urlencode($feedback));
+		session_redirect($redirect_url.'&feedback='.urlencode($feedback));
 	}
 	$error_msg = _('Task failed');
-	session_redirect('plugins/'.$headermenu->name.'/?type=globaladmin&error_msg='.urlencode($error_msg));
+	session_redirect($redirect_url.'&error_msg='.urlencode($error_msg));
 }
 $warning_msg = _('Missing Link or status to be updated.');
-session_redirect('plugins/'.$headermenu->name.'/?type=globaladmin&warning_msg='.urlencode($warning_msg));
+session_redirect($redirect_url.'&warning_msg='.urlencode($warning_msg));
diff --git a/src/plugins/headermenu/common/headermenuPlugin.class.php b/src/plugins/headermenu/common/headermenuPlugin.class.php
index b2fe5f7..4a9b0da 100644
--- a/src/plugins/headermenu/common/headermenuPlugin.class.php
+++ b/src/plugins/headermenu/common/headermenuPlugin.class.php
@@ -311,6 +311,7 @@ class headermenuPlugin extends Plugin {
 			}
 			case 'projectadmin': {
 				html_use_jquery();
+				use_javascript('scripts/HeaderMenuController.js');
 				use_javascript('/js/sortable.js');
 				site_header(array('title'=>_('Project Menu Admin'), 'toptab' => ''));
 				$returned = true;
diff --git a/src/plugins/headermenu/view/admin/viewProjectConfiguration.php b/src/plugins/headermenu/view/admin/viewProjectConfiguration.php
index 0a04884..08a5691 100644
--- a/src/plugins/headermenu/view/admin/viewProjectConfiguration.php
+++ b/src/plugins/headermenu/view/admin/viewProjectConfiguration.php
@@ -27,6 +27,20 @@ global $group_id;
 
 ?>
 
+<script language="Javascript" type="text/javascript">//<![CDATA[
+var controllerGroupMenu;
+
+jQuery(document).ready(function() {
+	controllerGroupMenu = new GroupMenuController({
+		inputHtmlCode:	jQuery('#typemenu_htmlcode'),
+		inputURL:	jQuery('#typemenu_url'),
+		trHtmlCode:	jQuery('#htmlcode'),
+		trUrlCode:	jQuery('#urlcode')
+    });
+});
+
+//]]></script>
+
 <?php
 $linksArray = $headermenu->getAvailableLinks('groupmenu');
 if (sizeof($linksArray)) {
@@ -67,7 +81,27 @@ echo '<td>'._('Displayed Name').'</td><td><input name="name" type="text" maxsize
 echo '</tr><tr>';
 echo '<td>'._('Description').'</td><td><input name="description" type="text" maxsize="255" /></td>';
 echo '</tr><tr>';
-echo '<tr id="urlcode" >';
+echo '<td>'._('Menu Type').'</td><td>';
+$texts = array('URL', 'New Page');
+$vals = array('url', 'htmlcode');
+$select_name = 'typemenu';
+echo html_build_radio_buttons_from_arrays($vals, $texts, $select_name, 'url', false);
+echo '</td>';
+echo '</tr><tr id="htmlcode" style="display:none">';
+echo '<td>'._('Your HTML Code.').'</td><td>';
+$GLOBALS['editor_was_set_up'] = false;
+$body = _('Just paste your code here...');
+$params['name'] = 'htmlcode';
+$params['body'] = $body;
+$params['width'] = "800";
+$params['height'] = "500";
+$params['user_id'] = user_getid();
+plugin_hook("text_editor", $params);
+if (!$GLOBALS['editor_was_set_up']) {
+	echo '<textarea name="htmlcode" rows="5" cols="80">'.$body.'</textarea>';
+}
+unset($GLOBALS['editor_was_set_up']);
+echo '</td></tr><tr id="urlcode" >';
 echo '<td>'._('URL').'</td><td><input name="link" type="text" maxsize="255" /></td>';
 echo '</tr><tr>';
 echo '<td>';
diff --git a/src/plugins/headermenu/www/scripts/HeaderMenuController.js b/src/plugins/headermenu/www/scripts/HeaderMenuController.js
index ef9a7ed..8d91e36 100644
--- a/src/plugins/headermenu/www/scripts/HeaderMenuController.js
+++ b/src/plugins/headermenu/www/scripts/HeaderMenuController.js
@@ -32,6 +32,12 @@ HeaderMenuController = function(params) {
 	this.initializeView();
 };
 
+GroupMenuController = function(params) {
+	this.params = params;
+	this.bindControls();
+	this.initializeView();
+};
+
 HeaderMenuController.prototype =
 {
 	bindControls: function() {
@@ -63,6 +69,34 @@ HeaderMenuController.prototype =
 	}
 };
 
+GroupMenuController.prototype =
+{
+	bindControls: function() {
+		this.params.inputHtmlCode.click(jQuery.proxy(this, "htmlCodeView"));
+		this.params.inputURL.click(jQuery.proxy(this, "htmlUrlView"));
+	},
+
+	initializeView: function() {
+		this.params.trHtmlCode.hide();
+		this.params.trUrlCode.show();
+		this.params.inputURL.attr('checked', 'checked');
+	},
+
+	htmlCodeView: function() {
+		this.params.trHtmlCode.show();
+		this.params.trUrlCode.hide();
+	},
+
+	htmlUrlView: function() {
+		this.params.trHtmlCode.hide();
+		this.params.trUrlCode.show();
+	},
+
+	inputHtmlCodeView: function() {
+		this.params.inputHtmlCode.prop('disabled', false);
+	}
+};
+
 EditHeaderMenuController.prototype =
 {
 	bindControls: function() {

commit b41cc64626e4e2fb6744e03f6bc39850b184bbed
Author: Franck Villaume <franck.villaume at trivialdev.com>
Date:   Sun Dec 30 19:56:25 2012 +0100

    support delete link in groupmenu

diff --git a/src/plugins/headermenu/action/addLink.php b/src/plugins/headermenu/action/addLink.php
index 9143385..2bbb69c 100644
--- a/src/plugins/headermenu/action/addLink.php
+++ b/src/plugins/headermenu/action/addLink.php
@@ -31,6 +31,11 @@ $linkmenu = getStringFromRequest('linkmenu');
 $htmlcode = getStringFromRequest('htmlcode');
 $type = getStringFromRequest('type');
 
+$redirect_url = 'plugins/'.$headermenu->name.'/?type='.$type;
+if (isset($group_id) && $group_id) {
+	$redirect_url .= '&group_id='.$group_id;
+}
+
 if (!empty($name) && !empty($linkmenu)) {
 	switch ($linkmenu) {
 		case 'headermenu': {
@@ -38,17 +43,17 @@ if (!empty($name) && !empty($linkmenu)) {
 				if (util_check_url($link)) {
 					if ($headermenu->addLink($link, $name, $description, $linkmenu)) {
 						$feedback = _('Task succeeded.');
-						session_redirect('plugins/'.$headermenu->name.'/?type='.$type.'&feedback='.urlencode($feedback));
+						session_redirect($redirect_url.'&feedback='.urlencode($feedback));
 					}
 					$error_msg = _('Task failed');
-					session_redirect('plugins/'.$headermenu->name.'/?type='.$type.'&error_msg='.urlencode($error_msg));
+					session_redirect($redirect_url.'&error_msg='.urlencode($error_msg));
 				} else {
 					$error_msg = _('Provided Link is not a valid URL.');
-					session_redirect('plugins/'.$headermenu->name.'/?type='.$type.'&error_msg='.urlencode($error_msg));
+					session_redirect($redirect_url.'&error_msg='.urlencode($error_msg));
 				}
 			}
 			$warning_msg = _('Missing Link URL.');
-			session_redirect('plugins/'.$headermenu->name.'/?type='.$type.'&warning_msg='.urlencode($warning_msg));
+			session_redirect($redirect_url.'&warning_msg='.urlencode($warning_msg));
 			break;
 		}
 		case 'outermenu': {
@@ -56,46 +61,42 @@ if (!empty($name) && !empty($linkmenu)) {
 				if (util_check_url($link)) {
 					if ($headermenu->addLink($link, $name, $description, $linkmenu)) {
 						$feedback = _('Task succeeded.');
-						session_redirect('plugins/'.$headermenu->name.'/?type='.$type.'&feedback='.urlencode($feedback));
+						session_redirect($redirect_url.'&feedback='.urlencode($feedback));
 					}
 					$error_msg = _('Task failed');
-					session_redirect('plugins/'.$headermenu->name.'/?type='.$type.'&error_msg='.urlencode($error_msg));
+					session_redirect($redirect_url.'&error_msg='.urlencode($error_msg));
 				} else {
 					$error_msg = _('Provided Link is not a valid URL.');
-					session_redirect('plugins/'.$headermenu->name.'/?type='.$type.'&error_msg='.urlencode($error_msg));
+					session_redirect($redirect_url.'&error_msg='.urlencode($error_msg));
 				}
 			}
 			if (!empty($htmlcode)) {
 				if ($headermenu->addLink('', $name, $description, $linkmenu, 'htmlcode', $htmlcode)) {
 					$feedback = _('Task succeeded.');
-					session_redirect('plugins/'.$headermenu->name.'/?type='.$type.'&feedback='.urlencode($feedback));
+					session_redirect($redirect_url.'&feedback='.urlencode($feedback));
 				}
 				$error_msg = _('Task failed');
-				session_redirect('plugins/'.$headermenu->name.'/?type='.$type.'&error_msg='.urlencode($error_msg));
+				session_redirect($redirect_url.'&error_msg='.urlencode($error_msg));
 			}
 			$warning_msg = _('Missing Link URL or Html Code.');
-			session_redirect('plugins/'.$headermenu->name.'/?type='.$type.'&warning_msg='.urlencode($warning_msg));
+			session_redirect($redirect_url.'&warning_msg='.urlencode($warning_msg));
 		}
 		case 'groupmenu': {
 			if (!empty($link)) {
 				if (util_check_url($link)) {
 					if ($headermenu->addLink($link, $name, $description, $linkmenu)) {
 						$feedback = _('Task succeeded.');
-						session_redirect('plugins/'.$headermenu->name.'/?type='.$type.'&group_id='.$group_id.'&feedback='.urlencode($feedback));
+						session_redirect($redirect_url.'&feedback='.urlencode($feedback));
 					}
 					$error_msg = _('Task failed');
-					session_redirect('plugins/'.$headermenu->name.'/?type='.$type.'&group_id='.$group_id.'&error_msg='.urlencode($error_msg));
+					session_redirect($redirect_url.'&error_msg='.urlencode($error_msg));
 				} else {
 					$error_msg = _('Provided Link is not a valid URL.');
-					session_redirect('plugins/'.$headermenu->name.'/?type='.$type.'&group_id='.$group_id.'&error_msg='.urlencode($error_msg));
+					session_redirect($redirect_url.'&error_msg='.urlencode($error_msg));
 				}
 			}
 		}
 	}
 }
 $warning_msg = _('No link to create or name missing.');
-$url = 'plugins/'.$headermenu->name.'/?type='.$type;
-if (isset($group_id)) {
-	$url .= '&group_id='.$group_id;
-}
-session_redirect($url.'&warning_msg='.urlencode($warning_msg));
+session_redirect($redirect_url.'&warning_msg='.urlencode($warning_msg));
diff --git a/src/plugins/headermenu/action/deleteLink.php b/src/plugins/headermenu/action/deleteLink.php
index 4859571..8cf9ecc 100644
--- a/src/plugins/headermenu/action/deleteLink.php
+++ b/src/plugins/headermenu/action/deleteLink.php
@@ -22,17 +22,22 @@
  */
 
 global $headermenu;
+global $type;
+global $group_id;
 
-session_require_global_perm('forge_admin');
 $idLink = getIntFromRequest('linkid');
+$redirect_url = 'plugins/'.$headermenu->name.'/?type='.$type;
+if (isset($group_id) && $group_id) {
+	$redirect_url .= '&group_id='.$group_id;
+}
 
 if (!empty($idLink)) {
 	if ($headermenu->deleteLink($idLink)) {
 		$feedback = _('Link deleted');
-		session_redirect('plugins/'.$headermenu->name.'/?type=globaladmin&feedback='.urlencode($feedback));
+		session_redirect($redirect_url.'&feedback='.urlencode($feedback));
 	}
 	$error_msg = _('Task failed');
-	session_redirect('plugins/'.$headermenu->name.'/?type=globaladmin&error_msg='.urlencode($error_msg));
+	session_redirect($redirect_url.'&error_msg='.urlencode($error_msg));
 }
 $warning_msg = _('Missing Link to be deleted.');
-session_redirect('plugins/'.$headermenu->name.'/?type=globaladmin&warning_msg='.urlencode($warning_msg));
+session_redirect($redirect_url.'&warning_msg='.urlencode($warning_msg));
diff --git a/src/plugins/headermenu/common/headermenuPlugin.class.php b/src/plugins/headermenu/common/headermenuPlugin.class.php
index e7335cb..b2fe5f7 100644
--- a/src/plugins/headermenu/common/headermenuPlugin.class.php
+++ b/src/plugins/headermenu/common/headermenuPlugin.class.php
@@ -62,7 +62,7 @@ class headermenuPlugin extends Plugin {
 				$project = group_get_object($group_id);
 				if ($project->usesPlugin($this->name)) {
 					echo '<p>'.util_make_link('/plugins/headermenu/?type=projectadmin&group_id='.$group_id,
-					     _('Project HeaderMenu Admin'), array('class' => 'tabtitle', 'title' => _('Add/Remove/Activate/Desactivate tabs'))) . '</p>';
+					     _('Project GroupMenu Admin'), array('class' => 'tabtitle', 'title' => _('Add/Remove/Activate/Desactivate tabs'))) . '</p>';
 				}
 				break;
 			}
@@ -311,6 +311,7 @@ class headermenuPlugin extends Plugin {
 			}
 			case 'projectadmin': {
 				html_use_jquery();
+				use_javascript('/js/sortable.js');
 				site_header(array('title'=>_('Project Menu Admin'), 'toptab' => ''));
 				$returned = true;
 				break;
diff --git a/src/plugins/headermenu/view/admin/viewProjectConfiguration.php b/src/plugins/headermenu/view/admin/viewProjectConfiguration.php
index 299cdee..0a04884 100644
--- a/src/plugins/headermenu/view/admin/viewProjectConfiguration.php
+++ b/src/plugins/headermenu/view/admin/viewProjectConfiguration.php
@@ -29,6 +29,36 @@ global $group_id;
 
 <?php
 $linksArray = $headermenu->getAvailableLinks('groupmenu');
+if (sizeof($linksArray)) {
+	echo $HTML->boxTop(_('Manage available links'));
+	$tabletop = array(_('Menu Type'), _('Displayed Name'), _('Description'), _('Status'), _('Actions'));
+	$classth = array('','','','','unsortable');
+	echo $HTML->listTableTop($tabletop, false, 'sortable_headermenu_listlinks', 'sortable', $classth);
+	foreach ($linksArray as $link) {
+		echo '<tr>';
+		if (strlen($link['url']) > 0) {
+			echo '<td>'._('URL').' ('.htmlspecialchars($link['url']).')</td>';
+		} else {
+			echo '<td>'._('static html code').'</td>';
+		}
+		echo '<td>'.htmlspecialchars($link['name']).'</td>';
+		echo '<td>'.htmlspecialchars($link['description']).'</td>';
+		if ($link['is_enable']) {
+			echo '<td>'.html_image('docman/validate.png', 22, 22, array('alt'=>_('link is on'), 'class'=>'tabtitle', 'title'=>_('link is on'))).'</td>';
+			echo '<td><a class="tabtitle-ne" title="'._('Desactivate this link').'" href="index.php?type=projectadmin&group_id='.$group_id.'&action=updateLinkStatus&linkid='.$link['id_headermenu'].'&linkstatus=0">'.html_image('docman/release-document.png', 22, 22, array('alt'=>_('Desactivate this link'))). '</a>';
+		} else {
+			echo '<td>'.html_image('docman/delete-directory.png', 22, 22, array('alt'=>_('link is off'), 'class'=>'tabtitle', 'title'=>_('link is off'))).'</td>';
+			echo '<td><a class="tabtitle-ne" title="'._('Activate this link').'" href="index.php?type=projectadmin&group_id='.$group_id.'&action=updateLinkStatus&linkid='.$link['id_headermenu'].'&linkstatus=1">'.html_image('docman/reserve-document.png', 22, 22, array('alt'=>_('Activate this link'))). '</a>';
+		}
+		echo '<a class="tabtitle-ne" title="'._('Edit this link').'" href="index.php?type=projectadmin&group_id='.$group_id.'&view=updateLinkValue&linkid='.$link['id_headermenu'].'">'.html_image('docman/edit-file.png',22,22, array('alt'=>_('Edit this link'))). '</a>';
+		echo '<a class="tabtitle-ne" title="'._('Delete this link').'" href="index.php?type=projectadmin&group_id='.$group_id.'&action=deleteLink&linkid='.$link['id_headermenu'].'">'.html_image('docman/trash-empty.png',22,22, array('alt'=>_('Delete this link'))). '</a>';
+		echo '</td>';
+		echo '</tr>';
+	}
+	echo $HTML->listTableBottom();
+	echo $HTML->boxBottom();
+	echo '</br>';
+}
 
 echo '<form method="POST" name="addLink" action="index.php?type=projectadmin&group_id='.$group_id.'&action=addLink">';
 echo '<table><tr>';
diff --git a/src/plugins/headermenu/www/index.php b/src/plugins/headermenu/www/index.php
index d0ea3eb..7418170 100644
--- a/src/plugins/headermenu/www/index.php
+++ b/src/plugins/headermenu/www/index.php
@@ -78,6 +78,7 @@ switch ($type) {
 		session_require_perm('project_admin', $group_id);
 		$action = getStringFromRequest('action');
 		$view = getStringFromRequest('view');
+
 		switch ($action) {
 			case 'addLink':
 			case 'updateLinkValue':

commit 13f7262281106ed01c3259f45119a2d6a17c994f
Author: Franck Villaume <franck.villaume at trivialdev.com>
Date:   Sun Dec 30 19:22:55 2012 +0100

    support add link in groupmenu

diff --git a/src/plugins/headermenu/action/addLink.php b/src/plugins/headermenu/action/addLink.php
index 501348d..9143385 100644
--- a/src/plugins/headermenu/action/addLink.php
+++ b/src/plugins/headermenu/action/addLink.php
@@ -1,6 +1,6 @@
 <?php
 /**
- * headermenu plugin
+ * headermenu plugin : addLink action
  *
  * Copyright 2012, Franck Villaume - TrivialDev
  * http://fusionforge.org
@@ -22,60 +22,80 @@
  */
 
 global $headermenu;
+global $group_id;
 
-session_require_global_perm('forge_admin');
 $link = getStringFromRequest('link');
 $description = strip_tags(getStringFromRequest('description'));
 $name = strip_tags(getStringFromRequest('name'));
 $linkmenu = getStringFromRequest('linkmenu');
 $htmlcode = getStringFromRequest('htmlcode');
+$type = getStringFromRequest('type');
 
 if (!empty($name) && !empty($linkmenu)) {
 	switch ($linkmenu) {
-		case "headermenu": {
+		case 'headermenu': {
 			if (!empty($link)) {
 				if (util_check_url($link)) {
 					if ($headermenu->addLink($link, $name, $description, $linkmenu)) {
 						$feedback = _('Task succeeded.');
-						session_redirect('plugins/'.$headermenu->name.'/?type=globaladmin&feedback='.urlencode($feedback));
+						session_redirect('plugins/'.$headermenu->name.'/?type='.$type.'&feedback='.urlencode($feedback));
 					}
 					$error_msg = _('Task failed');
-					session_redirect('plugins/'.$headermenu->name.'/?type=globaladmin&error_msg='.urlencode($error_msg));
+					session_redirect('plugins/'.$headermenu->name.'/?type='.$type.'&error_msg='.urlencode($error_msg));
 				} else {
 					$error_msg = _('Provided Link is not a valid URL.');
-					session_redirect('plugins/'.$headermenu->name.'/?type=globaladmin&error_msg='.urlencode($error_msg));
+					session_redirect('plugins/'.$headermenu->name.'/?type='.$type.'&error_msg='.urlencode($error_msg));
 				}
 			}
 			$warning_msg = _('Missing Link URL.');
-			session_redirect('plugins/'.$headermenu->name.'/?type=globaladmin&warning_msg='.urlencode($warning_msg));
+			session_redirect('plugins/'.$headermenu->name.'/?type='.$type.'&warning_msg='.urlencode($warning_msg));
 			break;
 		}
-		case "outermenu": {
+		case 'outermenu': {
 			if (!empty($link)) {
 				if (util_check_url($link)) {
 					if ($headermenu->addLink($link, $name, $description, $linkmenu)) {
 						$feedback = _('Task succeeded.');
-						session_redirect('plugins/'.$headermenu->name.'/?type=globaladmin&feedback='.urlencode($feedback));
+						session_redirect('plugins/'.$headermenu->name.'/?type='.$type.'&feedback='.urlencode($feedback));
 					}
 					$error_msg = _('Task failed');
-					session_redirect('plugins/'.$headermenu->name.'/?type=globaladmin&error_msg='.urlencode($error_msg));
+					session_redirect('plugins/'.$headermenu->name.'/?type='.$type.'&error_msg='.urlencode($error_msg));
 				} else {
 					$error_msg = _('Provided Link is not a valid URL.');
-					session_redirect('plugins/'.$headermenu->name.'/?type=globaladmin&error_msg='.urlencode($error_msg));
+					session_redirect('plugins/'.$headermenu->name.'/?type='.$type.'&error_msg='.urlencode($error_msg));
 				}
 			}
 			if (!empty($htmlcode)) {
 				if ($headermenu->addLink('', $name, $description, $linkmenu, 'htmlcode', $htmlcode)) {
 					$feedback = _('Task succeeded.');
-					session_redirect('plugins/'.$headermenu->name.'/?type=globaladmin&feedback='.urlencode($feedback));
+					session_redirect('plugins/'.$headermenu->name.'/?type='.$type.'&feedback='.urlencode($feedback));
 				}
 				$error_msg = _('Task failed');
-				session_redirect('plugins/'.$headermenu->name.'/?type=globaladmin&error_msg='.urlencode($error_msg));
+				session_redirect('plugins/'.$headermenu->name.'/?type='.$type.'&error_msg='.urlencode($error_msg));
 			}
 			$warning_msg = _('Missing Link URL or Html Code.');
-			session_redirect('plugins/'.$headermenu->name.'/?type=globaladmin&warning_msg='.urlencode($warning_msg));
+			session_redirect('plugins/'.$headermenu->name.'/?type='.$type.'&warning_msg='.urlencode($warning_msg));
+		}
+		case 'groupmenu': {
+			if (!empty($link)) {
+				if (util_check_url($link)) {
+					if ($headermenu->addLink($link, $name, $description, $linkmenu)) {
+						$feedback = _('Task succeeded.');
+						session_redirect('plugins/'.$headermenu->name.'/?type='.$type.'&group_id='.$group_id.'&feedback='.urlencode($feedback));
+					}
+					$error_msg = _('Task failed');
+					session_redirect('plugins/'.$headermenu->name.'/?type='.$type.'&group_id='.$group_id.'&error_msg='.urlencode($error_msg));
+				} else {
+					$error_msg = _('Provided Link is not a valid URL.');
+					session_redirect('plugins/'.$headermenu->name.'/?type='.$type.'&group_id='.$group_id.'&error_msg='.urlencode($error_msg));
+				}
+			}
 		}
 	}
 }
 $warning_msg = _('No link to create or name missing.');
-session_redirect('plugins/'.$headermenu->name.'/?type=globaladmin&warning_msg='.urlencode($warning_msg));
+$url = 'plugins/'.$headermenu->name.'/?type='.$type;
+if (isset($group_id)) {
+	$url .= '&group_id='.$group_id;
+}
+session_redirect($url.'&warning_msg='.urlencode($warning_msg));
diff --git a/src/plugins/headermenu/common/headermenuPlugin.class.php b/src/plugins/headermenu/common/headermenuPlugin.class.php
index 7c6ee9c..e7335cb 100644
--- a/src/plugins/headermenu/common/headermenuPlugin.class.php
+++ b/src/plugins/headermenu/common/headermenuPlugin.class.php
@@ -27,9 +27,9 @@ class headermenuPlugin extends Plugin {
 	var $pageid;
 
 	function __construct() {
-		$this->Plugin() ;
-		$this->name = 'headermenu' ;
-		$this->text = 'headermenu' ;
+		$this->Plugin();
+		$this->name = 'headermenu';
+		$this->text = 'headermenu';
 		$this->_addHook('headermenu');
 		$this->_addHook('site_admin_option_hook');
 		$this->_addHook('outermenu');
@@ -39,7 +39,7 @@ class headermenuPlugin extends Plugin {
 		$this->_addHook('project_admin_plugins');
 	}
 
-	function CallHook ($hookname, &$params) {
+	function CallHook($hookname, &$params) {
 		switch ($hookname) {
 			case 'headermenu': {
 				$this->getHeaderLink();
@@ -332,6 +332,18 @@ class headermenuPlugin extends Plugin {
 	}
 
 	/**
+	 * getProjectAdminView - display the Project Admin View
+	 *
+	 * @return	bool	true
+	 */
+	function getProjectAdminView() {
+		global $gfplugins;
+		$user = session_get_user();
+		include $gfplugins.$this->name.'/view/admin/viewProjectConfiguration.php';
+		return true;
+	}
+
+	/**
 	 * getPluginDescription - display the description of this plugin in pluginman admin page
 	 *
 	 * @return	string	the description
diff --git a/src/plugins/headermenu/view/admin/viewGlobalConfiguration.php b/src/plugins/headermenu/view/admin/viewGlobalConfiguration.php
index f4b162c..eaa3252 100644
--- a/src/plugins/headermenu/view/admin/viewGlobalConfiguration.php
+++ b/src/plugins/headermenu/view/admin/viewGlobalConfiguration.php
@@ -1,6 +1,6 @@
 <?php
 /**
- * headermenuPlugin Class
+ * headermenu : viewGlobalConfiguration page
  *
  * Copyright 2012 Franck Villaume - TrivialDev
  * http://fusionforge.org
@@ -24,7 +24,6 @@
 global $HTML;
 global $headermenu;
 
-session_require_global_perm('forge_admin');
 ?>
 
 <script language="Javascript" type="text/javascript">//<![CDATA[
diff --git a/src/plugins/headermenu/view/admin/viewProjectConfiguration.php b/src/plugins/headermenu/view/admin/viewProjectConfiguration.php
new file mode 100644
index 0000000..299cdee
--- /dev/null
+++ b/src/plugins/headermenu/view/admin/viewProjectConfiguration.php
@@ -0,0 +1,49 @@
+<?php
+/**
+ * headermenu : viewProjectConfiguration page
+ *
+ * Copyright 2012 Franck Villaume - TrivialDev
+ * http://fusionforge.org
+ *
+ * This file is part of FusionForge. FusionForge is free software;
+ * you can redistribute it and/or modify it under the terms of the
+ * GNU General Public License as published by the Free Software
+ * Foundation; either version 2 of the Licence, or (at your option)
+ * any later version.
+ *
+ * FusionForge is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with FusionForge; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ */ 
+
+global $HTML;
+global $headermenu;
+global $group_id;
+
+?>
+
+<?php
+$linksArray = $headermenu->getAvailableLinks('groupmenu');
+
+echo '<form method="POST" name="addLink" action="index.php?type=projectadmin&group_id='.$group_id.'&action=addLink">';
+echo '<table><tr>';
+echo $HTML->boxTop(_('Add a new link'));
+echo '<td>'._('Displayed Name').'</td><td><input name="name" type="text" maxsize="255" /></td>';
+echo '</tr><tr>';
+echo '<td>'._('Description').'</td><td><input name="description" type="text" maxsize="255" /></td>';
+echo '</tr><tr>';
+echo '<tr id="urlcode" >';
+echo '<td>'._('URL').'</td><td><input name="link" type="text" maxsize="255" /></td>';
+echo '</tr><tr>';
+echo '<td>';
+echo '<input type="hidden" name="linkmenu" value="groupmenu" />';
+echo '<input type="submit" value="'. _('Add') .'" />';
+echo '</td>';
+echo $HTML->boxBottom();
+echo '</tr></table>';
+echo '</form>';
diff --git a/src/plugins/headermenu/www/index.php b/src/plugins/headermenu/www/index.php
index da2d981..d0ea3eb 100644
--- a/src/plugins/headermenu/www/index.php
+++ b/src/plugins/headermenu/www/index.php
@@ -1,6 +1,6 @@
 <?php
 /**
- * headermenu plugin
+ * headermenu plugin : index page
  *
  * Copyright 2012, Franck Villaume - TrivialDev
  * http://fusionforge.org
@@ -76,8 +76,29 @@ switch ($type) {
 		}
 		$group_id = getIntFromRequest('group_id');
 		session_require_perm('project_admin', $group_id);
+		$action = getStringFromRequest('action');
+		$view = getStringFromRequest('view');
+		switch ($action) {
+			case 'addLink':
+			case 'updateLinkValue':
+			case 'deleteLink':
+			case 'updateLinkStatus': {
+				global $gfplugins;
+				include($gfplugins.$headermenu->name.'/action/'.$action.'.php');
+				break;
+			}
+		}
 		$headermenu->getHeader($type);
-		
+		switch ($view) {
+			case 'updateLinkValue':
+				global $gfplugins;
+				include($gfplugins.$headermenu->name.'/view/admin/'.$view.'.php');
+				break;
+			default:
+				$headermenu->getProjectAdminView();
+				break;
+		}
+		break;
 	}
 }
 

commit 5b3fbc221f096665e1a3e967a4495d2a9453a320
Author: Franck Villaume <franck.villaume at trivialdev.com>
Date:   Sun Dec 23 21:28:40 2012 +0100

    sync CHANGES

diff --git a/src/CHANGES b/src/CHANGES
index 97eddb7..630233a 100644
--- a/src/CHANGES
+++ b/src/CHANGES
@@ -15,7 +15,8 @@ FusionForge-5.3:
 * Docman: add report view as in FRS (TrivialDev)
 
 Plugins:
-* headermenu: new plugin to handle links in headermenu or outermenu (TrivialDev)
+* headermenu: new plugin to handle links in headermenu, outermenu & groupmenu
+              replace the old extratabs plugin (TrivialDev)
 * scmgit: add browsing capability for user personal repository (TrivialDev)
 * scmgit: basic activity support (TrivialDev).
 * scmgit: multiple repositories per project (developed for/sponsored by AdaCore)

commit 6d60197369a9b316e091a432694dcf4e7ae4a415
Author: Franck Villaume <franck.villaume at trivialdev.com>
Date:   Sat Dec 22 20:28:10 2012 +0100

    start implement groupmenu hook in headermenu

diff --git a/src/plugins/headermenu/common/headermenuPlugin.class.php b/src/plugins/headermenu/common/headermenuPlugin.class.php
index 1d8fd29..7c6ee9c 100644
--- a/src/plugins/headermenu/common/headermenuPlugin.class.php
+++ b/src/plugins/headermenu/common/headermenuPlugin.class.php
@@ -33,6 +33,10 @@ class headermenuPlugin extends Plugin {
 		$this->_addHook('headermenu');
 		$this->_addHook('site_admin_option_hook');
 		$this->_addHook('outermenu');
+		$this->_addHook('groupisactivecheckbox'); // The "use ..." checkbox in editgroupinfo
+		$this->_addHook('groupisactivecheckboxpost');
+		$this->_addHook('groupmenu');
+		$this->_addHook('project_admin_plugins');
 	}
 
 	function CallHook ($hookname, &$params) {
@@ -49,6 +53,19 @@ class headermenuPlugin extends Plugin {
 				echo '<li>'.$this->getAdminOptionLink().'</li>';
 				break;
 			}
+			case 'groupmenu': {
+				$this->getGroupLink($params);
+				break;
+			}
+			case 'project_admin_plugins': {
+				$group_id = $params['group_id'];
+				$project = group_get_object($group_id);
+				if ($project->usesPlugin($this->name)) {
+					echo '<p>'.util_make_link('/plugins/headermenu/?type=projectadmin&group_id='.$group_id,
+					     _('Project HeaderMenu Admin'), array('class' => 'tabtitle', 'title' => _('Add/Remove/Activate/Desactivate tabs'))) . '</p>';
+				}
+				break;
+			}
 		}
 	}
 
@@ -104,6 +121,41 @@ class headermenuPlugin extends Plugin {
 	}
 
 	/**
+	 * getGroupLink - update the links before generate the tab.
+	 *
+	 * @param	array	hook params array
+	 * @return	bool	true...
+	 */
+	function getGroupLink($params) {
+		$availableLinks = $this->getAvailableLinks('groupmenu');
+		foreach ($availableLinks as $link) {
+			if ($link['is_enable']) {
+				switch ($link['linktype']) {
+					case 'url': {
+						$params['DIRS'][] = $link['url'];
+						$params['TITLES'][] = $link['name'];
+						$params['TOOLTIPS'][] = $link['description'];
+						break;
+					}
+					case 'htmlcode': {
+						$params['DIRS'][] = '/plugins/'.$this->name.'/?type=pageview&pageid='.$link['id_headermenu'];
+						$params['TITLES'][] = $link['name'];
+						$params['TOOLTIPS'][] = $link['description'];
+						break;
+					}
+					case 'iframe': {
+						$params['DIRS'][] = '/plugins/'.$this->name.'/?type=iframe&pageid='.$link['id_headermenu'];
+						$params['TITLES'][] = $link['name'];
+						$params['TOOLTIPS'][] = $link['description'];
+						break;
+					}
+				}
+			}
+		}
+		return true;
+	}
+
+	/**
 	 * getAvailableLinks - get all the links from the db of certain kind
 	 *
 	 * @param	string	the type of menu links search in db
@@ -222,6 +274,16 @@ class headermenuPlugin extends Plugin {
 	}
 
 	/**
+	 * iframeView - display the iframe
+	 *
+	 * @param	int	the iframe id
+	 * @return	string	the html code
+	 */
+	 function iframeView($pageid) {
+		return true;
+	 }
+
+	/**
 	 * getHeader - initialize header and js
 	 *
 	 * @param	string	type : user, project, globaladmin (aka group)
@@ -247,6 +309,12 @@ class headermenuPlugin extends Plugin {
 				$returned = true;
 				break;
 			}
+			case 'projectadmin': {
+				html_use_jquery();
+				site_header(array('title'=>_('Project Menu Admin'), 'toptab' => ''));
+				$returned = true;
+				break;
+			}
 		}
 		return $returned;
 	}
@@ -269,6 +337,6 @@ class headermenuPlugin extends Plugin {
 	 * @return	string	the description
 	 */
 	function getPluginDescription() {
-		return _('Get the ability to set new links next to the login menu (headermenu) or in the main menu (outermenu).');
+		return _('Get the ability to set new links next to the login menu (headermenu), in the main menu (outermenu) or in the project menu (groupmenu).');
 	}
 }
diff --git a/src/plugins/headermenu/www/index.php b/src/plugins/headermenu/www/index.php
index 2eaabcb..da2d981 100644
--- a/src/plugins/headermenu/www/index.php
+++ b/src/plugins/headermenu/www/index.php
@@ -70,6 +70,15 @@ switch ($type) {
 		echo $headermenu->pageView($pageid);
 		break;
 	}
+	case 'projectadmin': {
+		if (!session_loggedin()) {
+			exit_not_logged_in();
+		}
+		$group_id = getIntFromRequest('group_id');
+		session_require_perm('project_admin', $group_id);
+		$headermenu->getHeader($type);
+		
+	}
 }
 
 site_project_footer(array());

commit 6156169f1c31de2ffeaee1dafe85a0899b1ae6ab
Author: Franck Villaume <franck.villaume at trivialdev.com>
Date:   Mon Jan 14 23:44:56 2013 +0100

    modify CHANGES entry

diff --git a/src/CHANGES b/src/CHANGES
index 630233a..8dee1ba 100644
--- a/src/CHANGES
+++ b/src/CHANGES
@@ -15,8 +15,7 @@ FusionForge-5.3:
 * Docman: add report view as in FRS (TrivialDev)
 
 Plugins:
-* headermenu: new plugin to handle links in headermenu, outermenu & groupmenu
-              replace the old extratabs plugin (TrivialDev)
+* headermenu: new plugin to handle links in headermenu, outermenu & groupmenu (TrivialDev)
 * scmgit: add browsing capability for user personal repository (TrivialDev)
 * scmgit: basic activity support (TrivialDev).
 * scmgit: multiple repositories per project (developed for/sponsored by AdaCore)

commit 6fc185ab350b26a08d3839a2fadabf87e04fab43
Author: Franck Villaume <franck.villaume at trivialdev.com>
Date:   Mon Jan 14 22:57:18 2013 +0100

    better ajax handling

diff --git a/src/plugins/headermenu/view/admin/viewGlobalConfiguration.php b/src/plugins/headermenu/view/admin/viewGlobalConfiguration.php
index f6172f8..a7dde3b 100644
--- a/src/plugins/headermenu/view/admin/viewGlobalConfiguration.php
+++ b/src/plugins/headermenu/view/admin/viewGlobalConfiguration.php
@@ -41,6 +41,10 @@ jQuery(document).ready(function() {
 		tableHeaTbLink: jQuery('.sortable_headermenu_listlinks tbody'),
 		validOutButton:	jQuery('#linkorderoutervalidatebutton'),
 		validHeaButton:	jQuery('#linkorderheadervalidatebutton'),
+		validMessOut:	'<?php echo _('Outermenu Link Order successfully validated') ?>',
+		validMessHea:	'<?php echo _('Headermenu Link Order successfully validated') ?>',
+		errMessOut:	'<?php echo _('Error in Outermenu Link Order validation') ?>',
+		errMessHea:	'<?php echo _('Error in Headermenu Link Order validation') ?>',
 	});
 });
 
diff --git a/src/plugins/headermenu/view/admin/viewProjectConfiguration.php b/src/plugins/headermenu/view/admin/viewProjectConfiguration.php
index 75d671c..d119f70 100644
--- a/src/plugins/headermenu/view/admin/viewProjectConfiguration.php
+++ b/src/plugins/headermenu/view/admin/viewProjectConfiguration.php
@@ -40,7 +40,9 @@ jQuery(document).ready(function() {
 		tableTbodyLink:	jQuery('#sortable tbody'),
 		validateButton:	jQuery('#linkordervalidatebutton'),
 		groupId:	'<?php echo $group_id ?>',
-		headerMenuUrl:	'<?php util_make_uri("/plugins/headermenu") ?>'
+		headerMenuUrl:	'<?php util_make_uri("/plugins/headermenu") ?>',
+		validMessage:	'<?php echo _('Link Order successfully validated') ?>',
+		errorMessage:	'<?php echo _('Error in Link Order validation') ?>',
 	});
 });
 
diff --git a/src/plugins/headermenu/www/scripts/HeaderMenuController.js b/src/plugins/headermenu/www/scripts/HeaderMenuController.js
index 608bf4c..77ef7d8 100644
--- a/src/plugins/headermenu/www/scripts/HeaderMenuController.js
+++ b/src/plugins/headermenu/www/scripts/HeaderMenuController.js
@@ -102,26 +102,44 @@ HeaderMenuController.prototype =
 
 	validateOutLinkOrder: function() {
 		var linkOrder = jQuery(".sortable_outermenu_listlinks tbody").sortable('toArray').toString();
-		jQuery.get(this.params.headerMenuUrl, {
-				action:		'validateOrder',
-				linkorder:	linkOrder,
-				type:		'globaladmin'
-			});
-		jQuery('#validateLinkFeedback').remove();
-		jQuery('#maindiv').prepend('<p id="validateLinkFeedback" class="feedback">Outermenu Link Order successfully validated</p>');
-		this.params.validOutButton.hide();
+		jQuery.get(this.params.headerMenuUrl,
+				{
+					action:		'validateOrder',
+					linkorder:	linkOrder,
+					type:		'globaladmin'
+				}
+				jQuery.proxy(function(data) {
+						jQuery('.feedback').remove();
+						jQuery('.error').remove();
+						if (data == 0) {
+							jQuery('#maindiv').prepend('<p id="validateLinkMessage" class="feedback">'+this.params.validMessOut+'</p>');
+						} else {
+							jQuery('#maindiv').prepend('<p id="validateLinkMessage" class="error">'+this.params.errMessOut+'</p>');
+						}
+						this.params.validateButton.hide();
+					}, this)
+			);
 	},
 
 	validateHeaLinkOrder: function() {
 		var linkOrder = jQuery(".sortable_headermenu_listlinks tbody").sortable('toArray').toString();
-		jQuery.get(this.params.headerMenuUrl, {
-				action:		'validateOrder',
-				linkorder:	linkOrder,
-				type:		'globaladmin'
-			});
-		jQuery('#validateLinkFeedback').remove();
-		jQuery('#maindiv').prepend('<p id="validateLinkFeedback" class="feedback">Headermenu Link Order successfully validated</p>');
-		this.params.validHeaButton.hide();
+		jQuery.get(this.params.headerMenuUrl,
+				{
+					action:		'validateOrder',
+					linkorder:	linkOrder,
+					type:		'globaladmin'
+				}
+				jQuery.proxy(function(data) {
+						jQuery('.feedback').remove();
+						jQuery('.error').remove();
+						if (data == 0) {
+							jQuery('#maindiv').prepend('<p id="validateLinkMessage" class="feedback">'+this.params.validMessHea+'</p>');
+						} else {
+							jQuery('#maindiv').prepend('<p id="validateLinkMessage" class="error">'+this.params.errMessHea+'</p>');
+						}
+						this.params.validateButton.hide();
+					}, this)
+			);
 	},
 };
 
@@ -172,15 +190,25 @@ GroupMenuController.prototype =
 
 	validateProjectLinkOrder: function() {
 		var linkOrder = jQuery("#sortable tbody").sortable('toArray').toString();
-		jQuery.get(this.params.headerMenuUrl, {
-				group_id:	this.params.groupId,
-				action:		'validateOrder',
-				linkorder:	linkOrder,
-				type:		'projectadmin'
-			});
-		jQuery('#validateLinkFeedback').remove();
-		jQuery('#maindiv').prepend('<p id="validateLinkFeedback" class="feedback">Link Order successfully validated</p>');
-		this.params.validateButton.hide();
+		jQuery.get(this.params.headerMenuUrl,
+				{
+					group_id:	this.params.groupId,
+					action:		'validateOrder',
+					linkorder:	linkOrder,
+					type:		'projectadmin'
+				},
+				jQuery.proxy(function(data) {
+						jQuery('.feedback').remove();
+						jQuery('.error').remove();
+						if (data == 0) {
+							jQuery('#maindiv').prepend('<p id="validateLinkMessage" class="feedback">'+this.params.validMessage+'</p>');
+						} else {
+							jQuery('#maindiv').prepend('<p id="validateLinkMessage" class="error">'+this.params.errorMessage+'</p>');
+						}
+						this.params.validateButton.hide();
+					}, this)
+			);
+
 	},
 };
 

commit f80aac50f0a246ad1705b8be2456f1cb7ffc3baa
Merge: 356fb8d 499bb4b
Author: Franck Villaume <franck.villaume at trivialdev.com>
Date:   Mon Jan 14 21:00:53 2013 +0100

    Merge remote-tracking branch 'origin/master' into headermenu


commit 356fb8d91329bd65707005944cb350204a03d749
Author: Franck Villaume <franck.villaume at trivialdev.com>
Date:   Sun Jan 6 22:32:40 2013 +0100

    support ordering in globaladmin view

diff --git a/src/plugins/headermenu/view/admin/viewGlobalConfiguration.php b/src/plugins/headermenu/view/admin/viewGlobalConfiguration.php
index d3a6da4..f6172f8 100644
--- a/src/plugins/headermenu/view/admin/viewGlobalConfiguration.php
+++ b/src/plugins/headermenu/view/admin/viewGlobalConfiguration.php
@@ -2,7 +2,7 @@
 /**
  * headermenu : viewGlobalConfiguration page
  *
- * Copyright 2012 Franck Villaume - TrivialDev
+ * Copyright 2012-2013, Franck Villaume - TrivialDev
  * http://fusionforge.org
  *
  * This file is part of FusionForge. FusionForge is free software;
@@ -37,21 +37,29 @@ jQuery(document).ready(function() {
 		inputOuter:	jQuery('#linkmenu_outermenu'),
 		trHtmlCode:	jQuery('#htmlcode'),
 		trUrlCode:	jQuery('#urlcode'),
-		tableTbodyLink:	jQuery('#sortable tbody')
+		tableOutTbLink:	jQuery('.sortable_outermenu_listlinks tbody'),
+		tableHeaTbLink: jQuery('.sortable_headermenu_listlinks tbody'),
+		validOutButton:	jQuery('#linkorderoutervalidatebutton'),
+		validHeaButton:	jQuery('#linkorderheadervalidatebutton'),
 	});
 });
 
 //]]></script>
 
 <?php
-$linksArray = $headermenu->getAvailableLinks('headermenu');
-if (sizeof($linksArray)) {
+$linksHeaderMenuArray = $headermenu->getAvailableLinks('headermenu');
+$linksOuterMenuArray = $headermenu->getAvailableLinks('outermenu');
+
+if (sizeof($linksHeaderMenuArray) || sizeof($linksOuterMenuArray)) {
+	echo '<p class="information">'. _('You can reorder links, just drag & drop rows in the table below and save order. Please note that those extra tabs can only appear after the standard tabs. And you can only move them inside the set of extra tabs.').'</p>';
+}
+if (sizeof($linksHeaderMenuArray)) {
 	echo $HTML->boxTop(_('Manage available links in headermenu'));
-	$tabletop = array( _('Menu Type'), _('Displayed Name'), _('Description'), _('Status'), _('Actions'));
-	$classth = array('','','','','unsortable');
+	$tabletop = array(_('Order'), _('Menu Type'), _('Displayed Name'), _('Description'), _('Status'), _('Actions'));
+	$classth = array('', '', '', '', '', 'unsortable');
 	echo $HTML->listTableTop($tabletop, false, 'sortable_headermenu_listlinks', 'sortable', $classth);
-	foreach ($linksArray as $link) {
-		echo '<tr>';
+	foreach ($linksHeaderMenuArray as $link) {
+		echo '<tr id="'.$link['id_headermenu'].'" ><td>'.$link['ordering'].'</td>';
 		if (strlen($link['url']) > 0) {
 			echo '<td>'._('URL').' ('.htmlspecialchars($link['url']).')</td>';
 		} else {
@@ -73,17 +81,20 @@ if (sizeof($linksArray)) {
 	}
 	echo $HTML->listTableBottom();
 	echo $HTML->boxBottom();
+	echo '<input type="button" id="linkorderheadervalidatebutton" value="'._('Save Order').'" style="display:none;" />';
 	echo '</br>';
+} else {
+	echo '<p class="information">'._('No links available for headermenu').'</p>';
 }
 
-$linksArray = $headermenu->getAvailableLinks('outermenu');
-if (sizeof($linksArray)) {
+
+if (sizeof($linksOuterMenuArray)) {
 	echo $HTML->boxTop(_('Manage available links in outermenu'));
-	$tabletop = array(_('Menu Type'), _('Displayed Name'), _('Description'), _('Status'), _('Actions'));
-	$classth = array('','','','','unsortable');
+	$tabletop = array(_('Order'), _('Menu Type'), _('Displayed Name'), _('Description'), _('Status'), _('Actions'));
+	$classth = array('', '', '', '', '', 'unsortable');
 	echo $HTML->listTableTop($tabletop, false, 'sortable_outermenu_listlinks', 'sortable', $classth);
-	foreach ($linksArray as $link) {
-		echo '<tr>';
+	foreach ($linksOuterMenuArray as $link) {
+		echo '<tr id="'.$link['id_headermenu'].'" ><td>'.$link['ordering'].'</td>';
 		if (strlen($link['url']) > 0) {
 			echo '<td>'._('URL').' ('.htmlspecialchars($link['url']).')</td>';
 		} else {
@@ -105,9 +116,13 @@ if (sizeof($linksArray)) {
 	}
 	echo $HTML->listTableBottom();
 	echo $HTML->boxBottom();
+	echo '<input type="button" id="linkorderoutervalidatebutton" value="'._('Save Order').'" style="display:none;" />';
 	echo '</br>';
+} else {
+	echo '<p class="information">'._('No links available for outermenu').'</p>';
 }
 
+echo '<p class="information">'._('You can add specific tabs in outermenu (main tab) or headermenu (next to the login) with the form below.').'</p>';
 echo '<form method="POST" name="addLink" action="index.php?type=globaladmin&action=addLink">';
 echo '<table><tr>';
 echo $HTML->boxTop(_('Add a new link'));
diff --git a/src/plugins/headermenu/view/admin/viewProjectConfiguration.php b/src/plugins/headermenu/view/admin/viewProjectConfiguration.php
index 7ddde72..75d671c 100644
--- a/src/plugins/headermenu/view/admin/viewProjectConfiguration.php
+++ b/src/plugins/headermenu/view/admin/viewProjectConfiguration.php
@@ -52,7 +52,7 @@ if (sizeof($linksArray)) {
 	echo '<p class="information">'. _('You can reorder links, just drag & drop rows in the table below and save order. Please note that those extra tabs can only appear after the standard tabs. And you can only move them inside the set of extra tabs.').'</p>';
 	echo $HTML->boxTop(_('Manage available links'));
 	$tabletop = array(_('Order'), _('Menu Type'), _('Displayed Name'), _('Description'), _('Status'), _('Actions'));
-	$classth = array('', '','','','','unsortable');
+	$classth = array('', '', '', '', '', 'unsortable');
 	echo $HTML->listTableTop($tabletop, false, 'sortable_headermenu_listlinks', 'sortable', $classth);
 	foreach ($linksArray as $link) {
 		echo '<tr id="'.$link['id_headermenu'].'" ><td>'.$link['ordering'].'</td>';
@@ -81,7 +81,7 @@ if (sizeof($linksArray)) {
 	}
 	echo $HTML->listTableBottom();
 	echo $HTML->boxBottom();
-	echo '<input type="button" id="linkordervalidatebutton" value="'._('Validate Order').'" style="display:none;" />';
+	echo '<input type="button" id="linkordervalidatebutton" value="'._('Save Order').'" style="display:none;" />';
 	echo '</br>';
 }
 
diff --git a/src/plugins/headermenu/www/index.php b/src/plugins/headermenu/www/index.php
index f8b88f2..ae77ec3 100644
--- a/src/plugins/headermenu/www/index.php
+++ b/src/plugins/headermenu/www/index.php
@@ -45,7 +45,8 @@ switch ($type) {
 			case 'addLink':
 			case 'updateLinkValue':
 			case 'deleteLink':
-			case 'updateLinkStatus': {
+			case 'updateLinkStatus':
+			case 'validateOrder': {
 				global $gfplugins;
 				include($gfplugins.$headermenu->name.'/action/'.$action.'.php');
 				break;
diff --git a/src/plugins/headermenu/www/scripts/HeaderMenuController.js b/src/plugins/headermenu/www/scripts/HeaderMenuController.js
index 5ae0d34..608bf4c 100644
--- a/src/plugins/headermenu/www/scripts/HeaderMenuController.js
+++ b/src/plugins/headermenu/www/scripts/HeaderMenuController.js
@@ -45,6 +45,8 @@ HeaderMenuController.prototype =
 		this.params.inputURL.click(jQuery.proxy(this, "htmlUrlView"));
 		this.params.inputOuter.click(jQuery.proxy(this, "inputHtmlCodeView"));
 		this.params.inputHeader.click(jQuery.proxy(this, "initializeView"));
+		this.params.validOutButton.click(jQuery.proxy(this, "validateOutLinkOrder"));
+		this.params.validHeaButton.click(jQuery.proxy(this, "validateHeaLinkOrder"));
 	},
 
 	initializeView: function() {
@@ -52,11 +54,34 @@ HeaderMenuController.prototype =
 		this.params.trHtmlCode.hide();
 		this.params.trUrlCode.show();
 		this.params.inputURL.attr('checked', 'checked');
-		if (typeof(this.params.tableTbodyLink) != 'undefined') {
-			this.params.tableTbodyLink.sortable({
+		if (typeof(this.params.tableOutTbLink) != 'undefined') {
+			this.params.tableOutTbLink.sortable({
 				update: function(event, ui) {
-						jQuery(ui.item).attr("id", jQuery(ui.item).index());
-					}
+					jQuery(".sortable_outermenu_listlinks tbody").children().each(function() {
+						if (jQuery(this).index() % 2 === 0) {
+							jQuery(this).attr("class", "even");
+						} else {
+							jQuery(this).attr("class", "odd");
+						}
+						jQuery(this).children(":first").text(jQuery(this).index());
+					});
+					jQuery("#linkorderoutervalidatebutton").show();
+				}
+			});
+		}
+		if (typeof(this.params.tableHeaTbLink) != 'undefined') {
+			this.params.tableHeaTbLink.sortable({
+				update: function(event, ui) {
+					jQuery(".sortable_headermenu_listlinks tbody").children().each(function() {
+						if (jQuery(this).index() % 2 === 0) {
+							jQuery(this).attr("class", "even");
+						} else {
+							jQuery(this).attr("class", "odd");
+						}
+						jQuery(this).children(":first").text(jQuery(this).index());
+					});
+					jQuery("#linkorderheadervalidatebutton").show();
+				}
 			});
 		}
 	},
@@ -73,7 +98,31 @@ HeaderMenuController.prototype =
 
 	inputHtmlCodeView: function() {
 		this.params.inputHtmlCode.prop('disabled', false);
-	}
+	},
+
+	validateOutLinkOrder: function() {
+		var linkOrder = jQuery(".sortable_outermenu_listlinks tbody").sortable('toArray').toString();
+		jQuery.get(this.params.headerMenuUrl, {
+				action:		'validateOrder',
+				linkorder:	linkOrder,
+				type:		'globaladmin'
+			});
+		jQuery('#validateLinkFeedback').remove();
+		jQuery('#maindiv').prepend('<p id="validateLinkFeedback" class="feedback">Outermenu Link Order successfully validated</p>');
+		this.params.validOutButton.hide();
+	},
+
+	validateHeaLinkOrder: function() {
+		var linkOrder = jQuery(".sortable_headermenu_listlinks tbody").sortable('toArray').toString();
+		jQuery.get(this.params.headerMenuUrl, {
+				action:		'validateOrder',
+				linkorder:	linkOrder,
+				type:		'globaladmin'
+			});
+		jQuery('#validateLinkFeedback').remove();
+		jQuery('#maindiv').prepend('<p id="validateLinkFeedback" class="feedback">Headermenu Link Order successfully validated</p>');
+		this.params.validHeaButton.hide();
+	},
 };
 
 GroupMenuController.prototype =
@@ -81,7 +130,7 @@ GroupMenuController.prototype =
 	bindControls: function() {
 		this.params.inputHtmlCode.click(jQuery.proxy(this, "htmlCodeView"));
 		this.params.inputURL.click(jQuery.proxy(this, "htmlUrlView"));
-		this.params.validateButton.click(jQuery.proxy(this, "validateLinkOrder"));
+		this.params.validateButton.click(jQuery.proxy(this, "validateProjectLinkOrder"));
 	},
 
 	initializeView: function() {
@@ -121,7 +170,7 @@ GroupMenuController.prototype =
 		this.params.inputHtmlCode.prop('disabled', false);
 	},
 
-	validateLinkOrder: function() {
+	validateProjectLinkOrder: function() {
 		var linkOrder = jQuery("#sortable tbody").sortable('toArray').toString();
 		jQuery.get(this.params.headerMenuUrl, {
 				group_id:	this.params.groupId,

commit 4b7db1ddc9540b01c2d38d2d902f6683e8b0d02b
Author: Franck Villaume <franck.villaume at trivialdev.com>
Date:   Sun Jan 6 19:44:40 2013 +0100

    remove useless column

diff --git a/src/plugins/headermenu/view/admin/viewGlobalConfiguration.php b/src/plugins/headermenu/view/admin/viewGlobalConfiguration.php
index 9e622e1..d3a6da4 100644
--- a/src/plugins/headermenu/view/admin/viewGlobalConfiguration.php
+++ b/src/plugins/headermenu/view/admin/viewGlobalConfiguration.php
@@ -47,12 +47,11 @@ jQuery(document).ready(function() {
 $linksArray = $headermenu->getAvailableLinks('headermenu');
 if (sizeof($linksArray)) {
 	echo $HTML->boxTop(_('Manage available links in headermenu'));
-	$tabletop = array(_('Menu Location'), _('Menu Type'), _('Displayed Name'), _('Description'), _('Status'), _('Actions'));
-	$classth = array('', '','','','','unsortable');
+	$tabletop = array( _('Menu Type'), _('Displayed Name'), _('Description'), _('Status'), _('Actions'));
+	$classth = array('','','','','unsortable');
 	echo $HTML->listTableTop($tabletop, false, 'sortable_headermenu_listlinks', 'sortable', $classth);
 	foreach ($linksArray as $link) {
 		echo '<tr>';
-		echo '<td>'.htmlspecialchars($link['linkmenu']).'</td>';
 		if (strlen($link['url']) > 0) {
 			echo '<td>'._('URL').' ('.htmlspecialchars($link['url']).')</td>';
 		} else {
@@ -80,12 +79,11 @@ if (sizeof($linksArray)) {
 $linksArray = $headermenu->getAvailableLinks('outermenu');
 if (sizeof($linksArray)) {
 	echo $HTML->boxTop(_('Manage available links in outermenu'));
-	$tabletop = array(_('Menu Location'), _('Menu Type'), _('Displayed Name'), _('Description'), _('Status'), _('Actions'));
-	$classth = array('', '','','','','unsortable');
+	$tabletop = array(_('Menu Type'), _('Displayed Name'), _('Description'), _('Status'), _('Actions'));
+	$classth = array('','','','','unsortable');
 	echo $HTML->listTableTop($tabletop, false, 'sortable_outermenu_listlinks', 'sortable', $classth);
 	foreach ($linksArray as $link) {
 		echo '<tr>';
-		echo '<td>'.htmlspecialchars($link['linkmenu']).'</td>';
 		if (strlen($link['url']) > 0) {
 			echo '<td>'._('URL').' ('.htmlspecialchars($link['url']).')</td>';
 		} else {

commit 0676f91ca5a269efa210e5289bfe620c17fc78ff
Merge: 9e0e04d 11dbbd9
Author: Franck Villaume <franck.villaume at trivialdev.com>
Date:   Sun Jan 6 18:45:21 2013 +0100

    Merge remote-tracking branch 'origin/master' into headermenu


commit 9e0e04dff8611a9ef54cb1aebc15f5bf39bdcc27
Author: Franck Villaume <franck.villaume at trivialdev.com>
Date:   Sun Jan 6 18:43:10 2013 +0100

    add copyright

diff --git a/src/www/themes/funky/Theme.class.php b/src/www/themes/funky/Theme.class.php
index 0451a71..b484e4d 100644
--- a/src/www/themes/funky/Theme.class.php
+++ b/src/www/themes/funky/Theme.class.php
@@ -5,7 +5,7 @@
  * Copyright 2010, Antoine Mercadal - Capgemini
  * Copyright 2010, Marc-Etienne Vargenau, Alcatel-Lucent
  * Copyright 2011, Franck Villaume - Capgemini
- * Copyright 2011 - 2012, Franck Villaume - TrivialDev
+ * Copyright 2011-2013, Franck Villaume - TrivialDev
  * Copyright (C) 2011 Alain Peyrat - Alcatel-Lucent
  *
  * This file is part of FusionForge. FusionForge is free software;

commit 510cfd1b0071ea11194c76703f826b52931f7afc
Author: Franck Villaume <franck.villaume at trivialdev.com>
Date:   Sun Jan 6 17:44:34 2013 +0100

    implement backend action validateOrder

diff --git a/src/plugins/headermenu/action/deleteLink.php b/src/plugins/headermenu/action/deleteLink.php
index 8cf9ecc..3356fec 100644
--- a/src/plugins/headermenu/action/deleteLink.php
+++ b/src/plugins/headermenu/action/deleteLink.php
@@ -1,6 +1,6 @@
 <?php
 /**
- * headermenu plugin
+ * headermenu plugin: deleteLink action
  *
  * Copyright 2012, Franck Villaume - TrivialDev
  * http://fusionforge.org
diff --git a/src/plugins/headermenu/action/updateLinkStatus.php b/src/plugins/headermenu/action/updateLinkStatus.php
index 03cce2a..b91c682 100644
--- a/src/plugins/headermenu/action/updateLinkStatus.php
+++ b/src/plugins/headermenu/action/updateLinkStatus.php
@@ -1,6 +1,6 @@
 <?php
 /**
- * headermenu plugin
+ * headermenu plugin: updateLinkStatus action
  *
  * Copyright 2012, Franck Villaume - TrivialDev
  * http://fusionforge.org
diff --git a/src/plugins/headermenu/action/updateLinkValue.php b/src/plugins/headermenu/action/updateLinkValue.php
index caf7bd9..69679db 100644
--- a/src/plugins/headermenu/action/updateLinkValue.php
+++ b/src/plugins/headermenu/action/updateLinkValue.php
@@ -1,6 +1,6 @@
 <?php
 /**
- * headermenu plugin
+ * headermenu plugin : updateLinkValue action
  *
  * Copyright 2012, Franck Villaume - TrivialDev
  * http://fusionforge.org
diff --git a/src/plugins/headermenu/action/deleteLink.php b/src/plugins/headermenu/action/validateOrder.php
similarity index 54%
copy from src/plugins/headermenu/action/deleteLink.php
copy to src/plugins/headermenu/action/validateOrder.php
index 8cf9ecc..b16144c 100644
--- a/src/plugins/headermenu/action/deleteLink.php
+++ b/src/plugins/headermenu/action/validateOrder.php
@@ -1,8 +1,8 @@
 <?php
 /**
- * headermenu plugin
+ * headermenu plugin : validateOrder action
  *
- * Copyright 2012, Franck Villaume - TrivialDev
+ * Copyright 2013, Franck Villaume - TrivialDev
  * http://fusionforge.org
  *
  * This file is part of FusionForge. FusionForge is free software;
@@ -19,25 +19,19 @@
  * You should have received a copy of the GNU General Public License along
  * with FusionForge; if not, write to the Free Software Foundation, Inc.,
  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
+ */ 
 
 global $headermenu;
-global $type;
-global $group_id;
 
-$idLink = getIntFromRequest('linkid');
-$redirect_url = 'plugins/'.$headermenu->name.'/?type='.$type;
-if (isset($group_id) && $group_id) {
-	$redirect_url .= '&group_id='.$group_id;
-}
+$sysdebug_enable = false;
+
+$linksOrder = getStringFromRequest('linkorder');
+$returnValue = 1;
 
-if (!empty($idLink)) {
-	if ($headermenu->deleteLink($idLink)) {
-		$feedback = _('Link deleted');
-		session_redirect($redirect_url.'&feedback='.urlencode($feedback));
-	}
-	$error_msg = _('Task failed');
-	session_redirect($redirect_url.'&error_msg='.urlencode($error_msg));
+if ($linksOrder && strlen($linksOrder)) {
+	$linksOrderArr = explode(',', $linksOrder);
+	if ($headermenu->setLinksOrder($linksOrderArr))
+		$returnValue = 0;
 }
-$warning_msg = _('Missing Link to be deleted.');
-session_redirect($redirect_url.'&warning_msg='.urlencode($warning_msg));
+echo $returnValue;
+exit;
\ No newline at end of file
diff --git a/src/plugins/headermenu/common/headermenuPlugin.class.php b/src/plugins/headermenu/common/headermenuPlugin.class.php
index 69c41ac..222c3b2 100644
--- a/src/plugins/headermenu/common/headermenuPlugin.class.php
+++ b/src/plugins/headermenu/common/headermenuPlugin.class.php
@@ -168,7 +168,7 @@ class headermenuPlugin extends Plugin {
 	 * @return	array	the available links
 	 */
 	function getAvailableLinks($linkmenu) {
-		$links = db_query_params('select * FROM plugin_headermenu where linkmenu = $1 order by ordering', array($linkmenu));
+		$links = db_query_params('select * FROM plugin_headermenu where linkmenu = $1 order by ordering asc', array($linkmenu));
 		$availableLinks = array();
 		while ($arr = db_fetch_array($links)) {
 			$availableLinks[] = $arr;
@@ -188,6 +188,21 @@ class headermenuPlugin extends Plugin {
 	}
 
 	/**
+	 * setLinksOrder - set the linkOrder for a set of links id
+	 *
+	 * @param	array	$linksOrder array of ordered links id
+	 * @return	bool	success or not
+	 */
+	function setLinksOrder($linksOrder) {
+		for ($i =0; $i < count($linksOrder); $i++) {
+			$res = db_query_params('update plugin_headermenu set ordering = $1 where id_headermenu = $2', array($i, $linksOrder[$i]));
+			if (!$res)
+				return false;
+		}
+		return true;
+	}
+
+	/**
 	 * addLink - add a new valid link
 	 *
 	 * @param	string	$url the url
@@ -352,7 +367,11 @@ class headermenuPlugin extends Plugin {
 				html_use_jqueryui();
 				use_javascript('scripts/HeaderMenuController.js');
 				use_javascript('/js/sortable.js');
-				site_header(array('title'=>_('Project Menu Admin'), 'toptab' => ''));
+				$group_id = getIntFromRequest('group_id');
+				$params['toptab'] = 'admin';
+				$params['group'] = $group_id;
+				$params['title'] = _('Project groupmenu Admin');
+				site_project_header($params);
 				$returned = true;
 				break;
 			}
diff --git a/src/plugins/headermenu/view/admin/viewProjectConfiguration.php b/src/plugins/headermenu/view/admin/viewProjectConfiguration.php
index 70af91d..7ddde72 100644
--- a/src/plugins/headermenu/view/admin/viewProjectConfiguration.php
+++ b/src/plugins/headermenu/view/admin/viewProjectConfiguration.php
@@ -2,7 +2,7 @@
 /**
  * headermenu : viewProjectConfiguration page
  *
- * Copyright 2012 Franck Villaume - TrivialDev
+ * Copyright 2012-2013, Franck Villaume - TrivialDev
  * http://fusionforge.org
  *
  * This file is part of FusionForge. FusionForge is free software;
@@ -49,7 +49,7 @@ jQuery(document).ready(function() {
 <?php
 $linksArray = $headermenu->getAvailableLinks('groupmenu');
 if (sizeof($linksArray)) {
-	echo '<p class="information">'. _('You can reorder links, just drag & drop rows in the table and save order. Please note that those extra tabs can only appear after the standard tabs. And you can only move them inside the set of extra tabs.').'</p>';
+	echo '<p class="information">'. _('You can reorder links, just drag & drop rows in the table below and save order. Please note that those extra tabs can only appear after the standard tabs. And you can only move them inside the set of extra tabs.').'</p>';
 	echo $HTML->boxTop(_('Manage available links'));
 	$tabletop = array(_('Order'), _('Menu Type'), _('Displayed Name'), _('Description'), _('Status'), _('Actions'));
 	$classth = array('', '','','','','unsortable');
diff --git a/src/plugins/headermenu/www/index.php b/src/plugins/headermenu/www/index.php
index 1f053ea..f8b88f2 100644
--- a/src/plugins/headermenu/www/index.php
+++ b/src/plugins/headermenu/www/index.php
@@ -90,7 +90,8 @@ switch ($type) {
 			case 'addLink':
 			case 'updateLinkValue':
 			case 'deleteLink':
-			case 'updateLinkStatus': {
+			case 'updateLinkStatus':
+			case 'validateOrder': {
 				global $gfplugins;
 				include($gfplugins.$headermenu->name.'/action/'.$action.'.php');
 				break;
diff --git a/src/plugins/headermenu/www/scripts/HeaderMenuController.js b/src/plugins/headermenu/www/scripts/HeaderMenuController.js
index d81654a..5ae0d34 100644
--- a/src/plugins/headermenu/www/scripts/HeaderMenuController.js
+++ b/src/plugins/headermenu/www/scripts/HeaderMenuController.js
@@ -129,7 +129,8 @@ GroupMenuController.prototype =
 				linkorder:	linkOrder,
 				type:		'projectadmin'
 			});
-		jQuery('#maindiv').prepend('<p class="feedback">Link Order successfully validated</p>');
+		jQuery('#validateLinkFeedback').remove();
+		jQuery('#maindiv').prepend('<p id="validateLinkFeedback" class="feedback">Link Order successfully validated</p>');
 		this.params.validateButton.hide();
 	},
 };

commit 95e8d0dba6024c5c516ba47e4f002e9c8b2a5fed
Author: Franck Villaume <franck.villaume at trivialdev.com>
Date:   Sun Jan 6 15:07:14 2013 +0100

    complete support for reorder link in groupmenu

diff --git a/src/plugins/headermenu/common/headermenuPlugin.class.php b/src/plugins/headermenu/common/headermenuPlugin.class.php
index 6cc2c60..69c41ac 100644
--- a/src/plugins/headermenu/common/headermenuPlugin.class.php
+++ b/src/plugins/headermenu/common/headermenuPlugin.class.php
@@ -168,7 +168,7 @@ class headermenuPlugin extends Plugin {
 	 * @return	array	the available links
 	 */
 	function getAvailableLinks($linkmenu) {
-		$links = db_query_params('select * FROM plugin_headermenu where linkmenu = $1', array($linkmenu));
+		$links = db_query_params('select * FROM plugin_headermenu where linkmenu = $1 order by ordering', array($linkmenu));
 		$availableLinks = array();
 		while ($arr = db_fetch_array($links)) {
 			$availableLinks[] = $arr;
@@ -230,6 +230,13 @@ class headermenuPlugin extends Plugin {
 		return false;
 	}
 
+	/**
+	 * updateLinkStatus - update the link status
+	 *
+	 * @param	int	$idLink the link id
+	 * @param	int	$linkStatus the new status of the link id
+	 * @return	bool	success or not
+	 */
 	function updateLinkStatus($idLink, $linkStatus) {
 		$res = db_query_params('update plugin_headermenu set is_enable = $1 where id_headermenu = $2', array($linkStatus, $idLink));
 		if ($res) {
@@ -238,6 +245,12 @@ class headermenuPlugin extends Plugin {
 		return false;
 	}
 
+	/**
+	 * getLink - get all informations about a link
+	 *
+	 * @param	int	$idLink the link id
+	 * @return	array	the link informations
+	 */
 	function getLink($idLink) {
 		$res = db_query_params('select * from plugin_headermenu where id_headermenu = $1', array($idLink));
 		if (db_numrows($res) == 1) {
@@ -276,7 +289,11 @@ class headermenuPlugin extends Plugin {
 	 */
 	function pageView($pageid) {
 		$link = $this->getLink($pageid);
-		return $link['htmlcode'];
+		if ($link) {
+			return $link['htmlcode'];
+		} else {
+			return '<p class="error" >'._('Cannot retrieve the page').'</p>';
+		}
 	}
 
 	/**
@@ -287,7 +304,11 @@ class headermenuPlugin extends Plugin {
 	 */
 	 function iframeView($pageid) {
 		$link = $this->getLink($pageid);
-		return '<iframe src="'.rtrim($link['url'],'/').'" frameborder="0" height="600px" width="100%"></iframe>';
+		if ($link) {
+			return '<iframe src="'.rtrim($link['url'],'/').'" frameborder="0" height="600px" width="100%"></iframe>';
+		} else {
+			return '<p class="error" >'._('Cannot retrieve the page').'</p>';
+		}
 	 }
 
 	/**
diff --git a/src/plugins/headermenu/view/admin/viewProjectConfiguration.php b/src/plugins/headermenu/view/admin/viewProjectConfiguration.php
index 810f133..70af91d 100644
--- a/src/plugins/headermenu/view/admin/viewProjectConfiguration.php
+++ b/src/plugins/headermenu/view/admin/viewProjectConfiguration.php
@@ -37,7 +37,10 @@ jQuery(document).ready(function() {
 		trHtmlCode:	jQuery('#htmlcode'),
 		trUrlCode:	jQuery('#urlcode'),
 		trIframeView:	jQuery('#iframe'),
-		tableTbodyLink:	jQuery('#sortable tbody')
+		tableTbodyLink:	jQuery('#sortable tbody'),
+		validateButton:	jQuery('#linkordervalidatebutton'),
+		groupId:	'<?php echo $group_id ?>',
+		headerMenuUrl:	'<?php util_make_uri("/plugins/headermenu") ?>'
 	});
 });
 
@@ -46,13 +49,13 @@ jQuery(document).ready(function() {
 <?php
 $linksArray = $headermenu->getAvailableLinks('groupmenu');
 if (sizeof($linksArray)) {
-	echo '<p class="information">'. _('You can reorder links, just drag & drop rows in the table and save order.').'</p>';
+	echo '<p class="information">'. _('You can reorder links, just drag & drop rows in the table and save order. Please note that those extra tabs can only appear after the standard tabs. And you can only move them inside the set of extra tabs.').'</p>';
 	echo $HTML->boxTop(_('Manage available links'));
 	$tabletop = array(_('Order'), _('Menu Type'), _('Displayed Name'), _('Description'), _('Status'), _('Actions'));
 	$classth = array('', '','','','','unsortable');
 	echo $HTML->listTableTop($tabletop, false, 'sortable_headermenu_listlinks', 'sortable', $classth);
 	foreach ($linksArray as $link) {
-		echo '<tr id="'.$link['ordering'].'" ><td>'.$link['ordering'].'</td>';
+		echo '<tr id="'.$link['id_headermenu'].'" ><td>'.$link['ordering'].'</td>';
 		if (strlen($link['url']) > 0) {
 			echo '<td>'._('URL');
 			if ($link['linktype'] == 'iframe') {
@@ -78,9 +81,11 @@ if (sizeof($linksArray)) {
 	}
 	echo $HTML->listTableBottom();
 	echo $HTML->boxBottom();
+	echo '<input type="button" id="linkordervalidatebutton" value="'._('Validate Order').'" style="display:none;" />';
 	echo '</br>';
 }
 
+echo '<p class="information">'._('You can add your own tabs in the menu bar with the form below.').'</p>';
 echo '<form method="POST" name="addLink" action="index.php?type=projectadmin&group_id='.$group_id.'&action=addLink">';
 echo '<table><tr>';
 echo $HTML->boxTop(_('Add a new link'));
diff --git a/src/plugins/headermenu/www/scripts/HeaderMenuController.js b/src/plugins/headermenu/www/scripts/HeaderMenuController.js
index 0da2b5c..d81654a 100644
--- a/src/plugins/headermenu/www/scripts/HeaderMenuController.js
+++ b/src/plugins/headermenu/www/scripts/HeaderMenuController.js
@@ -81,6 +81,7 @@ GroupMenuController.prototype =
 	bindControls: function() {
 		this.params.inputHtmlCode.click(jQuery.proxy(this, "htmlCodeView"));
 		this.params.inputURL.click(jQuery.proxy(this, "htmlUrlView"));
+		this.params.validateButton.click(jQuery.proxy(this, "validateLinkOrder"));
 	},
 
 	initializeView: function() {
@@ -91,14 +92,14 @@ GroupMenuController.prototype =
 			this.params.tableTbodyLink.sortable({
 				update: function(event, ui) {
 					jQuery("#sortable tbody").children().each(function() {
-						jQuery(this).attr("id", jQuery(this).index())
-						if (jQuery(this).attr("id") % 2 === 0) {
+						if (jQuery(this).index() % 2 === 0) {
 							jQuery(this).attr("class", "even");
 						} else {
 							jQuery(this).attr("class", "odd");
 						}
-						jQuery(this).children(":first").text(jQuery(this).attr("id"));
+						jQuery(this).children(":first").text(jQuery(this).index());
 					});
+					jQuery("#linkordervalidatebutton").show();
 				}
 			});
 		}
@@ -118,7 +119,19 @@ GroupMenuController.prototype =
 
 	inputHtmlCodeView: function() {
 		this.params.inputHtmlCode.prop('disabled', false);
-	}
+	},
+
+	validateLinkOrder: function() {
+		var linkOrder = jQuery("#sortable tbody").sortable('toArray').toString();
+		jQuery.get(this.params.headerMenuUrl, {
+				group_id:	this.params.groupId,
+				action:		'validateOrder',
+				linkorder:	linkOrder,
+				type:		'projectadmin'
+			});
+		jQuery('#maindiv').prepend('<p class="feedback">Link Order successfully validated</p>');
+		this.params.validateButton.hide();
+	},
 };
 
 EditHeaderMenuController.prototype =
diff --git a/src/www/themes/funky/Theme.class.php b/src/www/themes/funky/Theme.class.php
index f234281..0451a71 100644
--- a/src/www/themes/funky/Theme.class.php
+++ b/src/www/themes/funky/Theme.class.php
@@ -444,7 +444,10 @@ class Theme extends Layout {
 		jQuery.noConflict();
 		jQuery(window).load(function(){
 			jQuery(".quicknews").hide();
+			setTimeout("jQuery('.feedback').hide('slow')", 5000);
+			setInterval(function() {
 					setTimeout("jQuery('.feedback').hide('slow')", 5000);
+				}, 5000);
 		});
 		//]]></script>
 		<?php

commit bf6274fedc2bf22c8a6fb8cc2415be5ff0a813d0
Author: Franck Villaume <franck.villaume at trivialdev.com>
Date:   Sat Jan 5 13:32:10 2013 +0100

    add support for reorder in js controler

diff --git a/src/plugins/headermenu/view/admin/viewProjectConfiguration.php b/src/plugins/headermenu/view/admin/viewProjectConfiguration.php
index f200b60..810f133 100644
--- a/src/plugins/headermenu/view/admin/viewProjectConfiguration.php
+++ b/src/plugins/headermenu/view/admin/viewProjectConfiguration.php
@@ -52,7 +52,7 @@ if (sizeof($linksArray)) {
 	$classth = array('', '','','','','unsortable');
 	echo $HTML->listTableTop($tabletop, false, 'sortable_headermenu_listlinks', 'sortable', $classth);
 	foreach ($linksArray as $link) {
-		echo '<tr><td>'.$link['ordering'].'</td>';
+		echo '<tr id="'.$link['ordering'].'" ><td>'.$link['ordering'].'</td>';
 		if (strlen($link['url']) > 0) {
 			echo '<td>'._('URL');
 			if ($link['linktype'] == 'iframe') {
diff --git a/src/plugins/headermenu/www/scripts/HeaderMenuController.js b/src/plugins/headermenu/www/scripts/HeaderMenuController.js
index eb11f3d..0da2b5c 100644
--- a/src/plugins/headermenu/www/scripts/HeaderMenuController.js
+++ b/src/plugins/headermenu/www/scripts/HeaderMenuController.js
@@ -53,7 +53,11 @@ HeaderMenuController.prototype =
 		this.params.trUrlCode.show();
 		this.params.inputURL.attr('checked', 'checked');
 		if (typeof(this.params.tableTbodyLink) != 'undefined') {
-			this.params.tableTbodyLink.sortable();
+			this.params.tableTbodyLink.sortable({
+				update: function(event, ui) {
+						jQuery(ui.item).attr("id", jQuery(ui.item).index());
+					}
+			});
 		}
 	},
 
@@ -84,7 +88,19 @@ GroupMenuController.prototype =
 		this.params.trUrlCode.show();
 		this.params.inputURL.attr('checked', 'checked');
 		if (typeof(this.params.tableTbodyLink) != 'undefined') {
-			this.params.tableTbodyLink.sortable();
+			this.params.tableTbodyLink.sortable({
+				update: function(event, ui) {
+					jQuery("#sortable tbody").children().each(function() {
+						jQuery(this).attr("id", jQuery(this).index())
+						if (jQuery(this).attr("id") % 2 === 0) {
+							jQuery(this).attr("class", "even");
+						} else {
+							jQuery(this).attr("class", "odd");
+						}
+						jQuery(this).children(":first").text(jQuery(this).attr("id"));
+					});
+				}
+			});
 		}
 	},
 

commit ee21d1af607f69e77f2c286741bb8f2ed8b8dca5
Merge: 863f412 b8095e7
Author: Franck Villaume <franck.villaume at trivialdev.com>
Date:   Sat Jan 5 09:57:08 2013 +0100

    Merge branch 'headermenu' of git+ssh://fusionforge.org/scmrepos/git/fusionforge/users/nerville into headermenu


commit 863f4122d1326a5a84d2d4a7b3c98d16982d3d56
Author: Franck Villaume <franck.villaume at trivialdev.com>
Date:   Tue Jan 1 20:47:10 2013 +0100

    add notice and reorg display in global

diff --git a/src/plugins/headermenu/view/admin/viewGlobalConfiguration.php b/src/plugins/headermenu/view/admin/viewGlobalConfiguration.php
index eaa3252..9e622e1 100644
--- a/src/plugins/headermenu/view/admin/viewGlobalConfiguration.php
+++ b/src/plugins/headermenu/view/admin/viewGlobalConfiguration.php
@@ -36,16 +36,17 @@ jQuery(document).ready(function() {
 		inputHeader:	jQuery('#linkmenu_headermenu'),
 		inputOuter:	jQuery('#linkmenu_outermenu'),
 		trHtmlCode:	jQuery('#htmlcode'),
-		trUrlCode:	jQuery('#urlcode')
-    });
+		trUrlCode:	jQuery('#urlcode'),
+		tableTbodyLink:	jQuery('#sortable tbody')
+	});
 });
 
 //]]></script>
 
 <?php
-$linksArray = $headermenu->getAllAvailableLinks();
+$linksArray = $headermenu->getAvailableLinks('headermenu');
 if (sizeof($linksArray)) {
-	echo $HTML->boxTop(_('Manage available links'));
+	echo $HTML->boxTop(_('Manage available links in headermenu'));
 	$tabletop = array(_('Menu Location'), _('Menu Type'), _('Displayed Name'), _('Description'), _('Status'), _('Actions'));
 	$classth = array('', '','','','','unsortable');
 	echo $HTML->listTableTop($tabletop, false, 'sortable_headermenu_listlinks', 'sortable', $classth);
@@ -76,6 +77,39 @@ if (sizeof($linksArray)) {
 	echo '</br>';
 }
 
+$linksArray = $headermenu->getAvailableLinks('outermenu');
+if (sizeof($linksArray)) {
+	echo $HTML->boxTop(_('Manage available links in outermenu'));
+	$tabletop = array(_('Menu Location'), _('Menu Type'), _('Displayed Name'), _('Description'), _('Status'), _('Actions'));
+	$classth = array('', '','','','','unsortable');
+	echo $HTML->listTableTop($tabletop, false, 'sortable_outermenu_listlinks', 'sortable', $classth);
+	foreach ($linksArray as $link) {
+		echo '<tr>';
+		echo '<td>'.htmlspecialchars($link['linkmenu']).'</td>';
+		if (strlen($link['url']) > 0) {
+			echo '<td>'._('URL').' ('.htmlspecialchars($link['url']).')</td>';
+		} else {
+			echo '<td>'._('static html code').'</td>';
+		}
+		echo '<td>'.htmlspecialchars($link['name']).'</td>';
+		echo '<td>'.htmlspecialchars($link['description']).'</td>';
+		if ($link['is_enable']) {
+			echo '<td>'.html_image('docman/validate.png', 22, 22, array('alt'=>_('link is on'), 'class'=>'tabtitle', 'title'=>_('link is on'))).'</td>';
+			echo '<td><a class="tabtitle-ne" title="'._('Desactivate this link').'" href="index.php?type=globaladmin&action=updateLinkStatus&linkid='.$link['id_headermenu'].'&linkstatus=0">'.html_image('docman/release-document.png', 22, 22, array('alt'=>_('Desactivate this link'))). '</a>';
+		} else {
+			echo '<td>'.html_image('docman/delete-directory.png', 22, 22, array('alt'=>_('link is off'), 'class'=>'tabtitle', 'title'=>_('link is off'))).'</td>';
+			echo '<td><a class="tabtitle-ne" title="'._('Activate this link').'" href="index.php?type=globaladmin&action=updateLinkStatus&linkid='.$link['id_headermenu'].'&linkstatus=1">'.html_image('docman/reserve-document.png', 22, 22, array('alt'=>_('Activate this link'))). '</a>';
+		}
+		echo '<a class="tabtitle-ne" title="'._('Edit this link').'" href="index.php?type=globaladmin&view=updateLinkValue&linkid='.$link['id_headermenu'].'">'.html_image('docman/edit-file.png',22,22, array('alt'=>_('Edit this link'))). '</a>';
+		echo '<a class="tabtitle-ne" title="'._('Delete this link').'" href="index.php?type=globaladmin&action=deleteLink&linkid='.$link['id_headermenu'].'">'.html_image('docman/trash-empty.png',22,22, array('alt'=>_('Delete this link'))). '</a>';
+		echo '</td>';
+		echo '</tr>';
+	}
+	echo $HTML->listTableBottom();
+	echo $HTML->boxBottom();
+	echo '</br>';
+}
+
 echo '<form method="POST" name="addLink" action="index.php?type=globaladmin&action=addLink">';
 echo '<table><tr>';
 echo $HTML->boxTop(_('Add a new link'));
diff --git a/src/plugins/headermenu/view/admin/viewProjectConfiguration.php b/src/plugins/headermenu/view/admin/viewProjectConfiguration.php
index 1ad33f4..f200b60 100644
--- a/src/plugins/headermenu/view/admin/viewProjectConfiguration.php
+++ b/src/plugins/headermenu/view/admin/viewProjectConfiguration.php
@@ -46,12 +46,13 @@ jQuery(document).ready(function() {
 <?php
 $linksArray = $headermenu->getAvailableLinks('groupmenu');
 if (sizeof($linksArray)) {
+	echo '<p class="information">'. _('You can reorder links, just drag & drop rows in the table and save order.').'</p>';
 	echo $HTML->boxTop(_('Manage available links'));
-	$tabletop = array(_('Menu Type'), _('Displayed Name'), _('Description'), _('Status'), _('Actions'));
-	$classth = array('','','','','unsortable');
+	$tabletop = array(_('Order'), _('Menu Type'), _('Displayed Name'), _('Description'), _('Status'), _('Actions'));
+	$classth = array('', '','','','','unsortable');
 	echo $HTML->listTableTop($tabletop, false, 'sortable_headermenu_listlinks', 'sortable', $classth);
 	foreach ($linksArray as $link) {
-		echo '<tr>';
+		echo '<tr><td>'.$link['ordering'].'</td>';
 		if (strlen($link['url']) > 0) {
 			echo '<td>'._('URL');
 			if ($link['linktype'] == 'iframe') {

commit b61dd5050669f424f12cb3460a2e4efd31cd0bf5
Author: Franck Villaume <franck.villaume at trivialdev.com>
Date:   Tue Jan 1 16:35:35 2013 +0100

    start implement reorder

diff --git a/src/plugins/headermenu/common/headermenuPlugin.class.php b/src/plugins/headermenu/common/headermenuPlugin.class.php
index 93efda2..6cc2c60 100644
--- a/src/plugins/headermenu/common/headermenuPlugin.class.php
+++ b/src/plugins/headermenu/common/headermenuPlugin.class.php
@@ -3,7 +3,7 @@
 /**
  * headermenuPlugin Class
  *
- * Copyright 2012 Franck Villaume - TrivialDev
+ * Copyright 2012-2013, Franck Villaume - TrivialDev
  * http://fusionforge.org
  *
  * This file is part of FusionForge. FusionForge is free software;
@@ -61,7 +61,7 @@ class headermenuPlugin extends Plugin {
 				$group_id = $params['group_id'];
 				$project = group_get_object($group_id);
 				if ($project->usesPlugin($this->name)) {
-					echo '<p>'.util_make_link('/plugins/headermenu/?type=projectadmin&group_id='.$group_id,
+					echo '<p>'.util_make_link('/plugins/'.$this->name.'/?type=projectadmin&group_id='.$group_id,
 					     _('Project GroupMenu Admin'), array('class' => 'tabtitle', 'title' => _('Add/Remove/Activate/Desactivate tabs'))) . '</p>';
 				}
 				break;
@@ -304,6 +304,7 @@ class headermenuPlugin extends Plugin {
 				global $gfwww;
 				require_once($gfwww.'admin/admin_utils.php');
 				html_use_jquery();
+				html_use_jqueryui();
 				use_javascript('scripts/HeaderMenuController.js');
 				use_javascript('/js/sortable.js');
 				site_admin_header(array('title'=>_('Site Global Menu Admin'), 'toptab' => ''));
@@ -315,18 +316,19 @@ class headermenuPlugin extends Plugin {
 				$link = $this->getLink($this->pageid);
 				$group_id = getIntFromRequest('group_id');
 				if ($group_id) {
-					$params['toptab'] = '/plugins/headermenu/?type='.$type.'&group_id='.$group_id.'&pageid='.$this->pageid;
+					$params['toptab'] = '/plugins/'.$this->name.'/?type='.$type.'&group_id='.$group_id.'&pageid='.$this->pageid;
 					$params['group'] = $group_id;
 					$params['title'] = $link['name'];
 					site_project_header($params);
 				} else {
-					site_header(array('title'=> $link['name'], 'toptab' => '/plugins/headermenu/?type='.$type.'&pageid='.$this->pageid));
+					site_header(array('title'=> $link['name'], 'toptab' => '/plugins/'.$this->name.'/?type='.$type.'&pageid='.$this->pageid));
 				}
 				$returned = true;
 				break;
 			}
 			case 'projectadmin': {
 				html_use_jquery();
+				html_use_jqueryui();
 				use_javascript('scripts/HeaderMenuController.js');
 				use_javascript('/js/sortable.js');
 				site_header(array('title'=>_('Project Menu Admin'), 'toptab' => ''));
diff --git a/src/plugins/headermenu/view/admin/viewProjectConfiguration.php b/src/plugins/headermenu/view/admin/viewProjectConfiguration.php
index 72c7018..1ad33f4 100644
--- a/src/plugins/headermenu/view/admin/viewProjectConfiguration.php
+++ b/src/plugins/headermenu/view/admin/viewProjectConfiguration.php
@@ -37,7 +37,8 @@ jQuery(document).ready(function() {
 		trHtmlCode:	jQuery('#htmlcode'),
 		trUrlCode:	jQuery('#urlcode'),
 		trIframeView:	jQuery('#iframe'),
-    });
+		tableTbodyLink:	jQuery('#sortable tbody')
+	});
 });
 
 //]]></script>
diff --git a/src/plugins/headermenu/www/scripts/HeaderMenuController.js b/src/plugins/headermenu/www/scripts/HeaderMenuController.js
index 84f2dce..eb11f3d 100644
--- a/src/plugins/headermenu/www/scripts/HeaderMenuController.js
+++ b/src/plugins/headermenu/www/scripts/HeaderMenuController.js
@@ -52,6 +52,9 @@ HeaderMenuController.prototype =
 		this.params.trHtmlCode.hide();
 		this.params.trUrlCode.show();
 		this.params.inputURL.attr('checked', 'checked');
+		if (typeof(this.params.tableTbodyLink) != 'undefined') {
+			this.params.tableTbodyLink.sortable();
+		}
 	},
 
 	htmlCodeView: function() {
@@ -80,6 +83,9 @@ GroupMenuController.prototype =
 		this.params.trHtmlCode.hide();
 		this.params.trUrlCode.show();
 		this.params.inputURL.attr('checked', 'checked');
+		if (typeof(this.params.tableTbodyLink) != 'undefined') {
+			this.params.tableTbodyLink.sortable();
+		}
 	},
 
 	htmlCodeView: function() {

commit 47a023494ec03b3170323af2d7b2f26c822048ed
Author: Franck Villaume <franck.villaume at trivialdev.com>
Date:   Tue Jan 1 15:01:46 2013 +0100

    make the update works

diff --git a/src/plugins/headermenu/action/updateLinkValue.php b/src/plugins/headermenu/action/updateLinkValue.php
index e9706ba..caf7bd9 100644
--- a/src/plugins/headermenu/action/updateLinkValue.php
+++ b/src/plugins/headermenu/action/updateLinkValue.php
@@ -23,7 +23,6 @@
 
 global $headermenu;
 
-session_require_global_perm('forge_admin');
 $idLink = getIntFromRequest('linkid');
 $link = getStringFromRequest('link');
 $name = strip_tags(getStringFromRequest('name'));
@@ -31,53 +30,55 @@ $description = strip_tags(getStringFromRequest('description'));
 $typemenu = getStringFromRequest('typemenu');
 $linkmenu = getStringFromRequest('linkmenu');
 $htmlcode = getStringFromRequest('htmlcode');
+$type = getStringFromRequest('type');
 
 if (!empty($idLink) && !empty($name)) {
 	switch ($linkmenu) {
-		case "headermenu": {
+		case 'headermenu': {
 			if (!empty($link)) {
 				if (util_check_url($link)) {
 					if ($headermenu->updateLink($idLink, $link, $name, $description, $linkmenu)) {
 						$feedback = _('Task succeeded.');
-						session_redirect('plugins/'.$headermenu->name.'/?type=globaladmin&feedback='.urlencode($feedback));
+						session_redirect('plugins/'.$headermenu->name.'/?type='.$type.'&feedback='.urlencode($feedback));
 					}
 					$error_msg = _('Task failed');
-					session_redirect('plugins/'.$headermenu->name.'/?type=globaladmin&error_msg='.urlencode($error_msg));
+					session_redirect('plugins/'.$headermenu->name.'/?type='.$type.'&error_msg='.urlencode($error_msg));
 				} else {
 					$error_msg = _('Provided Link is not a valid URL.');
-					session_redirect('plugins/'.$headermenu->name.'/?type=globaladmin&error_msg='.urlencode($error_msg));
+					session_redirect('plugins/'.$headermenu->name.'/?type='.$type.'&error_msg='.urlencode($error_msg));
 				}
 			}
 			$warning_msg = _('Missing Link URL.');
-			session_redirect('plugins/'.$headermenu->name.'/?type=globaladmin&warning_msg='.urlencode($warning_msg));
+			session_redirect('plugins/'.$headermenu->name.'/?type='.$type.'&warning_msg='.urlencode($warning_msg));
 			break;
 		}
-		case "outermenu": {
-			if (!empty($link) && $typemenu == 'url') {
+		case 'outermenu':
+		case 'groupmenu': {
+			if (!empty($link) && ($typemenu == 'url' || $typemenu == 'iframe')) {
 				if (util_check_url($link)) {
-					if ($headermenu->updateLink($idLink, $link, $name, $description, $linkmenu)) {
+					if ($headermenu->updateLink($idLink, $link, $name, $description, $linkmenu, $typemenu)) {
 						$feedback = _('Task succeeded.');
-						session_redirect('plugins/'.$headermenu->name.'/?type=globaladmin&feedback='.urlencode($feedback));
+						session_redirect('plugins/'.$headermenu->name.'/?type='.$type.'&feedback='.urlencode($feedback));
 					}
 					$error_msg = _('Task failed');
-					session_redirect('plugins/'.$headermenu->name.'/?type=globaladmin&error_msg='.urlencode($error_msg));
+					session_redirect('plugins/'.$headermenu->name.'/?type='.$type.'&error_msg='.urlencode($error_msg));
 				} else {
 					$error_msg = _('Provided Link is not a valid URL.');
-					session_redirect('plugins/'.$headermenu->name.'/?type=globaladmin&error_msg='.urlencode($error_msg));
+					session_redirect('plugins/'.$headermenu->name.'/?type='.$type.'&error_msg='.urlencode($error_msg));
 				}
 			}
 			if (!empty($htmlcode) && $typemenu == 'htmlcode') {
 				if ($headermenu->updateLink($idLink, '', $name, $description, $linkmenu, 'htmlcode', $htmlcode)) {
 					$feedback = _('Task succeeded.');
-					session_redirect('plugins/'.$headermenu->name.'/?type=globaladmin&feedback='.urlencode($feedback));
+					session_redirect('plugins/'.$headermenu->name.'/?type='.$type.'&feedback='.urlencode($feedback));
 				}
 				$error_msg = _('Task failed');
-				session_redirect('plugins/'.$headermenu->name.'/?type=globaladmin&error_msg='.urlencode($error_msg));
+				session_redirect('plugins/'.$headermenu->name.'/?type='.$type.'&error_msg='.urlencode($error_msg));
 			}
 			$warning_msg = _('Missing Link URL or Html Code.');
-			session_redirect('plugins/'.$headermenu->name.'/?type=globaladmin&warning_msg='.urlencode($warning_msg));
+			session_redirect('plugins/'.$headermenu->name.'/?type='.$type.'&warning_msg='.urlencode($warning_msg));
 		}
 	}
 }
 $warning_msg = _('No link to update or name missing.');
-session_redirect('plugins/'.$headermenu->name.'/?type=globaladmin&warning_msg='.urlencode($warning_msg));
+session_redirect('plugins/'.$headermenu->name.'/?type='.$type.'&warning_msg='.urlencode($warning_msg));
diff --git a/src/plugins/headermenu/view/admin/updateLinkValue.php b/src/plugins/headermenu/view/admin/updateLinkValue.php
index 6edb149..4b2e884 100644
--- a/src/plugins/headermenu/view/admin/updateLinkValue.php
+++ b/src/plugins/headermenu/view/admin/updateLinkValue.php
@@ -63,15 +63,14 @@ if (is_array($linkValues)) {
 		echo html_build_radio_buttons_from_arrays($vals, $texts, $select_name, $linkValues['linkmenu'], false);
 		echo '</td>';
 		echo '</tr><tr>';
+		$texts = array('URL', 'New Page');
+		$vals = array('url', 'htmlcode');
 	}
 	echo '<td>'._('Menu Type').'</td><td>';
 	if ($type == 'projectadmin') {
 		$texts = array('URL', 'URL as iframe', 'New Page');
 		$vals = array('url', 'iframe', 'htmlcode');
-	}
-	if ($type == 'globaladmin') {
-		$texts = array('URL', 'New Page');
-		$vals = array('url', 'htmlcode');
+		echo '<input type="hidden" name="linkmenu" value="groupmenu" />';
 	}
 	$select_name = 'typemenu';
 	echo html_build_radio_buttons_from_arrays($vals, $texts, $select_name, $linkValues['linktype'], false);

commit d90024436d97c13abebf025805b5fdbdfa2c5369
Author: Franck Villaume <franck.villaume at trivialdev.com>
Date:   Tue Jan 1 14:44:52 2013 +0100

    support for edit link in groupmenu

diff --git a/src/plugins/headermenu/action/addLink.php b/src/plugins/headermenu/action/addLink.php
index 665e460..d6333d9 100644
--- a/src/plugins/headermenu/action/addLink.php
+++ b/src/plugins/headermenu/action/addLink.php
@@ -2,7 +2,7 @@
 /**
  * headermenu plugin : addLink action
  *
- * Copyright 2012, Franck Villaume - TrivialDev
+ * Copyright 2012-2013, Franck Villaume - TrivialDev
  * http://fusionforge.org
  *
  * This file is part of FusionForge. FusionForge is free software;
@@ -61,7 +61,7 @@ if (!empty($name) && !empty($linkmenu)) {
 		case 'groupmenu': {
 			if (!empty($link)) {
 				if (util_check_url($link)) {
-					$linktype = 'URL';
+					$linktype = 'url';
 					if ($iframed) {
 						$linktype = 'iframe';
 					}
diff --git a/src/plugins/headermenu/db/20121231-reorderentry.sql b/src/plugins/headermenu/db/20121231-reorderentry.sql
index 2f1dccf..865b851 100644
--- a/src/plugins/headermenu/db/20121231-reorderentry.sql
+++ b/src/plugins/headermenu/db/20121231-reorderentry.sql
@@ -1 +1,2 @@
+UPDATE plugin_headermenu SET linktype = 'url' where linktype = 'URL';
 ALTER TABLE plugin_headermenu ADD COLUMN ordering integer DEFAULT 0 NOT NULL;
diff --git a/src/plugins/headermenu/view/admin/updateLinkValue.php b/src/plugins/headermenu/view/admin/updateLinkValue.php
index 1209aa8..6edb149 100644
--- a/src/plugins/headermenu/view/admin/updateLinkValue.php
+++ b/src/plugins/headermenu/view/admin/updateLinkValue.php
@@ -2,7 +2,7 @@
 /**
  * headermenuPlugin Class
  *
- * Copyright 2012 Franck Villaume - TrivialDev
+ * Copyright 2012-2013, Franck Villaume - TrivialDev
  * http://fusionforge.org
  *
  * This file is part of FusionForge. FusionForge is free software;
@@ -23,8 +23,8 @@
 
 global $HTML;
 global $headermenu;
+global $type;
 
-session_require_global_perm('forge_admin');
 $linkId = getIntFromRequest('linkid');
 ?>
 
@@ -35,6 +35,7 @@ jQuery(document).ready(function() {
 	controllerHeaderMenu = new EditHeaderMenuController({
 		inputHtmlCode:	jQuery('#typemenu_htmlcode'),
 		inputURL:	jQuery('#typemenu_url'),
+		inputURLIframe:	jQuery('#typemenu_iframe'),
 		inputHeader:	jQuery('#linkmenu_headermenu'),
 		inputOuter:	jQuery('#linkmenu_outermenu'),
 		trHtmlCode:	jQuery('#htmlcode'),
@@ -47,23 +48,31 @@ jQuery(document).ready(function() {
 <?php
 $linkValues = $headermenu->getLink($linkId);
 if (is_array($linkValues)) {
-	echo '<form method="POST" name="updateLink" action="index.php?type=globaladmin&action=updateLinkValue">';
+	echo '<form method="POST" name="updateLink" action="index.php?type='.$type.'&action=updateLinkValue">';
 	echo '<table><tr>';
 	echo $HTML->boxTop(_('Update this link'));
 	echo '<td>'._('Displayed Name').'</td><td><input name="name" type="text" maxsize="255" value="'.$linkValues['name'].'" /></td>';
 	echo '</tr><tr>';
 	echo '<td>'._('Description').'</td><td><input name="description" type="text" maxsize="255" value="'.$linkValues['description'].'" /></td>';
 	echo '</tr><tr>';
-	echo '<td>'._('Menu Location').'</td><td>';
-	$vals = array('headermenu', 'outermenu');
-	$texts = array('headermenu', 'outermenu');
-	$select_name = 'linkmenu';
-	echo html_build_radio_buttons_from_arrays($vals, $texts, $select_name, $linkValues['linkmenu'], false);
-	echo '</td>';
-	echo '</tr><tr>';
+	if ($type == 'globaladmin') {
+		echo '<td>'._('Menu Location').'</td><td>';
+		$vals = array('headermenu', 'outermenu');
+		$texts = array('headermenu', 'outermenu');
+		$select_name = 'linkmenu';
+		echo html_build_radio_buttons_from_arrays($vals, $texts, $select_name, $linkValues['linkmenu'], false);
+		echo '</td>';
+		echo '</tr><tr>';
+	}
 	echo '<td>'._('Menu Type').'</td><td>';
-	$texts = array('URL', 'New Page');
-	$vals = array('url', 'htmlcode');
+	if ($type == 'projectadmin') {
+		$texts = array('URL', 'URL as iframe', 'New Page');
+		$vals = array('url', 'iframe', 'htmlcode');
+	}
+	if ($type == 'globaladmin') {
+		$texts = array('URL', 'New Page');
+		$vals = array('url', 'htmlcode');
+	}
 	$select_name = 'typemenu';
 	echo html_build_radio_buttons_from_arrays($vals, $texts, $select_name, $linkValues['linktype'], false);
 	echo '</td>';
@@ -81,20 +90,18 @@ if (is_array($linkValues)) {
 		echo '<textarea name="htmlcode" rows="5" cols="80">'.$body.'</textarea>';
 	}
 	unset($GLOBALS['editor_was_set_up']);
-	echo '</td></tr><tr id="urlcode" >';
-	echo '<td>'._('URL').'</td><td><input name="link" type="text" maxsize="255" /></td>';
-	echo '</tr><tr id="urlcode"  style="display:none" >';
+	echo '</td></tr><tr id="urlcode"  style="display:none" >';
 	echo '<td>'._('URL').'</td><td><input name="link" type="text" maxsize="255" value="'.$linkValues['url'].'" /></td>';
 	echo '</tr><tr>';
 	echo '<td>';
 	echo '<input type="hidden" name="linkid" value="'.$linkId.'" />';
 	echo '<input type="submit" value="'. _('Update') .'" />';
-	echo '<a href="/plugins/'.$headermenu->name.'/?type=globaladmin"><input type="button" value="'. _('Cancel') .'" /></a>';
+	echo '<a href="/plugins/'.$headermenu->name.'/?type='.$type.'"><input type="button" value="'. _('Cancel') .'" /></a>';
 	echo '</td>';
 	echo $HTML->boxBottom();
 	echo '</tr></table>';
 	echo '</form>';
 } else {
 	$error_msg = _('Cannot retrieve value for this link:').' '.$linkId;
-	session_redirect('plugins/'.$headermenu->name.'/?type=globaladmin&error_msg='.urlencode($error_msg));
+	session_redirect('plugins/'.$headermenu->name.'/?type='.$type.'&error_msg='.urlencode($error_msg));
 }
diff --git a/src/plugins/headermenu/www/scripts/HeaderMenuController.js b/src/plugins/headermenu/www/scripts/HeaderMenuController.js
index 68aee35..84f2dce 100644
--- a/src/plugins/headermenu/www/scripts/HeaderMenuController.js
+++ b/src/plugins/headermenu/www/scripts/HeaderMenuController.js
@@ -1,7 +1,7 @@
 /**
  * headerMenu Plugin Js Controller
  *
- * Copyright 2012, Franck Villaume - TrivialDev
+ * Copyright 2012-2013, Franck Villaume - TrivialDev
  * http://fusionforge.org
  *
  * This file is part of FusionForge. FusionForge is free software;
@@ -104,8 +104,15 @@ EditHeaderMenuController.prototype =
 	bindControls: function() {
 		this.params.inputHtmlCode.click(jQuery.proxy(this, "htmlCodeView"));
 		this.params.inputURL.click(jQuery.proxy(this, "htmlUrlView"));
-		this.params.inputOuter.click(jQuery.proxy(this, "inputHtmlCodeView"));
-		this.params.inputHeader.click(jQuery.proxy(this, "headerView"));
+		if (typeof(this.params.inputOuter) != 'undefined') {
+			this.params.inputOuter.click(jQuery.proxy(this, "inputHtmlCodeView"));
+		}
+		if (typeof(this.params.inputHeader) != 'undefined') {
+			this.params.inputHeader.click(jQuery.proxy(this, "headerView"));
+		}
+		if (typeof(this.params.inputURLIframe) != 'undefined') {
+			this.params.inputURLIframe.click(jQuery.proxy(this, "htmlUrlView"));
+		}
 	},
 
 	initializeView: function() {
@@ -120,6 +127,12 @@ EditHeaderMenuController.prototype =
 			this.params.trHtmlCode.hide();
 			this.params.trUrlCode.show();
 		}
+		if (typeof(this.params.inputURLIframe) != 'undefined') {
+			if (this.params.inputURLIframe.attr("checked")) {
+				this.params.trHtmlCode.hide();
+				this.params.trUrlCode.show();
+			}
+		}
 	},
 
 	htmlUrlView: function() {

commit 38ed5b26b6bf50ec9ab7303801e653d0931631bf
Author: Franck Villaume <franck.villaume at trivialdev.com>
Date:   Mon Dec 31 18:10:59 2012 +0100

    add new column: ordering, to support order between link

diff --git a/src/plugins/headermenu/db/20121231-reorderentry.sql b/src/plugins/headermenu/db/20121231-reorderentry.sql
new file mode 100644
index 0000000..2f1dccf
--- /dev/null
+++ b/src/plugins/headermenu/db/20121231-reorderentry.sql
@@ -0,0 +1 @@
+ALTER TABLE plugin_headermenu ADD COLUMN ordering integer DEFAULT 0 NOT NULL;

commit 7fb9c047dfbb1a2955d05e5ce1e7331bb8ff8c53
Author: Franck Villaume <franck.villaume at trivialdev.com>
Date:   Mon Dec 31 17:56:38 2012 +0100

    add support for iframe in groupmenu

diff --git a/src/plugins/headermenu/action/addLink.php b/src/plugins/headermenu/action/addLink.php
index a31060f..665e460 100644
--- a/src/plugins/headermenu/action/addLink.php
+++ b/src/plugins/headermenu/action/addLink.php
@@ -30,6 +30,7 @@ $name = strip_tags(getStringFromRequest('name'));
 $linkmenu = getStringFromRequest('linkmenu');
 $htmlcode = getStringFromRequest('htmlcode');
 $type = getStringFromRequest('type');
+$iframed = getIntFromRequest('iframeview');
 
 $redirect_url = 'plugins/'.$headermenu->name.'/?type='.$type;
 if (isset($group_id) && $group_id) {
@@ -60,7 +61,11 @@ if (!empty($name) && !empty($linkmenu)) {
 		case 'groupmenu': {
 			if (!empty($link)) {
 				if (util_check_url($link)) {
-					if ($headermenu->addLink($link, $name, $description, $linkmenu)) {
+					$linktype = 'URL';
+					if ($iframed) {
+						$linktype = 'iframe';
+					}
+					if ($headermenu->addLink($link, $name, $description, $linkmenu, $linktype)) {
 						$feedback = _('Task succeeded.');
 						session_redirect($redirect_url.'&feedback='.urlencode($feedback));
 					}
diff --git a/src/plugins/headermenu/common/headermenuPlugin.class.php b/src/plugins/headermenu/common/headermenuPlugin.class.php
index d9debd0..93efda2 100644
--- a/src/plugins/headermenu/common/headermenuPlugin.class.php
+++ b/src/plugins/headermenu/common/headermenuPlugin.class.php
@@ -147,10 +147,10 @@ class headermenuPlugin extends Plugin {
 						break;
 					}
 					case 'iframe': {
-						$params['DIRS'][] = '/plugins/'.$this->name.'/?type=iframe&group_id='.$params['group'].'&pageid='.$link['id_headermenu'];
+						$params['DIRS'][] = '/plugins/'.$this->name.'/?type=iframeview&group_id='.$params['group'].'&pageid='.$link['id_headermenu'];
 						$params['TITLES'][] = $link['name'];
 						$params['TOOLTIPS'][] = $link['description'];
-						if ($params['toptab'] == '/plugins/'.$this->name.'/?type=iframe&group_id='.$params['group'].'&pageid='.$link['id_headermenu']) {
+						if ($params['toptab'] == '/plugins/'.$this->name.'/?type=iframeview&group_id='.$params['group'].'&pageid='.$link['id_headermenu']) {
 							$params['selected'] = (count($params['DIRS'])-1);
 						}
 						break;
@@ -286,7 +286,8 @@ class headermenuPlugin extends Plugin {
 	 * @return	string	the html code
 	 */
 	 function iframeView($pageid) {
-		return true;
+		$link = $this->getLink($pageid);
+		return '<iframe src="'.rtrim($link['url'],'/').'" frameborder="0" height="600px" width="100%"></iframe>';
 	 }
 
 	/**
@@ -309,16 +310,17 @@ class headermenuPlugin extends Plugin {
 				$returned = true;
 				break;
 			}
-			case 'pageview': {
+			case 'pageview':
+			case 'iframeview': {
 				$link = $this->getLink($this->pageid);
 				$group_id = getIntFromRequest('group_id');
 				if ($group_id) {
-					$params['toptab'] = '/plugins/headermenu/?type=pageview&group_id='.$group_id.'&pageid='.$this->pageid;
+					$params['toptab'] = '/plugins/headermenu/?type='.$type.'&group_id='.$group_id.'&pageid='.$this->pageid;
 					$params['group'] = $group_id;
 					$params['title'] = $link['name'];
 					site_project_header($params);
 				} else {
-					site_header(array('title'=> $link['name'], 'toptab' => '/plugins/headermenu/?type=pageview&pageid='.$this->pageid));
+					site_header(array('title'=> $link['name'], 'toptab' => '/plugins/headermenu/?type='.$type.'&pageid='.$this->pageid));
 				}
 				$returned = true;
 				break;
diff --git a/src/plugins/headermenu/view/admin/viewProjectConfiguration.php b/src/plugins/headermenu/view/admin/viewProjectConfiguration.php
index 08a5691..72c7018 100644
--- a/src/plugins/headermenu/view/admin/viewProjectConfiguration.php
+++ b/src/plugins/headermenu/view/admin/viewProjectConfiguration.php
@@ -35,7 +35,8 @@ jQuery(document).ready(function() {
 		inputHtmlCode:	jQuery('#typemenu_htmlcode'),
 		inputURL:	jQuery('#typemenu_url'),
 		trHtmlCode:	jQuery('#htmlcode'),
-		trUrlCode:	jQuery('#urlcode')
+		trUrlCode:	jQuery('#urlcode'),
+		trIframeView:	jQuery('#iframe'),
     });
 });
 
@@ -51,7 +52,11 @@ if (sizeof($linksArray)) {
 	foreach ($linksArray as $link) {
 		echo '<tr>';
 		if (strlen($link['url']) > 0) {
-			echo '<td>'._('URL').' ('.htmlspecialchars($link['url']).')</td>';
+			echo '<td>'._('URL');
+			if ($link['linktype'] == 'iframe') {
+				echo ' '._('displayed as iframe');
+			}
+			echo ' ('.htmlspecialchars($link['url']).')</td>';
 		} else {
 			echo '<td>'._('static html code').'</td>';
 		}
@@ -103,6 +108,8 @@ if (!$GLOBALS['editor_was_set_up']) {
 unset($GLOBALS['editor_was_set_up']);
 echo '</td></tr><tr id="urlcode" >';
 echo '<td>'._('URL').'</td><td><input name="link" type="text" maxsize="255" /></td>';
+echo '</td></tr><tr id="iframe" >';
+echo '<td colspan="2" ><input name="iframeview" type="checkbox" value="1" />Display URL as iframe.</td>';
 echo '</tr><tr>';
 echo '<td>';
 echo '<input type="hidden" name="linkmenu" value="groupmenu" />';
diff --git a/src/plugins/headermenu/www/index.php b/src/plugins/headermenu/www/index.php
index 7418170..1f053ea 100644
--- a/src/plugins/headermenu/www/index.php
+++ b/src/plugins/headermenu/www/index.php
@@ -70,6 +70,13 @@ switch ($type) {
 		echo $headermenu->pageView($pageid);
 		break;
 	}
+	case 'iframeview': {
+		$pageid = getIntFromRequest('pageid');
+		$headermenu->pageid = $pageid;
+		$headermenu->getHeader($type);
+		echo $headermenu->iframeView($pageid);
+		break;
+	}
 	case 'projectadmin': {
 		if (!session_loggedin()) {
 			exit_not_logged_in();
diff --git a/src/plugins/headermenu/www/scripts/HeaderMenuController.js b/src/plugins/headermenu/www/scripts/HeaderMenuController.js
index 8d91e36..68aee35 100644
--- a/src/plugins/headermenu/www/scripts/HeaderMenuController.js
+++ b/src/plugins/headermenu/www/scripts/HeaderMenuController.js
@@ -85,11 +85,13 @@ GroupMenuController.prototype =
 	htmlCodeView: function() {
 		this.params.trHtmlCode.show();
 		this.params.trUrlCode.hide();
+		this.params.trIframeView.hide();
 	},
 
 	htmlUrlView: function() {
 		this.params.trHtmlCode.hide();
 		this.params.trUrlCode.show();
+		this.params.trIframeView.show();
 	},
 
 	inputHtmlCodeView: function() {

commit b21914ec31b87090c11f695f6516fea78048fe0c
Author: Franck Villaume <franck.villaume at trivialdev.com>
Date:   Mon Dec 31 15:23:15 2012 +0100

    fix selected entry in html code for groupmenu

diff --git a/src/plugins/headermenu/common/headermenuPlugin.class.php b/src/plugins/headermenu/common/headermenuPlugin.class.php
index 2aa7f74..d9debd0 100644
--- a/src/plugins/headermenu/common/headermenuPlugin.class.php
+++ b/src/plugins/headermenu/common/headermenuPlugin.class.php
@@ -141,12 +141,18 @@ class headermenuPlugin extends Plugin {
 						$params['DIRS'][] = '/plugins/'.$this->name.'/?type=pageview&group_id='.$params['group'].'&pageid='.$link['id_headermenu'];
 						$params['TITLES'][] = $link['name'];
 						$params['TOOLTIPS'][] = $link['description'];
+						if ($params['toptab'] == '/plugins/'.$this->name.'/?type=pageview&group_id='.$params['group'].'&pageid='.$link['id_headermenu']) {
+							$params['selected'] = (count($params['DIRS'])-1);
+						}
 						break;
 					}
 					case 'iframe': {
 						$params['DIRS'][] = '/plugins/'.$this->name.'/?type=iframe&group_id='.$params['group'].'&pageid='.$link['id_headermenu'];
 						$params['TITLES'][] = $link['name'];
 						$params['TOOLTIPS'][] = $link['description'];
+						if ($params['toptab'] == '/plugins/'.$this->name.'/?type=iframe&group_id='.$params['group'].'&pageid='.$link['id_headermenu']) {
+							$params['selected'] = (count($params['DIRS'])-1);
+						}
 						break;
 					}
 				}
@@ -307,11 +313,9 @@ class headermenuPlugin extends Plugin {
 				$link = $this->getLink($this->pageid);
 				$group_id = getIntFromRequest('group_id');
 				if ($group_id) {
-					$params['toptab'] = '/plugins/headermenu/?type=pageview&group_id='.$group_id.'pageid='.$this->pageid;
+					$params['toptab'] = '/plugins/headermenu/?type=pageview&group_id='.$group_id.'&pageid='.$this->pageid;
 					$params['group'] = $group_id;
 					$params['title'] = $link['name'];
-					$params['pagename'] = $link['name'];
-					$params['sectionvals'] = array(group_getname($group_id));
 					site_project_header($params);
 				} else {
 					site_header(array('title'=> $link['name'], 'toptab' => '/plugins/headermenu/?type=pageview&pageid='.$this->pageid));

commit 68fedbdceeefb3dd150bc17716ed42c38113a2d2
Author: Franck Villaume <franck.villaume at trivialdev.com>
Date:   Mon Dec 31 11:27:22 2012 +0100

    add support for html page in groupmenu

diff --git a/src/plugins/headermenu/action/addLink.php b/src/plugins/headermenu/action/addLink.php
index 2bbb69c..a31060f 100644
--- a/src/plugins/headermenu/action/addLink.php
+++ b/src/plugins/headermenu/action/addLink.php
@@ -56,7 +56,8 @@ if (!empty($name) && !empty($linkmenu)) {
 			session_redirect($redirect_url.'&warning_msg='.urlencode($warning_msg));
 			break;
 		}
-		case 'outermenu': {
+		case 'outermenu':
+		case 'groupmenu': {
 			if (!empty($link)) {
 				if (util_check_url($link)) {
 					if ($headermenu->addLink($link, $name, $description, $linkmenu)) {
@@ -81,21 +82,6 @@ if (!empty($name) && !empty($linkmenu)) {
 			$warning_msg = _('Missing Link URL or Html Code.');
 			session_redirect($redirect_url.'&warning_msg='.urlencode($warning_msg));
 		}
-		case 'groupmenu': {
-			if (!empty($link)) {
-				if (util_check_url($link)) {
-					if ($headermenu->addLink($link, $name, $description, $linkmenu)) {
-						$feedback = _('Task succeeded.');
-						session_redirect($redirect_url.'&feedback='.urlencode($feedback));
-					}
-					$error_msg = _('Task failed');
-					session_redirect($redirect_url.'&error_msg='.urlencode($error_msg));
-				} else {
-					$error_msg = _('Provided Link is not a valid URL.');
-					session_redirect($redirect_url.'&error_msg='.urlencode($error_msg));
-				}
-			}
-		}
 	}
 }
 $warning_msg = _('No link to create or name missing.');
diff --git a/src/plugins/headermenu/common/headermenuPlugin.class.php b/src/plugins/headermenu/common/headermenuPlugin.class.php
index 4a9b0da..2aa7f74 100644
--- a/src/plugins/headermenu/common/headermenuPlugin.class.php
+++ b/src/plugins/headermenu/common/headermenuPlugin.class.php
@@ -138,13 +138,13 @@ class headermenuPlugin extends Plugin {
 						break;
 					}
 					case 'htmlcode': {
-						$params['DIRS'][] = '/plugins/'.$this->name.'/?type=pageview&pageid='.$link['id_headermenu'];
+						$params['DIRS'][] = '/plugins/'.$this->name.'/?type=pageview&group_id='.$params['group'].'&pageid='.$link['id_headermenu'];
 						$params['TITLES'][] = $link['name'];
 						$params['TOOLTIPS'][] = $link['description'];
 						break;
 					}
 					case 'iframe': {
-						$params['DIRS'][] = '/plugins/'.$this->name.'/?type=iframe&pageid='.$link['id_headermenu'];
+						$params['DIRS'][] = '/plugins/'.$this->name.'/?type=iframe&group_id='.$params['group'].'&pageid='.$link['id_headermenu'];
 						$params['TITLES'][] = $link['name'];
 						$params['TOOLTIPS'][] = $link['description'];
 						break;
@@ -305,7 +305,17 @@ class headermenuPlugin extends Plugin {
 			}
 			case 'pageview': {
 				$link = $this->getLink($this->pageid);
-				site_header(array('title'=> $link['name'], 'toptab' => '/plugins/headermenu/?pageview&pageid='.$this->pageid));
+				$group_id = getIntFromRequest('group_id');
+				if ($group_id) {
+					$params['toptab'] = '/plugins/headermenu/?type=pageview&group_id='.$group_id.'pageid='.$this->pageid;
+					$params['group'] = $group_id;
+					$params['title'] = $link['name'];
+					$params['pagename'] = $link['name'];
+					$params['sectionvals'] = array(group_getname($group_id));
+					site_project_header($params);
+				} else {
+					site_header(array('title'=> $link['name'], 'toptab' => '/plugins/headermenu/?type=pageview&pageid='.$this->pageid));
+				}
 				$returned = true;
 				break;
 			}

commit c7d4bb39139657319f495da779b8f7240475387b
Author: Franck Villaume <franck.villaume at trivialdev.com>
Date:   Sun Dec 30 20:38:42 2012 +0100

    start htmlcode support in groupmenu

diff --git a/src/plugins/headermenu/action/updateLinkStatus.php b/src/plugins/headermenu/action/updateLinkStatus.php
index ff482e8..03cce2a 100644
--- a/src/plugins/headermenu/action/updateLinkStatus.php
+++ b/src/plugins/headermenu/action/updateLinkStatus.php
@@ -22,18 +22,23 @@
  */
 
 global $headermenu;
+global $type;
+global $group_id;
 
-session_require_global_perm('forge_admin');
 $idLink = getIntFromRequest('linkid');
 $linkStatus = getIntFromRequest('linkstatus');
+$redirect_url = 'plugins/'.$headermenu->name.'/?type='.$type;
+if (isset($group_id) && $group_id) {
+	$redirect_url .= '&group_id='.$group_id;
+}
 
 if (!empty($idLink)) {
 	if ($headermenu->updateLinkStatus($idLink, $linkStatus)) {
 		$feedback = _('Link Status updated');
-		session_redirect('plugins/'.$headermenu->name.'/?type=globaladmin&feedback='.urlencode($feedback));
+		session_redirect($redirect_url.'&feedback='.urlencode($feedback));
 	}
 	$error_msg = _('Task failed');
-	session_redirect('plugins/'.$headermenu->name.'/?type=globaladmin&error_msg='.urlencode($error_msg));
+	session_redirect($redirect_url.'&error_msg='.urlencode($error_msg));
 }
 $warning_msg = _('Missing Link or status to be updated.');
-session_redirect('plugins/'.$headermenu->name.'/?type=globaladmin&warning_msg='.urlencode($warning_msg));
+session_redirect($redirect_url.'&warning_msg='.urlencode($warning_msg));
diff --git a/src/plugins/headermenu/common/headermenuPlugin.class.php b/src/plugins/headermenu/common/headermenuPlugin.class.php
index b2fe5f7..4a9b0da 100644
--- a/src/plugins/headermenu/common/headermenuPlugin.class.php
+++ b/src/plugins/headermenu/common/headermenuPlugin.class.php
@@ -311,6 +311,7 @@ class headermenuPlugin extends Plugin {
 			}
 			case 'projectadmin': {
 				html_use_jquery();
+				use_javascript('scripts/HeaderMenuController.js');
 				use_javascript('/js/sortable.js');
 				site_header(array('title'=>_('Project Menu Admin'), 'toptab' => ''));
 				$returned = true;
diff --git a/src/plugins/headermenu/view/admin/viewProjectConfiguration.php b/src/plugins/headermenu/view/admin/viewProjectConfiguration.php
index 0a04884..08a5691 100644
--- a/src/plugins/headermenu/view/admin/viewProjectConfiguration.php
+++ b/src/plugins/headermenu/view/admin/viewProjectConfiguration.php
@@ -27,6 +27,20 @@ global $group_id;
 
 ?>
 
+<script language="Javascript" type="text/javascript">//<![CDATA[
+var controllerGroupMenu;
+
+jQuery(document).ready(function() {
+	controllerGroupMenu = new GroupMenuController({
+		inputHtmlCode:	jQuery('#typemenu_htmlcode'),
+		inputURL:	jQuery('#typemenu_url'),
+		trHtmlCode:	jQuery('#htmlcode'),
+		trUrlCode:	jQuery('#urlcode')
+    });
+});
+
+//]]></script>
+
 <?php
 $linksArray = $headermenu->getAvailableLinks('groupmenu');
 if (sizeof($linksArray)) {
@@ -67,7 +81,27 @@ echo '<td>'._('Displayed Name').'</td><td><input name="name" type="text" maxsize
 echo '</tr><tr>';
 echo '<td>'._('Description').'</td><td><input name="description" type="text" maxsize="255" /></td>';
 echo '</tr><tr>';
-echo '<tr id="urlcode" >';
+echo '<td>'._('Menu Type').'</td><td>';
+$texts = array('URL', 'New Page');
+$vals = array('url', 'htmlcode');
+$select_name = 'typemenu';
+echo html_build_radio_buttons_from_arrays($vals, $texts, $select_name, 'url', false);
+echo '</td>';
+echo '</tr><tr id="htmlcode" style="display:none">';
+echo '<td>'._('Your HTML Code.').'</td><td>';
+$GLOBALS['editor_was_set_up'] = false;
+$body = _('Just paste your code here...');
+$params['name'] = 'htmlcode';
+$params['body'] = $body;
+$params['width'] = "800";
+$params['height'] = "500";
+$params['user_id'] = user_getid();
+plugin_hook("text_editor", $params);
+if (!$GLOBALS['editor_was_set_up']) {
+	echo '<textarea name="htmlcode" rows="5" cols="80">'.$body.'</textarea>';
+}
+unset($GLOBALS['editor_was_set_up']);
+echo '</td></tr><tr id="urlcode" >';
 echo '<td>'._('URL').'</td><td><input name="link" type="text" maxsize="255" /></td>';
 echo '</tr><tr>';
 echo '<td>';
diff --git a/src/plugins/headermenu/www/scripts/HeaderMenuController.js b/src/plugins/headermenu/www/scripts/HeaderMenuController.js
index ef9a7ed..8d91e36 100644
--- a/src/plugins/headermenu/www/scripts/HeaderMenuController.js
+++ b/src/plugins/headermenu/www/scripts/HeaderMenuController.js
@@ -32,6 +32,12 @@ HeaderMenuController = function(params) {
 	this.initializeView();
 };
 
+GroupMenuController = function(params) {
+	this.params = params;
+	this.bindControls();
+	this.initializeView();
+};
+
 HeaderMenuController.prototype =
 {
 	bindControls: function() {
@@ -63,6 +69,34 @@ HeaderMenuController.prototype =
 	}
 };
 
+GroupMenuController.prototype =
+{
+	bindControls: function() {
+		this.params.inputHtmlCode.click(jQuery.proxy(this, "htmlCodeView"));
+		this.params.inputURL.click(jQuery.proxy(this, "htmlUrlView"));
+	},
+
+	initializeView: function() {
+		this.params.trHtmlCode.hide();
+		this.params.trUrlCode.show();
+		this.params.inputURL.attr('checked', 'checked');
+	},
+
+	htmlCodeView: function() {
+		this.params.trHtmlCode.show();
+		this.params.trUrlCode.hide();
+	},
+
+	htmlUrlView: function() {
+		this.params.trHtmlCode.hide();
+		this.params.trUrlCode.show();
+	},
+
+	inputHtmlCodeView: function() {
+		this.params.inputHtmlCode.prop('disabled', false);
+	}
+};
+
 EditHeaderMenuController.prototype =
 {
 	bindControls: function() {

commit 5836376760c33cecab4544c81d965dab2a66fc00
Author: Franck Villaume <franck.villaume at trivialdev.com>
Date:   Sun Dec 30 19:56:25 2012 +0100

    support delete link in groupmenu

diff --git a/src/plugins/headermenu/action/addLink.php b/src/plugins/headermenu/action/addLink.php
index 9143385..2bbb69c 100644
--- a/src/plugins/headermenu/action/addLink.php
+++ b/src/plugins/headermenu/action/addLink.php
@@ -31,6 +31,11 @@ $linkmenu = getStringFromRequest('linkmenu');
 $htmlcode = getStringFromRequest('htmlcode');
 $type = getStringFromRequest('type');
 
+$redirect_url = 'plugins/'.$headermenu->name.'/?type='.$type;
+if (isset($group_id) && $group_id) {
+	$redirect_url .= '&group_id='.$group_id;
+}
+
 if (!empty($name) && !empty($linkmenu)) {
 	switch ($linkmenu) {
 		case 'headermenu': {
@@ -38,17 +43,17 @@ if (!empty($name) && !empty($linkmenu)) {
 				if (util_check_url($link)) {
 					if ($headermenu->addLink($link, $name, $description, $linkmenu)) {
 						$feedback = _('Task succeeded.');
-						session_redirect('plugins/'.$headermenu->name.'/?type='.$type.'&feedback='.urlencode($feedback));
+						session_redirect($redirect_url.'&feedback='.urlencode($feedback));
 					}
 					$error_msg = _('Task failed');
-					session_redirect('plugins/'.$headermenu->name.'/?type='.$type.'&error_msg='.urlencode($error_msg));
+					session_redirect($redirect_url.'&error_msg='.urlencode($error_msg));
 				} else {
 					$error_msg = _('Provided Link is not a valid URL.');
-					session_redirect('plugins/'.$headermenu->name.'/?type='.$type.'&error_msg='.urlencode($error_msg));
+					session_redirect($redirect_url.'&error_msg='.urlencode($error_msg));
 				}
 			}
 			$warning_msg = _('Missing Link URL.');
-			session_redirect('plugins/'.$headermenu->name.'/?type='.$type.'&warning_msg='.urlencode($warning_msg));
+			session_redirect($redirect_url.'&warning_msg='.urlencode($warning_msg));
 			break;
 		}
 		case 'outermenu': {
@@ -56,46 +61,42 @@ if (!empty($name) && !empty($linkmenu)) {
 				if (util_check_url($link)) {
 					if ($headermenu->addLink($link, $name, $description, $linkmenu)) {
 						$feedback = _('Task succeeded.');
-						session_redirect('plugins/'.$headermenu->name.'/?type='.$type.'&feedback='.urlencode($feedback));
+						session_redirect($redirect_url.'&feedback='.urlencode($feedback));
 					}
 					$error_msg = _('Task failed');
-					session_redirect('plugins/'.$headermenu->name.'/?type='.$type.'&error_msg='.urlencode($error_msg));
+					session_redirect($redirect_url.'&error_msg='.urlencode($error_msg));
 				} else {
 					$error_msg = _('Provided Link is not a valid URL.');
-					session_redirect('plugins/'.$headermenu->name.'/?type='.$type.'&error_msg='.urlencode($error_msg));
+					session_redirect($redirect_url.'&error_msg='.urlencode($error_msg));
 				}
 			}
 			if (!empty($htmlcode)) {
 				if ($headermenu->addLink('', $name, $description, $linkmenu, 'htmlcode', $htmlcode)) {
 					$feedback = _('Task succeeded.');
-					session_redirect('plugins/'.$headermenu->name.'/?type='.$type.'&feedback='.urlencode($feedback));
+					session_redirect($redirect_url.'&feedback='.urlencode($feedback));
 				}
 				$error_msg = _('Task failed');
-				session_redirect('plugins/'.$headermenu->name.'/?type='.$type.'&error_msg='.urlencode($error_msg));
+				session_redirect($redirect_url.'&error_msg='.urlencode($error_msg));
 			}
 			$warning_msg = _('Missing Link URL or Html Code.');
-			session_redirect('plugins/'.$headermenu->name.'/?type='.$type.'&warning_msg='.urlencode($warning_msg));
+			session_redirect($redirect_url.'&warning_msg='.urlencode($warning_msg));
 		}
 		case 'groupmenu': {
 			if (!empty($link)) {
 				if (util_check_url($link)) {
 					if ($headermenu->addLink($link, $name, $description, $linkmenu)) {
 						$feedback = _('Task succeeded.');
-						session_redirect('plugins/'.$headermenu->name.'/?type='.$type.'&group_id='.$group_id.'&feedback='.urlencode($feedback));
+						session_redirect($redirect_url.'&feedback='.urlencode($feedback));
 					}
 					$error_msg = _('Task failed');
-					session_redirect('plugins/'.$headermenu->name.'/?type='.$type.'&group_id='.$group_id.'&error_msg='.urlencode($error_msg));
+					session_redirect($redirect_url.'&error_msg='.urlencode($error_msg));
 				} else {
 					$error_msg = _('Provided Link is not a valid URL.');
-					session_redirect('plugins/'.$headermenu->name.'/?type='.$type.'&group_id='.$group_id.'&error_msg='.urlencode($error_msg));
+					session_redirect($redirect_url.'&error_msg='.urlencode($error_msg));
 				}
 			}
 		}
 	}
 }
 $warning_msg = _('No link to create or name missing.');
-$url = 'plugins/'.$headermenu->name.'/?type='.$type;
-if (isset($group_id)) {
-	$url .= '&group_id='.$group_id;
-}
-session_redirect($url.'&warning_msg='.urlencode($warning_msg));
+session_redirect($redirect_url.'&warning_msg='.urlencode($warning_msg));
diff --git a/src/plugins/headermenu/action/deleteLink.php b/src/plugins/headermenu/action/deleteLink.php
index 4859571..8cf9ecc 100644
--- a/src/plugins/headermenu/action/deleteLink.php
+++ b/src/plugins/headermenu/action/deleteLink.php
@@ -22,17 +22,22 @@
  */
 
 global $headermenu;
+global $type;
+global $group_id;
 
-session_require_global_perm('forge_admin');
 $idLink = getIntFromRequest('linkid');
+$redirect_url = 'plugins/'.$headermenu->name.'/?type='.$type;
+if (isset($group_id) && $group_id) {
+	$redirect_url .= '&group_id='.$group_id;
+}
 
 if (!empty($idLink)) {
 	if ($headermenu->deleteLink($idLink)) {
 		$feedback = _('Link deleted');
-		session_redirect('plugins/'.$headermenu->name.'/?type=globaladmin&feedback='.urlencode($feedback));
+		session_redirect($redirect_url.'&feedback='.urlencode($feedback));
 	}
 	$error_msg = _('Task failed');
-	session_redirect('plugins/'.$headermenu->name.'/?type=globaladmin&error_msg='.urlencode($error_msg));
+	session_redirect($redirect_url.'&error_msg='.urlencode($error_msg));
 }
 $warning_msg = _('Missing Link to be deleted.');
-session_redirect('plugins/'.$headermenu->name.'/?type=globaladmin&warning_msg='.urlencode($warning_msg));
+session_redirect($redirect_url.'&warning_msg='.urlencode($warning_msg));
diff --git a/src/plugins/headermenu/common/headermenuPlugin.class.php b/src/plugins/headermenu/common/headermenuPlugin.class.php
index e7335cb..b2fe5f7 100644
--- a/src/plugins/headermenu/common/headermenuPlugin.class.php
+++ b/src/plugins/headermenu/common/headermenuPlugin.class.php
@@ -62,7 +62,7 @@ class headermenuPlugin extends Plugin {
 				$project = group_get_object($group_id);
 				if ($project->usesPlugin($this->name)) {
 					echo '<p>'.util_make_link('/plugins/headermenu/?type=projectadmin&group_id='.$group_id,
-					     _('Project HeaderMenu Admin'), array('class' => 'tabtitle', 'title' => _('Add/Remove/Activate/Desactivate tabs'))) . '</p>';
+					     _('Project GroupMenu Admin'), array('class' => 'tabtitle', 'title' => _('Add/Remove/Activate/Desactivate tabs'))) . '</p>';
 				}
 				break;
 			}
@@ -311,6 +311,7 @@ class headermenuPlugin extends Plugin {
 			}
 			case 'projectadmin': {
 				html_use_jquery();
+				use_javascript('/js/sortable.js');
 				site_header(array('title'=>_('Project Menu Admin'), 'toptab' => ''));
 				$returned = true;
 				break;
diff --git a/src/plugins/headermenu/view/admin/viewProjectConfiguration.php b/src/plugins/headermenu/view/admin/viewProjectConfiguration.php
index 299cdee..0a04884 100644
--- a/src/plugins/headermenu/view/admin/viewProjectConfiguration.php
+++ b/src/plugins/headermenu/view/admin/viewProjectConfiguration.php
@@ -29,6 +29,36 @@ global $group_id;
 
 <?php
 $linksArray = $headermenu->getAvailableLinks('groupmenu');
+if (sizeof($linksArray)) {
+	echo $HTML->boxTop(_('Manage available links'));
+	$tabletop = array(_('Menu Type'), _('Displayed Name'), _('Description'), _('Status'), _('Actions'));
+	$classth = array('','','','','unsortable');
+	echo $HTML->listTableTop($tabletop, false, 'sortable_headermenu_listlinks', 'sortable', $classth);
+	foreach ($linksArray as $link) {
+		echo '<tr>';
+		if (strlen($link['url']) > 0) {
+			echo '<td>'._('URL').' ('.htmlspecialchars($link['url']).')</td>';
+		} else {
+			echo '<td>'._('static html code').'</td>';
+		}
+		echo '<td>'.htmlspecialchars($link['name']).'</td>';
+		echo '<td>'.htmlspecialchars($link['description']).'</td>';
+		if ($link['is_enable']) {
+			echo '<td>'.html_image('docman/validate.png', 22, 22, array('alt'=>_('link is on'), 'class'=>'tabtitle', 'title'=>_('link is on'))).'</td>';
+			echo '<td><a class="tabtitle-ne" title="'._('Desactivate this link').'" href="index.php?type=projectadmin&group_id='.$group_id.'&action=updateLinkStatus&linkid='.$link['id_headermenu'].'&linkstatus=0">'.html_image('docman/release-document.png', 22, 22, array('alt'=>_('Desactivate this link'))). '</a>';
+		} else {
+			echo '<td>'.html_image('docman/delete-directory.png', 22, 22, array('alt'=>_('link is off'), 'class'=>'tabtitle', 'title'=>_('link is off'))).'</td>';
+			echo '<td><a class="tabtitle-ne" title="'._('Activate this link').'" href="index.php?type=projectadmin&group_id='.$group_id.'&action=updateLinkStatus&linkid='.$link['id_headermenu'].'&linkstatus=1">'.html_image('docman/reserve-document.png', 22, 22, array('alt'=>_('Activate this link'))). '</a>';
+		}
+		echo '<a class="tabtitle-ne" title="'._('Edit this link').'" href="index.php?type=projectadmin&group_id='.$group_id.'&view=updateLinkValue&linkid='.$link['id_headermenu'].'">'.html_image('docman/edit-file.png',22,22, array('alt'=>_('Edit this link'))). '</a>';
+		echo '<a class="tabtitle-ne" title="'._('Delete this link').'" href="index.php?type=projectadmin&group_id='.$group_id.'&action=deleteLink&linkid='.$link['id_headermenu'].'">'.html_image('docman/trash-empty.png',22,22, array('alt'=>_('Delete this link'))). '</a>';
+		echo '</td>';
+		echo '</tr>';
+	}
+	echo $HTML->listTableBottom();
+	echo $HTML->boxBottom();
+	echo '</br>';
+}
 
 echo '<form method="POST" name="addLink" action="index.php?type=projectadmin&group_id='.$group_id.'&action=addLink">';
 echo '<table><tr>';
diff --git a/src/plugins/headermenu/www/index.php b/src/plugins/headermenu/www/index.php
index d0ea3eb..7418170 100644
--- a/src/plugins/headermenu/www/index.php
+++ b/src/plugins/headermenu/www/index.php
@@ -78,6 +78,7 @@ switch ($type) {
 		session_require_perm('project_admin', $group_id);
 		$action = getStringFromRequest('action');
 		$view = getStringFromRequest('view');
+
 		switch ($action) {
 			case 'addLink':
 			case 'updateLinkValue':

commit fa0d0f67cff1d7bb584eb7856724d1d856c8d9e4
Author: Franck Villaume <franck.villaume at trivialdev.com>
Date:   Sun Dec 30 19:22:55 2012 +0100

    support add link in groupmenu

diff --git a/src/plugins/headermenu/action/addLink.php b/src/plugins/headermenu/action/addLink.php
index 501348d..9143385 100644
--- a/src/plugins/headermenu/action/addLink.php
+++ b/src/plugins/headermenu/action/addLink.php
@@ -1,6 +1,6 @@
 <?php
 /**
- * headermenu plugin
+ * headermenu plugin : addLink action
  *
  * Copyright 2012, Franck Villaume - TrivialDev
  * http://fusionforge.org
@@ -22,60 +22,80 @@
  */
 
 global $headermenu;
+global $group_id;
 
-session_require_global_perm('forge_admin');
 $link = getStringFromRequest('link');
 $description = strip_tags(getStringFromRequest('description'));
 $name = strip_tags(getStringFromRequest('name'));
 $linkmenu = getStringFromRequest('linkmenu');
 $htmlcode = getStringFromRequest('htmlcode');
+$type = getStringFromRequest('type');
 
 if (!empty($name) && !empty($linkmenu)) {
 	switch ($linkmenu) {
-		case "headermenu": {
+		case 'headermenu': {
 			if (!empty($link)) {
 				if (util_check_url($link)) {
 					if ($headermenu->addLink($link, $name, $description, $linkmenu)) {
 						$feedback = _('Task succeeded.');
-						session_redirect('plugins/'.$headermenu->name.'/?type=globaladmin&feedback='.urlencode($feedback));
+						session_redirect('plugins/'.$headermenu->name.'/?type='.$type.'&feedback='.urlencode($feedback));
 					}
 					$error_msg = _('Task failed');
-					session_redirect('plugins/'.$headermenu->name.'/?type=globaladmin&error_msg='.urlencode($error_msg));
+					session_redirect('plugins/'.$headermenu->name.'/?type='.$type.'&error_msg='.urlencode($error_msg));
 				} else {
 					$error_msg = _('Provided Link is not a valid URL.');
-					session_redirect('plugins/'.$headermenu->name.'/?type=globaladmin&error_msg='.urlencode($error_msg));
+					session_redirect('plugins/'.$headermenu->name.'/?type='.$type.'&error_msg='.urlencode($error_msg));
 				}
 			}
 			$warning_msg = _('Missing Link URL.');
-			session_redirect('plugins/'.$headermenu->name.'/?type=globaladmin&warning_msg='.urlencode($warning_msg));
+			session_redirect('plugins/'.$headermenu->name.'/?type='.$type.'&warning_msg='.urlencode($warning_msg));
 			break;
 		}
-		case "outermenu": {
+		case 'outermenu': {
 			if (!empty($link)) {
 				if (util_check_url($link)) {
 					if ($headermenu->addLink($link, $name, $description, $linkmenu)) {
 						$feedback = _('Task succeeded.');
-						session_redirect('plugins/'.$headermenu->name.'/?type=globaladmin&feedback='.urlencode($feedback));
+						session_redirect('plugins/'.$headermenu->name.'/?type='.$type.'&feedback='.urlencode($feedback));
 					}
 					$error_msg = _('Task failed');
-					session_redirect('plugins/'.$headermenu->name.'/?type=globaladmin&error_msg='.urlencode($error_msg));
+					session_redirect('plugins/'.$headermenu->name.'/?type='.$type.'&error_msg='.urlencode($error_msg));
 				} else {
 					$error_msg = _('Provided Link is not a valid URL.');
-					session_redirect('plugins/'.$headermenu->name.'/?type=globaladmin&error_msg='.urlencode($error_msg));
+					session_redirect('plugins/'.$headermenu->name.'/?type='.$type.'&error_msg='.urlencode($error_msg));
 				}
 			}
 			if (!empty($htmlcode)) {
 				if ($headermenu->addLink('', $name, $description, $linkmenu, 'htmlcode', $htmlcode)) {
 					$feedback = _('Task succeeded.');
-					session_redirect('plugins/'.$headermenu->name.'/?type=globaladmin&feedback='.urlencode($feedback));
+					session_redirect('plugins/'.$headermenu->name.'/?type='.$type.'&feedback='.urlencode($feedback));
 				}
 				$error_msg = _('Task failed');
-				session_redirect('plugins/'.$headermenu->name.'/?type=globaladmin&error_msg='.urlencode($error_msg));
+				session_redirect('plugins/'.$headermenu->name.'/?type='.$type.'&error_msg='.urlencode($error_msg));
 			}
 			$warning_msg = _('Missing Link URL or Html Code.');
-			session_redirect('plugins/'.$headermenu->name.'/?type=globaladmin&warning_msg='.urlencode($warning_msg));
+			session_redirect('plugins/'.$headermenu->name.'/?type='.$type.'&warning_msg='.urlencode($warning_msg));
+		}
+		case 'groupmenu': {
+			if (!empty($link)) {
+				if (util_check_url($link)) {
+					if ($headermenu->addLink($link, $name, $description, $linkmenu)) {
+						$feedback = _('Task succeeded.');
+						session_redirect('plugins/'.$headermenu->name.'/?type='.$type.'&group_id='.$group_id.'&feedback='.urlencode($feedback));
+					}
+					$error_msg = _('Task failed');
+					session_redirect('plugins/'.$headermenu->name.'/?type='.$type.'&group_id='.$group_id.'&error_msg='.urlencode($error_msg));
+				} else {
+					$error_msg = _('Provided Link is not a valid URL.');
+					session_redirect('plugins/'.$headermenu->name.'/?type='.$type.'&group_id='.$group_id.'&error_msg='.urlencode($error_msg));
+				}
+			}
 		}
 	}
 }
 $warning_msg = _('No link to create or name missing.');
-session_redirect('plugins/'.$headermenu->name.'/?type=globaladmin&warning_msg='.urlencode($warning_msg));
+$url = 'plugins/'.$headermenu->name.'/?type='.$type;
+if (isset($group_id)) {
+	$url .= '&group_id='.$group_id;
+}
+session_redirect($url.'&warning_msg='.urlencode($warning_msg));
diff --git a/src/plugins/headermenu/common/headermenuPlugin.class.php b/src/plugins/headermenu/common/headermenuPlugin.class.php
index 7c6ee9c..e7335cb 100644
--- a/src/plugins/headermenu/common/headermenuPlugin.class.php
+++ b/src/plugins/headermenu/common/headermenuPlugin.class.php
@@ -27,9 +27,9 @@ class headermenuPlugin extends Plugin {
 	var $pageid;
 
 	function __construct() {
-		$this->Plugin() ;
-		$this->name = 'headermenu' ;
-		$this->text = 'headermenu' ;
+		$this->Plugin();
+		$this->name = 'headermenu';
+		$this->text = 'headermenu';
 		$this->_addHook('headermenu');
 		$this->_addHook('site_admin_option_hook');
 		$this->_addHook('outermenu');
@@ -39,7 +39,7 @@ class headermenuPlugin extends Plugin {
 		$this->_addHook('project_admin_plugins');
 	}
 
-	function CallHook ($hookname, &$params) {
+	function CallHook($hookname, &$params) {
 		switch ($hookname) {
 			case 'headermenu': {
 				$this->getHeaderLink();
@@ -332,6 +332,18 @@ class headermenuPlugin extends Plugin {
 	}
 
 	/**
+	 * getProjectAdminView - display the Project Admin View
+	 *
+	 * @return	bool	true
+	 */
+	function getProjectAdminView() {
+		global $gfplugins;
+		$user = session_get_user();
+		include $gfplugins.$this->name.'/view/admin/viewProjectConfiguration.php';
+		return true;
+	}
+
+	/**
 	 * getPluginDescription - display the description of this plugin in pluginman admin page
 	 *
 	 * @return	string	the description
diff --git a/src/plugins/headermenu/view/admin/viewGlobalConfiguration.php b/src/plugins/headermenu/view/admin/viewGlobalConfiguration.php
index f4b162c..eaa3252 100644
--- a/src/plugins/headermenu/view/admin/viewGlobalConfiguration.php
+++ b/src/plugins/headermenu/view/admin/viewGlobalConfiguration.php
@@ -1,6 +1,6 @@
 <?php
 /**
- * headermenuPlugin Class
+ * headermenu : viewGlobalConfiguration page
  *
  * Copyright 2012 Franck Villaume - TrivialDev
  * http://fusionforge.org
@@ -24,7 +24,6 @@
 global $HTML;
 global $headermenu;
 
-session_require_global_perm('forge_admin');
 ?>
 
 <script language="Javascript" type="text/javascript">//<![CDATA[
diff --git a/src/plugins/headermenu/view/admin/viewProjectConfiguration.php b/src/plugins/headermenu/view/admin/viewProjectConfiguration.php
new file mode 100644
index 0000000..299cdee
--- /dev/null
+++ b/src/plugins/headermenu/view/admin/viewProjectConfiguration.php
@@ -0,0 +1,49 @@
+<?php
+/**
+ * headermenu : viewProjectConfiguration page
+ *
+ * Copyright 2012 Franck Villaume - TrivialDev
+ * http://fusionforge.org
+ *
+ * This file is part of FusionForge. FusionForge is free software;
+ * you can redistribute it and/or modify it under the terms of the
+ * GNU General Public License as published by the Free Software
+ * Foundation; either version 2 of the Licence, or (at your option)
+ * any later version.
+ *
+ * FusionForge is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with FusionForge; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ */ 
+
+global $HTML;
+global $headermenu;
+global $group_id;
+
+?>
+
+<?php
+$linksArray = $headermenu->getAvailableLinks('groupmenu');
+
+echo '<form method="POST" name="addLink" action="index.php?type=projectadmin&group_id='.$group_id.'&action=addLink">';
+echo '<table><tr>';
+echo $HTML->boxTop(_('Add a new link'));
+echo '<td>'._('Displayed Name').'</td><td><input name="name" type="text" maxsize="255" /></td>';
+echo '</tr><tr>';
+echo '<td>'._('Description').'</td><td><input name="description" type="text" maxsize="255" /></td>';
+echo '</tr><tr>';
+echo '<tr id="urlcode" >';
+echo '<td>'._('URL').'</td><td><input name="link" type="text" maxsize="255" /></td>';
+echo '</tr><tr>';
+echo '<td>';
+echo '<input type="hidden" name="linkmenu" value="groupmenu" />';
+echo '<input type="submit" value="'. _('Add') .'" />';
+echo '</td>';
+echo $HTML->boxBottom();
+echo '</tr></table>';
+echo '</form>';
diff --git a/src/plugins/headermenu/www/index.php b/src/plugins/headermenu/www/index.php
index da2d981..d0ea3eb 100644
--- a/src/plugins/headermenu/www/index.php
+++ b/src/plugins/headermenu/www/index.php
@@ -1,6 +1,6 @@
 <?php
 /**
- * headermenu plugin
+ * headermenu plugin : index page
  *
  * Copyright 2012, Franck Villaume - TrivialDev
  * http://fusionforge.org
@@ -76,8 +76,29 @@ switch ($type) {
 		}
 		$group_id = getIntFromRequest('group_id');
 		session_require_perm('project_admin', $group_id);
+		$action = getStringFromRequest('action');
+		$view = getStringFromRequest('view');
+		switch ($action) {
+			case 'addLink':
+			case 'updateLinkValue':
+			case 'deleteLink':
+			case 'updateLinkStatus': {
+				global $gfplugins;
+				include($gfplugins.$headermenu->name.'/action/'.$action.'.php');
+				break;
+			}
+		}
 		$headermenu->getHeader($type);
-		
+		switch ($view) {
+			case 'updateLinkValue':
+				global $gfplugins;
+				include($gfplugins.$headermenu->name.'/view/admin/'.$view.'.php');
+				break;
+			default:
+				$headermenu->getProjectAdminView();
+				break;
+		}
+		break;
 	}
 }
 

commit 86e98658a8503aaad70fa83a817551621d5cd894
Author: Franck Villaume <franck.villaume at trivialdev.com>
Date:   Sun Dec 23 21:28:40 2012 +0100

    sync CHANGES

diff --git a/src/CHANGES b/src/CHANGES
index 97eddb7..630233a 100644
--- a/src/CHANGES
+++ b/src/CHANGES
@@ -15,7 +15,8 @@ FusionForge-5.3:
 * Docman: add report view as in FRS (TrivialDev)
 
 Plugins:
-* headermenu: new plugin to handle links in headermenu or outermenu (TrivialDev)
+* headermenu: new plugin to handle links in headermenu, outermenu & groupmenu
+              replace the old extratabs plugin (TrivialDev)
 * scmgit: add browsing capability for user personal repository (TrivialDev)
 * scmgit: basic activity support (TrivialDev).
 * scmgit: multiple repositories per project (developed for/sponsored by AdaCore)

commit 6d8f34ada705fdd2d80ee9c00b16e7fffc9dc1e4
Author: Franck Villaume <franck.villaume at trivialdev.com>
Date:   Sat Dec 22 20:28:10 2012 +0100

    start implement groupmenu hook in headermenu

diff --git a/src/plugins/headermenu/common/headermenuPlugin.class.php b/src/plugins/headermenu/common/headermenuPlugin.class.php
index 1d8fd29..7c6ee9c 100644
--- a/src/plugins/headermenu/common/headermenuPlugin.class.php
+++ b/src/plugins/headermenu/common/headermenuPlugin.class.php
@@ -33,6 +33,10 @@ class headermenuPlugin extends Plugin {
 		$this->_addHook('headermenu');
 		$this->_addHook('site_admin_option_hook');
 		$this->_addHook('outermenu');
+		$this->_addHook('groupisactivecheckbox'); // The "use ..." checkbox in editgroupinfo
+		$this->_addHook('groupisactivecheckboxpost');
+		$this->_addHook('groupmenu');
+		$this->_addHook('project_admin_plugins');
 	}
 
 	function CallHook ($hookname, &$params) {
@@ -49,6 +53,19 @@ class headermenuPlugin extends Plugin {
 				echo '<li>'.$this->getAdminOptionLink().'</li>';
 				break;
 			}
+			case 'groupmenu': {
+				$this->getGroupLink($params);
+				break;
+			}
+			case 'project_admin_plugins': {
+				$group_id = $params['group_id'];
+				$project = group_get_object($group_id);
+				if ($project->usesPlugin($this->name)) {
+					echo '<p>'.util_make_link('/plugins/headermenu/?type=projectadmin&group_id='.$group_id,
+					     _('Project HeaderMenu Admin'), array('class' => 'tabtitle', 'title' => _('Add/Remove/Activate/Desactivate tabs'))) . '</p>';
+				}
+				break;
+			}
 		}
 	}
 
@@ -104,6 +121,41 @@ class headermenuPlugin extends Plugin {
 	}
 
 	/**
+	 * getGroupLink - update the links before generate the tab.
+	 *
+	 * @param	array	hook params array
+	 * @return	bool	true...
+	 */
+	function getGroupLink($params) {
+		$availableLinks = $this->getAvailableLinks('groupmenu');
+		foreach ($availableLinks as $link) {
+			if ($link['is_enable']) {
+				switch ($link['linktype']) {
+					case 'url': {
+						$params['DIRS'][] = $link['url'];
+						$params['TITLES'][] = $link['name'];
+						$params['TOOLTIPS'][] = $link['description'];
+						break;
+					}
+					case 'htmlcode': {
+						$params['DIRS'][] = '/plugins/'.$this->name.'/?type=pageview&pageid='.$link['id_headermenu'];
+						$params['TITLES'][] = $link['name'];
+						$params['TOOLTIPS'][] = $link['description'];
+						break;
+					}
+					case 'iframe': {
+						$params['DIRS'][] = '/plugins/'.$this->name.'/?type=iframe&pageid='.$link['id_headermenu'];
+						$params['TITLES'][] = $link['name'];
+						$params['TOOLTIPS'][] = $link['description'];
+						break;
+					}
+				}
+			}
+		}
+		return true;
+	}
+
+	/**
 	 * getAvailableLinks - get all the links from the db of certain kind
 	 *
 	 * @param	string	the type of menu links search in db
@@ -222,6 +274,16 @@ class headermenuPlugin extends Plugin {
 	}
 
 	/**
+	 * iframeView - display the iframe
+	 *
+	 * @param	int	the iframe id
+	 * @return	string	the html code
+	 */
+	 function iframeView($pageid) {
+		return true;
+	 }
+
+	/**
 	 * getHeader - initialize header and js
 	 *
 	 * @param	string	type : user, project, globaladmin (aka group)
@@ -247,6 +309,12 @@ class headermenuPlugin extends Plugin {
 				$returned = true;
 				break;
 			}
+			case 'projectadmin': {
+				html_use_jquery();
+				site_header(array('title'=>_('Project Menu Admin'), 'toptab' => ''));
+				$returned = true;
+				break;
+			}
 		}
 		return $returned;
 	}
@@ -269,6 +337,6 @@ class headermenuPlugin extends Plugin {
 	 * @return	string	the description
 	 */
 	function getPluginDescription() {
-		return _('Get the ability to set new links next to the login menu (headermenu) or in the main menu (outermenu).');
+		return _('Get the ability to set new links next to the login menu (headermenu), in the main menu (outermenu) or in the project menu (groupmenu).');
 	}
 }
diff --git a/src/plugins/headermenu/www/index.php b/src/plugins/headermenu/www/index.php
index 2eaabcb..da2d981 100644
--- a/src/plugins/headermenu/www/index.php
+++ b/src/plugins/headermenu/www/index.php
@@ -70,6 +70,15 @@ switch ($type) {
 		echo $headermenu->pageView($pageid);
 		break;
 	}
+	case 'projectadmin': {
+		if (!session_loggedin()) {
+			exit_not_logged_in();
+		}
+		$group_id = getIntFromRequest('group_id');
+		session_require_perm('project_admin', $group_id);
+		$headermenu->getHeader($type);
+		
+	}
 }
 
 site_project_footer(array());

commit b8095e7efe4eb9f16b2e1d0188ebd515a5b3cd14
Merge: 687a997 fafb465
Author: Franck Villaume <franck.villaume at trivialdev.com>
Date:   Sat Jan 5 09:47:33 2013 +0100

    Merge remote-tracking branch 'upstream/master' into headermenu


commit 687a99794dae78f8f15f9549aba4aaf374ea5921
Author: Franck Villaume <franck.villaume at trivialdev.com>
Date:   Tue Jan 1 20:47:10 2013 +0100

    add notice and reorg display in global

diff --git a/src/plugins/headermenu/view/admin/viewGlobalConfiguration.php b/src/plugins/headermenu/view/admin/viewGlobalConfiguration.php
index eaa3252..9e622e1 100644
--- a/src/plugins/headermenu/view/admin/viewGlobalConfiguration.php
+++ b/src/plugins/headermenu/view/admin/viewGlobalConfiguration.php
@@ -36,16 +36,17 @@ jQuery(document).ready(function() {
 		inputHeader:	jQuery('#linkmenu_headermenu'),
 		inputOuter:	jQuery('#linkmenu_outermenu'),
 		trHtmlCode:	jQuery('#htmlcode'),
-		trUrlCode:	jQuery('#urlcode')
-    });
+		trUrlCode:	jQuery('#urlcode'),
+		tableTbodyLink:	jQuery('#sortable tbody')
+	});
 });
 
 //]]></script>
 
 <?php
-$linksArray = $headermenu->getAllAvailableLinks();
+$linksArray = $headermenu->getAvailableLinks('headermenu');
 if (sizeof($linksArray)) {
-	echo $HTML->boxTop(_('Manage available links'));
+	echo $HTML->boxTop(_('Manage available links in headermenu'));
 	$tabletop = array(_('Menu Location'), _('Menu Type'), _('Displayed Name'), _('Description'), _('Status'), _('Actions'));
 	$classth = array('', '','','','','unsortable');
 	echo $HTML->listTableTop($tabletop, false, 'sortable_headermenu_listlinks', 'sortable', $classth);
@@ -76,6 +77,39 @@ if (sizeof($linksArray)) {
 	echo '</br>';
 }
 
+$linksArray = $headermenu->getAvailableLinks('outermenu');
+if (sizeof($linksArray)) {
+	echo $HTML->boxTop(_('Manage available links in outermenu'));
+	$tabletop = array(_('Menu Location'), _('Menu Type'), _('Displayed Name'), _('Description'), _('Status'), _('Actions'));
+	$classth = array('', '','','','','unsortable');
+	echo $HTML->listTableTop($tabletop, false, 'sortable_outermenu_listlinks', 'sortable', $classth);
+	foreach ($linksArray as $link) {
+		echo '<tr>';
+		echo '<td>'.htmlspecialchars($link['linkmenu']).'</td>';
+		if (strlen($link['url']) > 0) {
+			echo '<td>'._('URL').' ('.htmlspecialchars($link['url']).')</td>';
+		} else {
+			echo '<td>'._('static html code').'</td>';
+		}
+		echo '<td>'.htmlspecialchars($link['name']).'</td>';
+		echo '<td>'.htmlspecialchars($link['description']).'</td>';
+		if ($link['is_enable']) {
+			echo '<td>'.html_image('docman/validate.png', 22, 22, array('alt'=>_('link is on'), 'class'=>'tabtitle', 'title'=>_('link is on'))).'</td>';
+			echo '<td><a class="tabtitle-ne" title="'._('Desactivate this link').'" href="index.php?type=globaladmin&action=updateLinkStatus&linkid='.$link['id_headermenu'].'&linkstatus=0">'.html_image('docman/release-document.png', 22, 22, array('alt'=>_('Desactivate this link'))). '</a>';
+		} else {
+			echo '<td>'.html_image('docman/delete-directory.png', 22, 22, array('alt'=>_('link is off'), 'class'=>'tabtitle', 'title'=>_('link is off'))).'</td>';
+			echo '<td><a class="tabtitle-ne" title="'._('Activate this link').'" href="index.php?type=globaladmin&action=updateLinkStatus&linkid='.$link['id_headermenu'].'&linkstatus=1">'.html_image('docman/reserve-document.png', 22, 22, array('alt'=>_('Activate this link'))). '</a>';
+		}
+		echo '<a class="tabtitle-ne" title="'._('Edit this link').'" href="index.php?type=globaladmin&view=updateLinkValue&linkid='.$link['id_headermenu'].'">'.html_image('docman/edit-file.png',22,22, array('alt'=>_('Edit this link'))). '</a>';
+		echo '<a class="tabtitle-ne" title="'._('Delete this link').'" href="index.php?type=globaladmin&action=deleteLink&linkid='.$link['id_headermenu'].'">'.html_image('docman/trash-empty.png',22,22, array('alt'=>_('Delete this link'))). '</a>';
+		echo '</td>';
+		echo '</tr>';
+	}
+	echo $HTML->listTableBottom();
+	echo $HTML->boxBottom();
+	echo '</br>';
+}
+
 echo '<form method="POST" name="addLink" action="index.php?type=globaladmin&action=addLink">';
 echo '<table><tr>';
 echo $HTML->boxTop(_('Add a new link'));
diff --git a/src/plugins/headermenu/view/admin/viewProjectConfiguration.php b/src/plugins/headermenu/view/admin/viewProjectConfiguration.php
index 1ad33f4..f200b60 100644
--- a/src/plugins/headermenu/view/admin/viewProjectConfiguration.php
+++ b/src/plugins/headermenu/view/admin/viewProjectConfiguration.php
@@ -46,12 +46,13 @@ jQuery(document).ready(function() {
 <?php
 $linksArray = $headermenu->getAvailableLinks('groupmenu');
 if (sizeof($linksArray)) {
+	echo '<p class="information">'. _('You can reorder links, just drag & drop rows in the table and save order.').'</p>';
 	echo $HTML->boxTop(_('Manage available links'));
-	$tabletop = array(_('Menu Type'), _('Displayed Name'), _('Description'), _('Status'), _('Actions'));
-	$classth = array('','','','','unsortable');
+	$tabletop = array(_('Order'), _('Menu Type'), _('Displayed Name'), _('Description'), _('Status'), _('Actions'));
+	$classth = array('', '','','','','unsortable');
 	echo $HTML->listTableTop($tabletop, false, 'sortable_headermenu_listlinks', 'sortable', $classth);
 	foreach ($linksArray as $link) {
-		echo '<tr>';
+		echo '<tr><td>'.$link['ordering'].'</td>';
 		if (strlen($link['url']) > 0) {
 			echo '<td>'._('URL');
 			if ($link['linktype'] == 'iframe') {

commit 9dfc706aae1b800bab11d0ee940e6f122d92453b
Author: Franck Villaume <franck.villaume at trivialdev.com>
Date:   Tue Jan 1 16:35:35 2013 +0100

    start implement reorder

diff --git a/src/plugins/headermenu/common/headermenuPlugin.class.php b/src/plugins/headermenu/common/headermenuPlugin.class.php
index 93efda2..6cc2c60 100644
--- a/src/plugins/headermenu/common/headermenuPlugin.class.php
+++ b/src/plugins/headermenu/common/headermenuPlugin.class.php
@@ -3,7 +3,7 @@
 /**
  * headermenuPlugin Class
  *
- * Copyright 2012 Franck Villaume - TrivialDev
+ * Copyright 2012-2013, Franck Villaume - TrivialDev
  * http://fusionforge.org
  *
  * This file is part of FusionForge. FusionForge is free software;
@@ -61,7 +61,7 @@ class headermenuPlugin extends Plugin {
 				$group_id = $params['group_id'];
 				$project = group_get_object($group_id);
 				if ($project->usesPlugin($this->name)) {
-					echo '<p>'.util_make_link('/plugins/headermenu/?type=projectadmin&group_id='.$group_id,
+					echo '<p>'.util_make_link('/plugins/'.$this->name.'/?type=projectadmin&group_id='.$group_id,
 					     _('Project GroupMenu Admin'), array('class' => 'tabtitle', 'title' => _('Add/Remove/Activate/Desactivate tabs'))) . '</p>';
 				}
 				break;
@@ -304,6 +304,7 @@ class headermenuPlugin extends Plugin {
 				global $gfwww;
 				require_once($gfwww.'admin/admin_utils.php');
 				html_use_jquery();
+				html_use_jqueryui();
 				use_javascript('scripts/HeaderMenuController.js');
 				use_javascript('/js/sortable.js');
 				site_admin_header(array('title'=>_('Site Global Menu Admin'), 'toptab' => ''));
@@ -315,18 +316,19 @@ class headermenuPlugin extends Plugin {
 				$link = $this->getLink($this->pageid);
 				$group_id = getIntFromRequest('group_id');
 				if ($group_id) {
-					$params['toptab'] = '/plugins/headermenu/?type='.$type.'&group_id='.$group_id.'&pageid='.$this->pageid;
+					$params['toptab'] = '/plugins/'.$this->name.'/?type='.$type.'&group_id='.$group_id.'&pageid='.$this->pageid;
 					$params['group'] = $group_id;
 					$params['title'] = $link['name'];
 					site_project_header($params);
 				} else {
-					site_header(array('title'=> $link['name'], 'toptab' => '/plugins/headermenu/?type='.$type.'&pageid='.$this->pageid));
+					site_header(array('title'=> $link['name'], 'toptab' => '/plugins/'.$this->name.'/?type='.$type.'&pageid='.$this->pageid));
 				}
 				$returned = true;
 				break;
 			}
 			case 'projectadmin': {
 				html_use_jquery();
+				html_use_jqueryui();
 				use_javascript('scripts/HeaderMenuController.js');
 				use_javascript('/js/sortable.js');
 				site_header(array('title'=>_('Project Menu Admin'), 'toptab' => ''));
diff --git a/src/plugins/headermenu/view/admin/viewProjectConfiguration.php b/src/plugins/headermenu/view/admin/viewProjectConfiguration.php
index 72c7018..1ad33f4 100644
--- a/src/plugins/headermenu/view/admin/viewProjectConfiguration.php
+++ b/src/plugins/headermenu/view/admin/viewProjectConfiguration.php
@@ -37,7 +37,8 @@ jQuery(document).ready(function() {
 		trHtmlCode:	jQuery('#htmlcode'),
 		trUrlCode:	jQuery('#urlcode'),
 		trIframeView:	jQuery('#iframe'),
-    });
+		tableTbodyLink:	jQuery('#sortable tbody')
+	});
 });
 
 //]]></script>
diff --git a/src/plugins/headermenu/www/scripts/HeaderMenuController.js b/src/plugins/headermenu/www/scripts/HeaderMenuController.js
index 84f2dce..eb11f3d 100644
--- a/src/plugins/headermenu/www/scripts/HeaderMenuController.js
+++ b/src/plugins/headermenu/www/scripts/HeaderMenuController.js
@@ -52,6 +52,9 @@ HeaderMenuController.prototype =
 		this.params.trHtmlCode.hide();
 		this.params.trUrlCode.show();
 		this.params.inputURL.attr('checked', 'checked');
+		if (typeof(this.params.tableTbodyLink) != 'undefined') {
+			this.params.tableTbodyLink.sortable();
+		}
 	},
 
 	htmlCodeView: function() {
@@ -80,6 +83,9 @@ GroupMenuController.prototype =
 		this.params.trHtmlCode.hide();
 		this.params.trUrlCode.show();
 		this.params.inputURL.attr('checked', 'checked');
+		if (typeof(this.params.tableTbodyLink) != 'undefined') {
+			this.params.tableTbodyLink.sortable();
+		}
 	},
 
 	htmlCodeView: function() {

commit d82bd7925756e9ccf1ef0dd11c526f873e1d48e3
Author: Franck Villaume <franck.villaume at trivialdev.com>
Date:   Tue Jan 1 15:01:46 2013 +0100

    make the update works

diff --git a/src/plugins/headermenu/action/updateLinkValue.php b/src/plugins/headermenu/action/updateLinkValue.php
index e9706ba..caf7bd9 100644
--- a/src/plugins/headermenu/action/updateLinkValue.php
+++ b/src/plugins/headermenu/action/updateLinkValue.php
@@ -23,7 +23,6 @@
 
 global $headermenu;
 
-session_require_global_perm('forge_admin');
 $idLink = getIntFromRequest('linkid');
 $link = getStringFromRequest('link');
 $name = strip_tags(getStringFromRequest('name'));
@@ -31,53 +30,55 @@ $description = strip_tags(getStringFromRequest('description'));
 $typemenu = getStringFromRequest('typemenu');
 $linkmenu = getStringFromRequest('linkmenu');
 $htmlcode = getStringFromRequest('htmlcode');
+$type = getStringFromRequest('type');
 
 if (!empty($idLink) && !empty($name)) {
 	switch ($linkmenu) {
-		case "headermenu": {
+		case 'headermenu': {
 			if (!empty($link)) {
 				if (util_check_url($link)) {
 					if ($headermenu->updateLink($idLink, $link, $name, $description, $linkmenu)) {
 						$feedback = _('Task succeeded.');
-						session_redirect('plugins/'.$headermenu->name.'/?type=globaladmin&feedback='.urlencode($feedback));
+						session_redirect('plugins/'.$headermenu->name.'/?type='.$type.'&feedback='.urlencode($feedback));
 					}
 					$error_msg = _('Task failed');
-					session_redirect('plugins/'.$headermenu->name.'/?type=globaladmin&error_msg='.urlencode($error_msg));
+					session_redirect('plugins/'.$headermenu->name.'/?type='.$type.'&error_msg='.urlencode($error_msg));
 				} else {
 					$error_msg = _('Provided Link is not a valid URL.');
-					session_redirect('plugins/'.$headermenu->name.'/?type=globaladmin&error_msg='.urlencode($error_msg));
+					session_redirect('plugins/'.$headermenu->name.'/?type='.$type.'&error_msg='.urlencode($error_msg));
 				}
 			}
 			$warning_msg = _('Missing Link URL.');
-			session_redirect('plugins/'.$headermenu->name.'/?type=globaladmin&warning_msg='.urlencode($warning_msg));
+			session_redirect('plugins/'.$headermenu->name.'/?type='.$type.'&warning_msg='.urlencode($warning_msg));
 			break;
 		}
-		case "outermenu": {
-			if (!empty($link) && $typemenu == 'url') {
+		case 'outermenu':
+		case 'groupmenu': {
+			if (!empty($link) && ($typemenu == 'url' || $typemenu == 'iframe')) {
 				if (util_check_url($link)) {
-					if ($headermenu->updateLink($idLink, $link, $name, $description, $linkmenu)) {
+					if ($headermenu->updateLink($idLink, $link, $name, $description, $linkmenu, $typemenu)) {
 						$feedback = _('Task succeeded.');
-						session_redirect('plugins/'.$headermenu->name.'/?type=globaladmin&feedback='.urlencode($feedback));
+						session_redirect('plugins/'.$headermenu->name.'/?type='.$type.'&feedback='.urlencode($feedback));
 					}
 					$error_msg = _('Task failed');
-					session_redirect('plugins/'.$headermenu->name.'/?type=globaladmin&error_msg='.urlencode($error_msg));
+					session_redirect('plugins/'.$headermenu->name.'/?type='.$type.'&error_msg='.urlencode($error_msg));
 				} else {
 					$error_msg = _('Provided Link is not a valid URL.');
-					session_redirect('plugins/'.$headermenu->name.'/?type=globaladmin&error_msg='.urlencode($error_msg));
+					session_redirect('plugins/'.$headermenu->name.'/?type='.$type.'&error_msg='.urlencode($error_msg));
 				}
 			}
 			if (!empty($htmlcode) && $typemenu == 'htmlcode') {
 				if ($headermenu->updateLink($idLink, '', $name, $description, $linkmenu, 'htmlcode', $htmlcode)) {
 					$feedback = _('Task succeeded.');
-					session_redirect('plugins/'.$headermenu->name.'/?type=globaladmin&feedback='.urlencode($feedback));
+					session_redirect('plugins/'.$headermenu->name.'/?type='.$type.'&feedback='.urlencode($feedback));
 				}
 				$error_msg = _('Task failed');
-				session_redirect('plugins/'.$headermenu->name.'/?type=globaladmin&error_msg='.urlencode($error_msg));
+				session_redirect('plugins/'.$headermenu->name.'/?type='.$type.'&error_msg='.urlencode($error_msg));
 			}
 			$warning_msg = _('Missing Link URL or Html Code.');
-			session_redirect('plugins/'.$headermenu->name.'/?type=globaladmin&warning_msg='.urlencode($warning_msg));
+			session_redirect('plugins/'.$headermenu->name.'/?type='.$type.'&warning_msg='.urlencode($warning_msg));
 		}
 	}
 }
 $warning_msg = _('No link to update or name missing.');
-session_redirect('plugins/'.$headermenu->name.'/?type=globaladmin&warning_msg='.urlencode($warning_msg));
+session_redirect('plugins/'.$headermenu->name.'/?type='.$type.'&warning_msg='.urlencode($warning_msg));
diff --git a/src/plugins/headermenu/view/admin/updateLinkValue.php b/src/plugins/headermenu/view/admin/updateLinkValue.php
index 6edb149..4b2e884 100644
--- a/src/plugins/headermenu/view/admin/updateLinkValue.php
+++ b/src/plugins/headermenu/view/admin/updateLinkValue.php
@@ -63,15 +63,14 @@ if (is_array($linkValues)) {
 		echo html_build_radio_buttons_from_arrays($vals, $texts, $select_name, $linkValues['linkmenu'], false);
 		echo '</td>';
 		echo '</tr><tr>';
+		$texts = array('URL', 'New Page');
+		$vals = array('url', 'htmlcode');
 	}
 	echo '<td>'._('Menu Type').'</td><td>';
 	if ($type == 'projectadmin') {
 		$texts = array('URL', 'URL as iframe', 'New Page');
 		$vals = array('url', 'iframe', 'htmlcode');
-	}
-	if ($type == 'globaladmin') {
-		$texts = array('URL', 'New Page');
-		$vals = array('url', 'htmlcode');
+		echo '<input type="hidden" name="linkmenu" value="groupmenu" />';
 	}
 	$select_name = 'typemenu';
 	echo html_build_radio_buttons_from_arrays($vals, $texts, $select_name, $linkValues['linktype'], false);

commit 7269f4e7f0a482451a39f18fd5d344c7464f7f97
Author: Franck Villaume <franck.villaume at trivialdev.com>
Date:   Tue Jan 1 14:44:52 2013 +0100

    support for edit link in groupmenu

diff --git a/src/plugins/headermenu/action/addLink.php b/src/plugins/headermenu/action/addLink.php
index 665e460..d6333d9 100644
--- a/src/plugins/headermenu/action/addLink.php
+++ b/src/plugins/headermenu/action/addLink.php
@@ -2,7 +2,7 @@
 /**
  * headermenu plugin : addLink action
  *
- * Copyright 2012, Franck Villaume - TrivialDev
+ * Copyright 2012-2013, Franck Villaume - TrivialDev
  * http://fusionforge.org
  *
  * This file is part of FusionForge. FusionForge is free software;
@@ -61,7 +61,7 @@ if (!empty($name) && !empty($linkmenu)) {
 		case 'groupmenu': {
 			if (!empty($link)) {
 				if (util_check_url($link)) {
-					$linktype = 'URL';
+					$linktype = 'url';
 					if ($iframed) {
 						$linktype = 'iframe';
 					}
diff --git a/src/plugins/headermenu/db/20121231-reorderentry.sql b/src/plugins/headermenu/db/20121231-reorderentry.sql
index 2f1dccf..865b851 100644
--- a/src/plugins/headermenu/db/20121231-reorderentry.sql
+++ b/src/plugins/headermenu/db/20121231-reorderentry.sql
@@ -1 +1,2 @@
+UPDATE plugin_headermenu SET linktype = 'url' where linktype = 'URL';
 ALTER TABLE plugin_headermenu ADD COLUMN ordering integer DEFAULT 0 NOT NULL;
diff --git a/src/plugins/headermenu/view/admin/updateLinkValue.php b/src/plugins/headermenu/view/admin/updateLinkValue.php
index 1209aa8..6edb149 100644
--- a/src/plugins/headermenu/view/admin/updateLinkValue.php
+++ b/src/plugins/headermenu/view/admin/updateLinkValue.php
@@ -2,7 +2,7 @@
 /**
  * headermenuPlugin Class
  *
- * Copyright 2012 Franck Villaume - TrivialDev
+ * Copyright 2012-2013, Franck Villaume - TrivialDev
  * http://fusionforge.org
  *
  * This file is part of FusionForge. FusionForge is free software;
@@ -23,8 +23,8 @@
 
 global $HTML;
 global $headermenu;
+global $type;
 
-session_require_global_perm('forge_admin');
 $linkId = getIntFromRequest('linkid');
 ?>
 
@@ -35,6 +35,7 @@ jQuery(document).ready(function() {
 	controllerHeaderMenu = new EditHeaderMenuController({
 		inputHtmlCode:	jQuery('#typemenu_htmlcode'),
 		inputURL:	jQuery('#typemenu_url'),
+		inputURLIframe:	jQuery('#typemenu_iframe'),
 		inputHeader:	jQuery('#linkmenu_headermenu'),
 		inputOuter:	jQuery('#linkmenu_outermenu'),
 		trHtmlCode:	jQuery('#htmlcode'),
@@ -47,23 +48,31 @@ jQuery(document).ready(function() {
 <?php
 $linkValues = $headermenu->getLink($linkId);
 if (is_array($linkValues)) {
-	echo '<form method="POST" name="updateLink" action="index.php?type=globaladmin&action=updateLinkValue">';
+	echo '<form method="POST" name="updateLink" action="index.php?type='.$type.'&action=updateLinkValue">';
 	echo '<table><tr>';
 	echo $HTML->boxTop(_('Update this link'));
 	echo '<td>'._('Displayed Name').'</td><td><input name="name" type="text" maxsize="255" value="'.$linkValues['name'].'" /></td>';
 	echo '</tr><tr>';
 	echo '<td>'._('Description').'</td><td><input name="description" type="text" maxsize="255" value="'.$linkValues['description'].'" /></td>';
 	echo '</tr><tr>';
-	echo '<td>'._('Menu Location').'</td><td>';
-	$vals = array('headermenu', 'outermenu');
-	$texts = array('headermenu', 'outermenu');
-	$select_name = 'linkmenu';
-	echo html_build_radio_buttons_from_arrays($vals, $texts, $select_name, $linkValues['linkmenu'], false);
-	echo '</td>';
-	echo '</tr><tr>';
+	if ($type == 'globaladmin') {
+		echo '<td>'._('Menu Location').'</td><td>';
+		$vals = array('headermenu', 'outermenu');
+		$texts = array('headermenu', 'outermenu');
+		$select_name = 'linkmenu';
+		echo html_build_radio_buttons_from_arrays($vals, $texts, $select_name, $linkValues['linkmenu'], false);
+		echo '</td>';
+		echo '</tr><tr>';
+	}
 	echo '<td>'._('Menu Type').'</td><td>';
-	$texts = array('URL', 'New Page');
-	$vals = array('url', 'htmlcode');
+	if ($type == 'projectadmin') {
+		$texts = array('URL', 'URL as iframe', 'New Page');
+		$vals = array('url', 'iframe', 'htmlcode');
+	}
+	if ($type == 'globaladmin') {
+		$texts = array('URL', 'New Page');
+		$vals = array('url', 'htmlcode');
+	}
 	$select_name = 'typemenu';
 	echo html_build_radio_buttons_from_arrays($vals, $texts, $select_name, $linkValues['linktype'], false);
 	echo '</td>';
@@ -81,20 +90,18 @@ if (is_array($linkValues)) {
 		echo '<textarea name="htmlcode" rows="5" cols="80">'.$body.'</textarea>';
 	}
 	unset($GLOBALS['editor_was_set_up']);
-	echo '</td></tr><tr id="urlcode" >';
-	echo '<td>'._('URL').'</td><td><input name="link" type="text" maxsize="255" /></td>';
-	echo '</tr><tr id="urlcode"  style="display:none" >';
+	echo '</td></tr><tr id="urlcode"  style="display:none" >';
 	echo '<td>'._('URL').'</td><td><input name="link" type="text" maxsize="255" value="'.$linkValues['url'].'" /></td>';
 	echo '</tr><tr>';
 	echo '<td>';
 	echo '<input type="hidden" name="linkid" value="'.$linkId.'" />';
 	echo '<input type="submit" value="'. _('Update') .'" />';
-	echo '<a href="/plugins/'.$headermenu->name.'/?type=globaladmin"><input type="button" value="'. _('Cancel') .'" /></a>';
+	echo '<a href="/plugins/'.$headermenu->name.'/?type='.$type.'"><input type="button" value="'. _('Cancel') .'" /></a>';
 	echo '</td>';
 	echo $HTML->boxBottom();
 	echo '</tr></table>';
 	echo '</form>';
 } else {
 	$error_msg = _('Cannot retrieve value for this link:').' '.$linkId;
-	session_redirect('plugins/'.$headermenu->name.'/?type=globaladmin&error_msg='.urlencode($error_msg));
+	session_redirect('plugins/'.$headermenu->name.'/?type='.$type.'&error_msg='.urlencode($error_msg));
 }
diff --git a/src/plugins/headermenu/www/scripts/HeaderMenuController.js b/src/plugins/headermenu/www/scripts/HeaderMenuController.js
index 68aee35..84f2dce 100644
--- a/src/plugins/headermenu/www/scripts/HeaderMenuController.js
+++ b/src/plugins/headermenu/www/scripts/HeaderMenuController.js
@@ -1,7 +1,7 @@
 /**
  * headerMenu Plugin Js Controller
  *
- * Copyright 2012, Franck Villaume - TrivialDev
+ * Copyright 2012-2013, Franck Villaume - TrivialDev
  * http://fusionforge.org
  *
  * This file is part of FusionForge. FusionForge is free software;
@@ -104,8 +104,15 @@ EditHeaderMenuController.prototype =
 	bindControls: function() {
 		this.params.inputHtmlCode.click(jQuery.proxy(this, "htmlCodeView"));
 		this.params.inputURL.click(jQuery.proxy(this, "htmlUrlView"));
-		this.params.inputOuter.click(jQuery.proxy(this, "inputHtmlCodeView"));
-		this.params.inputHeader.click(jQuery.proxy(this, "headerView"));
+		if (typeof(this.params.inputOuter) != 'undefined') {
+			this.params.inputOuter.click(jQuery.proxy(this, "inputHtmlCodeView"));
+		}
+		if (typeof(this.params.inputHeader) != 'undefined') {
+			this.params.inputHeader.click(jQuery.proxy(this, "headerView"));
+		}
+		if (typeof(this.params.inputURLIframe) != 'undefined') {
+			this.params.inputURLIframe.click(jQuery.proxy(this, "htmlUrlView"));
+		}
 	},
 
 	initializeView: function() {
@@ -120,6 +127,12 @@ EditHeaderMenuController.prototype =
 			this.params.trHtmlCode.hide();
 			this.params.trUrlCode.show();
 		}
+		if (typeof(this.params.inputURLIframe) != 'undefined') {
+			if (this.params.inputURLIframe.attr("checked")) {
+				this.params.trHtmlCode.hide();
+				this.params.trUrlCode.show();
+			}
+		}
 	},
 
 	htmlUrlView: function() {

commit 891bbfe5190026f00fc79ebec3f55506dd7339a5
Author: Franck Villaume <franck.villaume at trivialdev.com>
Date:   Mon Dec 31 18:10:59 2012 +0100

    add new column: ordering, to support order between link

diff --git a/src/plugins/headermenu/db/20121231-reorderentry.sql b/src/plugins/headermenu/db/20121231-reorderentry.sql
new file mode 100644
index 0000000..2f1dccf
--- /dev/null
+++ b/src/plugins/headermenu/db/20121231-reorderentry.sql
@@ -0,0 +1 @@
+ALTER TABLE plugin_headermenu ADD COLUMN ordering integer DEFAULT 0 NOT NULL;

commit 224a9968b217024983e6de3a3daada4b9b53c33f
Author: Franck Villaume <franck.villaume at trivialdev.com>
Date:   Mon Dec 31 17:56:38 2012 +0100

    add support for iframe in groupmenu

diff --git a/src/plugins/headermenu/action/addLink.php b/src/plugins/headermenu/action/addLink.php
index a31060f..665e460 100644
--- a/src/plugins/headermenu/action/addLink.php
+++ b/src/plugins/headermenu/action/addLink.php
@@ -30,6 +30,7 @@ $name = strip_tags(getStringFromRequest('name'));
 $linkmenu = getStringFromRequest('linkmenu');
 $htmlcode = getStringFromRequest('htmlcode');
 $type = getStringFromRequest('type');
+$iframed = getIntFromRequest('iframeview');
 
 $redirect_url = 'plugins/'.$headermenu->name.'/?type='.$type;
 if (isset($group_id) && $group_id) {
@@ -60,7 +61,11 @@ if (!empty($name) && !empty($linkmenu)) {
 		case 'groupmenu': {
 			if (!empty($link)) {
 				if (util_check_url($link)) {
-					if ($headermenu->addLink($link, $name, $description, $linkmenu)) {
+					$linktype = 'URL';
+					if ($iframed) {
+						$linktype = 'iframe';
+					}
+					if ($headermenu->addLink($link, $name, $description, $linkmenu, $linktype)) {
 						$feedback = _('Task succeeded.');
 						session_redirect($redirect_url.'&feedback='.urlencode($feedback));
 					}
diff --git a/src/plugins/headermenu/common/headermenuPlugin.class.php b/src/plugins/headermenu/common/headermenuPlugin.class.php
index d9debd0..93efda2 100644
--- a/src/plugins/headermenu/common/headermenuPlugin.class.php
+++ b/src/plugins/headermenu/common/headermenuPlugin.class.php
@@ -147,10 +147,10 @@ class headermenuPlugin extends Plugin {
 						break;
 					}
 					case 'iframe': {
-						$params['DIRS'][] = '/plugins/'.$this->name.'/?type=iframe&group_id='.$params['group'].'&pageid='.$link['id_headermenu'];
+						$params['DIRS'][] = '/plugins/'.$this->name.'/?type=iframeview&group_id='.$params['group'].'&pageid='.$link['id_headermenu'];
 						$params['TITLES'][] = $link['name'];
 						$params['TOOLTIPS'][] = $link['description'];
-						if ($params['toptab'] == '/plugins/'.$this->name.'/?type=iframe&group_id='.$params['group'].'&pageid='.$link['id_headermenu']) {
+						if ($params['toptab'] == '/plugins/'.$this->name.'/?type=iframeview&group_id='.$params['group'].'&pageid='.$link['id_headermenu']) {
 							$params['selected'] = (count($params['DIRS'])-1);
 						}
 						break;
@@ -286,7 +286,8 @@ class headermenuPlugin extends Plugin {
 	 * @return	string	the html code
 	 */
 	 function iframeView($pageid) {
-		return true;
+		$link = $this->getLink($pageid);
+		return '<iframe src="'.rtrim($link['url'],'/').'" frameborder="0" height="600px" width="100%"></iframe>';
 	 }
 
 	/**
@@ -309,16 +310,17 @@ class headermenuPlugin extends Plugin {
 				$returned = true;
 				break;
 			}
-			case 'pageview': {
+			case 'pageview':
+			case 'iframeview': {
 				$link = $this->getLink($this->pageid);
 				$group_id = getIntFromRequest('group_id');
 				if ($group_id) {
-					$params['toptab'] = '/plugins/headermenu/?type=pageview&group_id='.$group_id.'&pageid='.$this->pageid;
+					$params['toptab'] = '/plugins/headermenu/?type='.$type.'&group_id='.$group_id.'&pageid='.$this->pageid;
 					$params['group'] = $group_id;
 					$params['title'] = $link['name'];
 					site_project_header($params);
 				} else {
-					site_header(array('title'=> $link['name'], 'toptab' => '/plugins/headermenu/?type=pageview&pageid='.$this->pageid));
+					site_header(array('title'=> $link['name'], 'toptab' => '/plugins/headermenu/?type='.$type.'&pageid='.$this->pageid));
 				}
 				$returned = true;
 				break;
diff --git a/src/plugins/headermenu/view/admin/viewProjectConfiguration.php b/src/plugins/headermenu/view/admin/viewProjectConfiguration.php
index 08a5691..72c7018 100644
--- a/src/plugins/headermenu/view/admin/viewProjectConfiguration.php
+++ b/src/plugins/headermenu/view/admin/viewProjectConfiguration.php
@@ -35,7 +35,8 @@ jQuery(document).ready(function() {
 		inputHtmlCode:	jQuery('#typemenu_htmlcode'),
 		inputURL:	jQuery('#typemenu_url'),
 		trHtmlCode:	jQuery('#htmlcode'),
-		trUrlCode:	jQuery('#urlcode')
+		trUrlCode:	jQuery('#urlcode'),
+		trIframeView:	jQuery('#iframe'),
     });
 });
 
@@ -51,7 +52,11 @@ if (sizeof($linksArray)) {
 	foreach ($linksArray as $link) {
 		echo '<tr>';
 		if (strlen($link['url']) > 0) {
-			echo '<td>'._('URL').' ('.htmlspecialchars($link['url']).')</td>';
+			echo '<td>'._('URL');
+			if ($link['linktype'] == 'iframe') {
+				echo ' '._('displayed as iframe');
+			}
+			echo ' ('.htmlspecialchars($link['url']).')</td>';
 		} else {
 			echo '<td>'._('static html code').'</td>';
 		}
@@ -103,6 +108,8 @@ if (!$GLOBALS['editor_was_set_up']) {
 unset($GLOBALS['editor_was_set_up']);
 echo '</td></tr><tr id="urlcode" >';
 echo '<td>'._('URL').'</td><td><input name="link" type="text" maxsize="255" /></td>';
+echo '</td></tr><tr id="iframe" >';
+echo '<td colspan="2" ><input name="iframeview" type="checkbox" value="1" />Display URL as iframe.</td>';
 echo '</tr><tr>';
 echo '<td>';
 echo '<input type="hidden" name="linkmenu" value="groupmenu" />';
diff --git a/src/plugins/headermenu/www/index.php b/src/plugins/headermenu/www/index.php
index 7418170..1f053ea 100644
--- a/src/plugins/headermenu/www/index.php
+++ b/src/plugins/headermenu/www/index.php
@@ -70,6 +70,13 @@ switch ($type) {
 		echo $headermenu->pageView($pageid);
 		break;
 	}
+	case 'iframeview': {
+		$pageid = getIntFromRequest('pageid');
+		$headermenu->pageid = $pageid;
+		$headermenu->getHeader($type);
+		echo $headermenu->iframeView($pageid);
+		break;
+	}
 	case 'projectadmin': {
 		if (!session_loggedin()) {
 			exit_not_logged_in();
diff --git a/src/plugins/headermenu/www/scripts/HeaderMenuController.js b/src/plugins/headermenu/www/scripts/HeaderMenuController.js
index 8d91e36..68aee35 100644
--- a/src/plugins/headermenu/www/scripts/HeaderMenuController.js
+++ b/src/plugins/headermenu/www/scripts/HeaderMenuController.js
@@ -85,11 +85,13 @@ GroupMenuController.prototype =
 	htmlCodeView: function() {
 		this.params.trHtmlCode.show();
 		this.params.trUrlCode.hide();
+		this.params.trIframeView.hide();
 	},
 
 	htmlUrlView: function() {
 		this.params.trHtmlCode.hide();
 		this.params.trUrlCode.show();
+		this.params.trIframeView.show();
 	},
 
 	inputHtmlCodeView: function() {

commit 0c7306f17fcd2fd7ca0c17eed7581664b02e436f
Author: Franck Villaume <franck.villaume at trivialdev.com>
Date:   Mon Dec 31 15:23:15 2012 +0100

    fix selected entry in html code for groupmenu

diff --git a/src/plugins/headermenu/common/headermenuPlugin.class.php b/src/plugins/headermenu/common/headermenuPlugin.class.php
index 2aa7f74..d9debd0 100644
--- a/src/plugins/headermenu/common/headermenuPlugin.class.php
+++ b/src/plugins/headermenu/common/headermenuPlugin.class.php
@@ -141,12 +141,18 @@ class headermenuPlugin extends Plugin {
 						$params['DIRS'][] = '/plugins/'.$this->name.'/?type=pageview&group_id='.$params['group'].'&pageid='.$link['id_headermenu'];
 						$params['TITLES'][] = $link['name'];
 						$params['TOOLTIPS'][] = $link['description'];
+						if ($params['toptab'] == '/plugins/'.$this->name.'/?type=pageview&group_id='.$params['group'].'&pageid='.$link['id_headermenu']) {
+							$params['selected'] = (count($params['DIRS'])-1);
+						}
 						break;
 					}
 					case 'iframe': {
 						$params['DIRS'][] = '/plugins/'.$this->name.'/?type=iframe&group_id='.$params['group'].'&pageid='.$link['id_headermenu'];
 						$params['TITLES'][] = $link['name'];
 						$params['TOOLTIPS'][] = $link['description'];
+						if ($params['toptab'] == '/plugins/'.$this->name.'/?type=iframe&group_id='.$params['group'].'&pageid='.$link['id_headermenu']) {
+							$params['selected'] = (count($params['DIRS'])-1);
+						}
 						break;
 					}
 				}
@@ -307,11 +313,9 @@ class headermenuPlugin extends Plugin {
 				$link = $this->getLink($this->pageid);
 				$group_id = getIntFromRequest('group_id');
 				if ($group_id) {
-					$params['toptab'] = '/plugins/headermenu/?type=pageview&group_id='.$group_id.'pageid='.$this->pageid;
+					$params['toptab'] = '/plugins/headermenu/?type=pageview&group_id='.$group_id.'&pageid='.$this->pageid;
 					$params['group'] = $group_id;
 					$params['title'] = $link['name'];
-					$params['pagename'] = $link['name'];
-					$params['sectionvals'] = array(group_getname($group_id));
 					site_project_header($params);
 				} else {
 					site_header(array('title'=> $link['name'], 'toptab' => '/plugins/headermenu/?type=pageview&pageid='.$this->pageid));

commit cc69f88e9f1c13853fee77a949a9a200834346e5
Author: Franck Villaume <franck.villaume at trivialdev.com>
Date:   Mon Dec 31 11:27:22 2012 +0100

    add support for html page in groupmenu

diff --git a/src/plugins/headermenu/action/addLink.php b/src/plugins/headermenu/action/addLink.php
index 2bbb69c..a31060f 100644
--- a/src/plugins/headermenu/action/addLink.php
+++ b/src/plugins/headermenu/action/addLink.php
@@ -56,7 +56,8 @@ if (!empty($name) && !empty($linkmenu)) {
 			session_redirect($redirect_url.'&warning_msg='.urlencode($warning_msg));
 			break;
 		}
-		case 'outermenu': {
+		case 'outermenu':
+		case 'groupmenu': {
 			if (!empty($link)) {
 				if (util_check_url($link)) {
 					if ($headermenu->addLink($link, $name, $description, $linkmenu)) {
@@ -81,21 +82,6 @@ if (!empty($name) && !empty($linkmenu)) {
 			$warning_msg = _('Missing Link URL or Html Code.');
 			session_redirect($redirect_url.'&warning_msg='.urlencode($warning_msg));
 		}
-		case 'groupmenu': {
-			if (!empty($link)) {
-				if (util_check_url($link)) {
-					if ($headermenu->addLink($link, $name, $description, $linkmenu)) {
-						$feedback = _('Task succeeded.');
-						session_redirect($redirect_url.'&feedback='.urlencode($feedback));
-					}
-					$error_msg = _('Task failed');
-					session_redirect($redirect_url.'&error_msg='.urlencode($error_msg));
-				} else {
-					$error_msg = _('Provided Link is not a valid URL.');
-					session_redirect($redirect_url.'&error_msg='.urlencode($error_msg));
-				}
-			}
-		}
 	}
 }
 $warning_msg = _('No link to create or name missing.');
diff --git a/src/plugins/headermenu/common/headermenuPlugin.class.php b/src/plugins/headermenu/common/headermenuPlugin.class.php
index 4a9b0da..2aa7f74 100644
--- a/src/plugins/headermenu/common/headermenuPlugin.class.php
+++ b/src/plugins/headermenu/common/headermenuPlugin.class.php
@@ -138,13 +138,13 @@ class headermenuPlugin extends Plugin {
 						break;
 					}
 					case 'htmlcode': {
-						$params['DIRS'][] = '/plugins/'.$this->name.'/?type=pageview&pageid='.$link['id_headermenu'];
+						$params['DIRS'][] = '/plugins/'.$this->name.'/?type=pageview&group_id='.$params['group'].'&pageid='.$link['id_headermenu'];
 						$params['TITLES'][] = $link['name'];
 						$params['TOOLTIPS'][] = $link['description'];
 						break;
 					}
 					case 'iframe': {
-						$params['DIRS'][] = '/plugins/'.$this->name.'/?type=iframe&pageid='.$link['id_headermenu'];
+						$params['DIRS'][] = '/plugins/'.$this->name.'/?type=iframe&group_id='.$params['group'].'&pageid='.$link['id_headermenu'];
 						$params['TITLES'][] = $link['name'];
 						$params['TOOLTIPS'][] = $link['description'];
 						break;
@@ -305,7 +305,17 @@ class headermenuPlugin extends Plugin {
 			}
 			case 'pageview': {
 				$link = $this->getLink($this->pageid);
-				site_header(array('title'=> $link['name'], 'toptab' => '/plugins/headermenu/?pageview&pageid='.$this->pageid));
+				$group_id = getIntFromRequest('group_id');
+				if ($group_id) {
+					$params['toptab'] = '/plugins/headermenu/?type=pageview&group_id='.$group_id.'pageid='.$this->pageid;
+					$params['group'] = $group_id;
+					$params['title'] = $link['name'];
+					$params['pagename'] = $link['name'];
+					$params['sectionvals'] = array(group_getname($group_id));
+					site_project_header($params);
+				} else {
+					site_header(array('title'=> $link['name'], 'toptab' => '/plugins/headermenu/?type=pageview&pageid='.$this->pageid));
+				}
 				$returned = true;
 				break;
 			}

commit 7dcccf40805eb273d6ddb5db0409ee63590d1c5e
Author: Franck Villaume <franck.villaume at trivialdev.com>
Date:   Sun Dec 30 20:38:42 2012 +0100

    start htmlcode support in groupmenu

diff --git a/src/plugins/headermenu/action/updateLinkStatus.php b/src/plugins/headermenu/action/updateLinkStatus.php
index ff482e8..03cce2a 100644
--- a/src/plugins/headermenu/action/updateLinkStatus.php
+++ b/src/plugins/headermenu/action/updateLinkStatus.php
@@ -22,18 +22,23 @@
  */
 
 global $headermenu;
+global $type;
+global $group_id;
 
-session_require_global_perm('forge_admin');
 $idLink = getIntFromRequest('linkid');
 $linkStatus = getIntFromRequest('linkstatus');
+$redirect_url = 'plugins/'.$headermenu->name.'/?type='.$type;
+if (isset($group_id) && $group_id) {
+	$redirect_url .= '&group_id='.$group_id;
+}
 
 if (!empty($idLink)) {
 	if ($headermenu->updateLinkStatus($idLink, $linkStatus)) {
 		$feedback = _('Link Status updated');
-		session_redirect('plugins/'.$headermenu->name.'/?type=globaladmin&feedback='.urlencode($feedback));
+		session_redirect($redirect_url.'&feedback='.urlencode($feedback));
 	}
 	$error_msg = _('Task failed');
-	session_redirect('plugins/'.$headermenu->name.'/?type=globaladmin&error_msg='.urlencode($error_msg));
+	session_redirect($redirect_url.'&error_msg='.urlencode($error_msg));
 }
 $warning_msg = _('Missing Link or status to be updated.');
-session_redirect('plugins/'.$headermenu->name.'/?type=globaladmin&warning_msg='.urlencode($warning_msg));
+session_redirect($redirect_url.'&warning_msg='.urlencode($warning_msg));
diff --git a/src/plugins/headermenu/common/headermenuPlugin.class.php b/src/plugins/headermenu/common/headermenuPlugin.class.php
index b2fe5f7..4a9b0da 100644
--- a/src/plugins/headermenu/common/headermenuPlugin.class.php
+++ b/src/plugins/headermenu/common/headermenuPlugin.class.php
@@ -311,6 +311,7 @@ class headermenuPlugin extends Plugin {
 			}
 			case 'projectadmin': {
 				html_use_jquery();
+				use_javascript('scripts/HeaderMenuController.js');
 				use_javascript('/js/sortable.js');
 				site_header(array('title'=>_('Project Menu Admin'), 'toptab' => ''));
 				$returned = true;
diff --git a/src/plugins/headermenu/view/admin/viewProjectConfiguration.php b/src/plugins/headermenu/view/admin/viewProjectConfiguration.php
index 0a04884..08a5691 100644
--- a/src/plugins/headermenu/view/admin/viewProjectConfiguration.php
+++ b/src/plugins/headermenu/view/admin/viewProjectConfiguration.php
@@ -27,6 +27,20 @@ global $group_id;
 
 ?>
 
+<script language="Javascript" type="text/javascript">//<![CDATA[
+var controllerGroupMenu;
+
+jQuery(document).ready(function() {
+	controllerGroupMenu = new GroupMenuController({
+		inputHtmlCode:	jQuery('#typemenu_htmlcode'),
+		inputURL:	jQuery('#typemenu_url'),
+		trHtmlCode:	jQuery('#htmlcode'),
+		trUrlCode:	jQuery('#urlcode')
+    });
+});
+
+//]]></script>
+
 <?php
 $linksArray = $headermenu->getAvailableLinks('groupmenu');
 if (sizeof($linksArray)) {
@@ -67,7 +81,27 @@ echo '<td>'._('Displayed Name').'</td><td><input name="name" type="text" maxsize
 echo '</tr><tr>';
 echo '<td>'._('Description').'</td><td><input name="description" type="text" maxsize="255" /></td>';
 echo '</tr><tr>';
-echo '<tr id="urlcode" >';
+echo '<td>'._('Menu Type').'</td><td>';
+$texts = array('URL', 'New Page');
+$vals = array('url', 'htmlcode');
+$select_name = 'typemenu';
+echo html_build_radio_buttons_from_arrays($vals, $texts, $select_name, 'url', false);
+echo '</td>';
+echo '</tr><tr id="htmlcode" style="display:none">';
+echo '<td>'._('Your HTML Code.').'</td><td>';
+$GLOBALS['editor_was_set_up'] = false;
+$body = _('Just paste your code here...');
+$params['name'] = 'htmlcode';
+$params['body'] = $body;
+$params['width'] = "800";
+$params['height'] = "500";
+$params['user_id'] = user_getid();
+plugin_hook("text_editor", $params);
+if (!$GLOBALS['editor_was_set_up']) {
+	echo '<textarea name="htmlcode" rows="5" cols="80">'.$body.'</textarea>';
+}
+unset($GLOBALS['editor_was_set_up']);
+echo '</td></tr><tr id="urlcode" >';
 echo '<td>'._('URL').'</td><td><input name="link" type="text" maxsize="255" /></td>';
 echo '</tr><tr>';
 echo '<td>';
diff --git a/src/plugins/headermenu/www/scripts/HeaderMenuController.js b/src/plugins/headermenu/www/scripts/HeaderMenuController.js
index ef9a7ed..8d91e36 100644
--- a/src/plugins/headermenu/www/scripts/HeaderMenuController.js
+++ b/src/plugins/headermenu/www/scripts/HeaderMenuController.js
@@ -32,6 +32,12 @@ HeaderMenuController = function(params) {
 	this.initializeView();
 };
 
+GroupMenuController = function(params) {
+	this.params = params;
+	this.bindControls();
+	this.initializeView();
+};
+
 HeaderMenuController.prototype =
 {
 	bindControls: function() {
@@ -63,6 +69,34 @@ HeaderMenuController.prototype =
 	}
 };
 
+GroupMenuController.prototype =
+{
+	bindControls: function() {
+		this.params.inputHtmlCode.click(jQuery.proxy(this, "htmlCodeView"));
+		this.params.inputURL.click(jQuery.proxy(this, "htmlUrlView"));
+	},
+
+	initializeView: function() {
+		this.params.trHtmlCode.hide();
+		this.params.trUrlCode.show();
+		this.params.inputURL.attr('checked', 'checked');
+	},
+
+	htmlCodeView: function() {
+		this.params.trHtmlCode.show();
+		this.params.trUrlCode.hide();
+	},
+
+	htmlUrlView: function() {
+		this.params.trHtmlCode.hide();
+		this.params.trUrlCode.show();
+	},
+
+	inputHtmlCodeView: function() {
+		this.params.inputHtmlCode.prop('disabled', false);
+	}
+};
+
 EditHeaderMenuController.prototype =
 {
 	bindControls: function() {

commit f5c6dc80afa6c3c7a100af72e570b53d5c3db232
Author: Franck Villaume <franck.villaume at trivialdev.com>
Date:   Sun Dec 30 19:56:25 2012 +0100

    support delete link in groupmenu

diff --git a/src/plugins/headermenu/action/addLink.php b/src/plugins/headermenu/action/addLink.php
index 9143385..2bbb69c 100644
--- a/src/plugins/headermenu/action/addLink.php
+++ b/src/plugins/headermenu/action/addLink.php
@@ -31,6 +31,11 @@ $linkmenu = getStringFromRequest('linkmenu');
 $htmlcode = getStringFromRequest('htmlcode');
 $type = getStringFromRequest('type');
 
+$redirect_url = 'plugins/'.$headermenu->name.'/?type='.$type;
+if (isset($group_id) && $group_id) {
+	$redirect_url .= '&group_id='.$group_id;
+}
+
 if (!empty($name) && !empty($linkmenu)) {
 	switch ($linkmenu) {
 		case 'headermenu': {
@@ -38,17 +43,17 @@ if (!empty($name) && !empty($linkmenu)) {
 				if (util_check_url($link)) {
 					if ($headermenu->addLink($link, $name, $description, $linkmenu)) {
 						$feedback = _('Task succeeded.');
-						session_redirect('plugins/'.$headermenu->name.'/?type='.$type.'&feedback='.urlencode($feedback));
+						session_redirect($redirect_url.'&feedback='.urlencode($feedback));
 					}
 					$error_msg = _('Task failed');
-					session_redirect('plugins/'.$headermenu->name.'/?type='.$type.'&error_msg='.urlencode($error_msg));
+					session_redirect($redirect_url.'&error_msg='.urlencode($error_msg));
 				} else {
 					$error_msg = _('Provided Link is not a valid URL.');
-					session_redirect('plugins/'.$headermenu->name.'/?type='.$type.'&error_msg='.urlencode($error_msg));
+					session_redirect($redirect_url.'&error_msg='.urlencode($error_msg));
 				}
 			}
 			$warning_msg = _('Missing Link URL.');
-			session_redirect('plugins/'.$headermenu->name.'/?type='.$type.'&warning_msg='.urlencode($warning_msg));
+			session_redirect($redirect_url.'&warning_msg='.urlencode($warning_msg));
 			break;
 		}
 		case 'outermenu': {
@@ -56,46 +61,42 @@ if (!empty($name) && !empty($linkmenu)) {
 				if (util_check_url($link)) {
 					if ($headermenu->addLink($link, $name, $description, $linkmenu)) {
 						$feedback = _('Task succeeded.');
-						session_redirect('plugins/'.$headermenu->name.'/?type='.$type.'&feedback='.urlencode($feedback));
+						session_redirect($redirect_url.'&feedback='.urlencode($feedback));
 					}
 					$error_msg = _('Task failed');
-					session_redirect('plugins/'.$headermenu->name.'/?type='.$type.'&error_msg='.urlencode($error_msg));
+					session_redirect($redirect_url.'&error_msg='.urlencode($error_msg));
 				} else {
 					$error_msg = _('Provided Link is not a valid URL.');
-					session_redirect('plugins/'.$headermenu->name.'/?type='.$type.'&error_msg='.urlencode($error_msg));
+					session_redirect($redirect_url.'&error_msg='.urlencode($error_msg));
 				}
 			}
 			if (!empty($htmlcode)) {
 				if ($headermenu->addLink('', $name, $description, $linkmenu, 'htmlcode', $htmlcode)) {
 					$feedback = _('Task succeeded.');
-					session_redirect('plugins/'.$headermenu->name.'/?type='.$type.'&feedback='.urlencode($feedback));
+					session_redirect($redirect_url.'&feedback='.urlencode($feedback));
 				}
 				$error_msg = _('Task failed');
-				session_redirect('plugins/'.$headermenu->name.'/?type='.$type.'&error_msg='.urlencode($error_msg));
+				session_redirect($redirect_url.'&error_msg='.urlencode($error_msg));
 			}
 			$warning_msg = _('Missing Link URL or Html Code.');
-			session_redirect('plugins/'.$headermenu->name.'/?type='.$type.'&warning_msg='.urlencode($warning_msg));
+			session_redirect($redirect_url.'&warning_msg='.urlencode($warning_msg));
 		}
 		case 'groupmenu': {
 			if (!empty($link)) {
 				if (util_check_url($link)) {
 					if ($headermenu->addLink($link, $name, $description, $linkmenu)) {
 						$feedback = _('Task succeeded.');
-						session_redirect('plugins/'.$headermenu->name.'/?type='.$type.'&group_id='.$group_id.'&feedback='.urlencode($feedback));
+						session_redirect($redirect_url.'&feedback='.urlencode($feedback));
 					}
 					$error_msg = _('Task failed');
-					session_redirect('plugins/'.$headermenu->name.'/?type='.$type.'&group_id='.$group_id.'&error_msg='.urlencode($error_msg));
+					session_redirect($redirect_url.'&error_msg='.urlencode($error_msg));
 				} else {
 					$error_msg = _('Provided Link is not a valid URL.');
-					session_redirect('plugins/'.$headermenu->name.'/?type='.$type.'&group_id='.$group_id.'&error_msg='.urlencode($error_msg));
+					session_redirect($redirect_url.'&error_msg='.urlencode($error_msg));
 				}
 			}
 		}
 	}
 }
 $warning_msg = _('No link to create or name missing.');
-$url = 'plugins/'.$headermenu->name.'/?type='.$type;
-if (isset($group_id)) {
-	$url .= '&group_id='.$group_id;
-}
-session_redirect($url.'&warning_msg='.urlencode($warning_msg));
+session_redirect($redirect_url.'&warning_msg='.urlencode($warning_msg));
diff --git a/src/plugins/headermenu/action/deleteLink.php b/src/plugins/headermenu/action/deleteLink.php
index 4859571..8cf9ecc 100644
--- a/src/plugins/headermenu/action/deleteLink.php
+++ b/src/plugins/headermenu/action/deleteLink.php
@@ -22,17 +22,22 @@
  */
 
 global $headermenu;
+global $type;
+global $group_id;
 
-session_require_global_perm('forge_admin');
 $idLink = getIntFromRequest('linkid');
+$redirect_url = 'plugins/'.$headermenu->name.'/?type='.$type;
+if (isset($group_id) && $group_id) {
+	$redirect_url .= '&group_id='.$group_id;
+}
 
 if (!empty($idLink)) {
 	if ($headermenu->deleteLink($idLink)) {
 		$feedback = _('Link deleted');
-		session_redirect('plugins/'.$headermenu->name.'/?type=globaladmin&feedback='.urlencode($feedback));
+		session_redirect($redirect_url.'&feedback='.urlencode($feedback));
 	}
 	$error_msg = _('Task failed');
-	session_redirect('plugins/'.$headermenu->name.'/?type=globaladmin&error_msg='.urlencode($error_msg));
+	session_redirect($redirect_url.'&error_msg='.urlencode($error_msg));
 }
 $warning_msg = _('Missing Link to be deleted.');
-session_redirect('plugins/'.$headermenu->name.'/?type=globaladmin&warning_msg='.urlencode($warning_msg));
+session_redirect($redirect_url.'&warning_msg='.urlencode($warning_msg));
diff --git a/src/plugins/headermenu/common/headermenuPlugin.class.php b/src/plugins/headermenu/common/headermenuPlugin.class.php
index e7335cb..b2fe5f7 100644
--- a/src/plugins/headermenu/common/headermenuPlugin.class.php
+++ b/src/plugins/headermenu/common/headermenuPlugin.class.php
@@ -62,7 +62,7 @@ class headermenuPlugin extends Plugin {
 				$project = group_get_object($group_id);
 				if ($project->usesPlugin($this->name)) {
 					echo '<p>'.util_make_link('/plugins/headermenu/?type=projectadmin&group_id='.$group_id,
-					     _('Project HeaderMenu Admin'), array('class' => 'tabtitle', 'title' => _('Add/Remove/Activate/Desactivate tabs'))) . '</p>';
+					     _('Project GroupMenu Admin'), array('class' => 'tabtitle', 'title' => _('Add/Remove/Activate/Desactivate tabs'))) . '</p>';
 				}
 				break;
 			}
@@ -311,6 +311,7 @@ class headermenuPlugin extends Plugin {
 			}
 			case 'projectadmin': {
 				html_use_jquery();
+				use_javascript('/js/sortable.js');
 				site_header(array('title'=>_('Project Menu Admin'), 'toptab' => ''));
 				$returned = true;
 				break;
diff --git a/src/plugins/headermenu/view/admin/viewProjectConfiguration.php b/src/plugins/headermenu/view/admin/viewProjectConfiguration.php
index 299cdee..0a04884 100644
--- a/src/plugins/headermenu/view/admin/viewProjectConfiguration.php
+++ b/src/plugins/headermenu/view/admin/viewProjectConfiguration.php
@@ -29,6 +29,36 @@ global $group_id;
 
 <?php
 $linksArray = $headermenu->getAvailableLinks('groupmenu');
+if (sizeof($linksArray)) {
+	echo $HTML->boxTop(_('Manage available links'));
+	$tabletop = array(_('Menu Type'), _('Displayed Name'), _('Description'), _('Status'), _('Actions'));
+	$classth = array('','','','','unsortable');
+	echo $HTML->listTableTop($tabletop, false, 'sortable_headermenu_listlinks', 'sortable', $classth);
+	foreach ($linksArray as $link) {
+		echo '<tr>';
+		if (strlen($link['url']) > 0) {
+			echo '<td>'._('URL').' ('.htmlspecialchars($link['url']).')</td>';
+		} else {
+			echo '<td>'._('static html code').'</td>';
+		}
+		echo '<td>'.htmlspecialchars($link['name']).'</td>';
+		echo '<td>'.htmlspecialchars($link['description']).'</td>';
+		if ($link['is_enable']) {
+			echo '<td>'.html_image('docman/validate.png', 22, 22, array('alt'=>_('link is on'), 'class'=>'tabtitle', 'title'=>_('link is on'))).'</td>';
+			echo '<td><a class="tabtitle-ne" title="'._('Desactivate this link').'" href="index.php?type=projectadmin&group_id='.$group_id.'&action=updateLinkStatus&linkid='.$link['id_headermenu'].'&linkstatus=0">'.html_image('docman/release-document.png', 22, 22, array('alt'=>_('Desactivate this link'))). '</a>';
+		} else {
+			echo '<td>'.html_image('docman/delete-directory.png', 22, 22, array('alt'=>_('link is off'), 'class'=>'tabtitle', 'title'=>_('link is off'))).'</td>';
+			echo '<td><a class="tabtitle-ne" title="'._('Activate this link').'" href="index.php?type=projectadmin&group_id='.$group_id.'&action=updateLinkStatus&linkid='.$link['id_headermenu'].'&linkstatus=1">'.html_image('docman/reserve-document.png', 22, 22, array('alt'=>_('Activate this link'))). '</a>';
+		}
+		echo '<a class="tabtitle-ne" title="'._('Edit this link').'" href="index.php?type=projectadmin&group_id='.$group_id.'&view=updateLinkValue&linkid='.$link['id_headermenu'].'">'.html_image('docman/edit-file.png',22,22, array('alt'=>_('Edit this link'))). '</a>';
+		echo '<a class="tabtitle-ne" title="'._('Delete this link').'" href="index.php?type=projectadmin&group_id='.$group_id.'&action=deleteLink&linkid='.$link['id_headermenu'].'">'.html_image('docman/trash-empty.png',22,22, array('alt'=>_('Delete this link'))). '</a>';
+		echo '</td>';
+		echo '</tr>';
+	}
+	echo $HTML->listTableBottom();
+	echo $HTML->boxBottom();
+	echo '</br>';
+}
 
 echo '<form method="POST" name="addLink" action="index.php?type=projectadmin&group_id='.$group_id.'&action=addLink">';
 echo '<table><tr>';
diff --git a/src/plugins/headermenu/www/index.php b/src/plugins/headermenu/www/index.php
index d0ea3eb..7418170 100644
--- a/src/plugins/headermenu/www/index.php
+++ b/src/plugins/headermenu/www/index.php
@@ -78,6 +78,7 @@ switch ($type) {
 		session_require_perm('project_admin', $group_id);
 		$action = getStringFromRequest('action');
 		$view = getStringFromRequest('view');
+
 		switch ($action) {
 			case 'addLink':
 			case 'updateLinkValue':

commit b41d7debabd7b193cc82ba6ec3fc2552d20d7737
Author: Franck Villaume <franck.villaume at trivialdev.com>
Date:   Sun Dec 30 19:22:55 2012 +0100

    support add link in groupmenu

diff --git a/src/plugins/headermenu/action/addLink.php b/src/plugins/headermenu/action/addLink.php
index 501348d..9143385 100644
--- a/src/plugins/headermenu/action/addLink.php
+++ b/src/plugins/headermenu/action/addLink.php
@@ -1,6 +1,6 @@
 <?php
 /**
- * headermenu plugin
+ * headermenu plugin : addLink action
  *
  * Copyright 2012, Franck Villaume - TrivialDev
  * http://fusionforge.org
@@ -22,60 +22,80 @@
  */
 
 global $headermenu;
+global $group_id;
 
-session_require_global_perm('forge_admin');
 $link = getStringFromRequest('link');
 $description = strip_tags(getStringFromRequest('description'));
 $name = strip_tags(getStringFromRequest('name'));
 $linkmenu = getStringFromRequest('linkmenu');
 $htmlcode = getStringFromRequest('htmlcode');
+$type = getStringFromRequest('type');
 
 if (!empty($name) && !empty($linkmenu)) {
 	switch ($linkmenu) {
-		case "headermenu": {
+		case 'headermenu': {
 			if (!empty($link)) {
 				if (util_check_url($link)) {
 					if ($headermenu->addLink($link, $name, $description, $linkmenu)) {
 						$feedback = _('Task succeeded.');
-						session_redirect('plugins/'.$headermenu->name.'/?type=globaladmin&feedback='.urlencode($feedback));
+						session_redirect('plugins/'.$headermenu->name.'/?type='.$type.'&feedback='.urlencode($feedback));
 					}
 					$error_msg = _('Task failed');
-					session_redirect('plugins/'.$headermenu->name.'/?type=globaladmin&error_msg='.urlencode($error_msg));
+					session_redirect('plugins/'.$headermenu->name.'/?type='.$type.'&error_msg='.urlencode($error_msg));
 				} else {
 					$error_msg = _('Provided Link is not a valid URL.');
-					session_redirect('plugins/'.$headermenu->name.'/?type=globaladmin&error_msg='.urlencode($error_msg));
+					session_redirect('plugins/'.$headermenu->name.'/?type='.$type.'&error_msg='.urlencode($error_msg));
 				}
 			}
 			$warning_msg = _('Missing Link URL.');
-			session_redirect('plugins/'.$headermenu->name.'/?type=globaladmin&warning_msg='.urlencode($warning_msg));
+			session_redirect('plugins/'.$headermenu->name.'/?type='.$type.'&warning_msg='.urlencode($warning_msg));
 			break;
 		}
-		case "outermenu": {
+		case 'outermenu': {
 			if (!empty($link)) {
 				if (util_check_url($link)) {
 					if ($headermenu->addLink($link, $name, $description, $linkmenu)) {
 						$feedback = _('Task succeeded.');
-						session_redirect('plugins/'.$headermenu->name.'/?type=globaladmin&feedback='.urlencode($feedback));
+						session_redirect('plugins/'.$headermenu->name.'/?type='.$type.'&feedback='.urlencode($feedback));
 					}
 					$error_msg = _('Task failed');
-					session_redirect('plugins/'.$headermenu->name.'/?type=globaladmin&error_msg='.urlencode($error_msg));
+					session_redirect('plugins/'.$headermenu->name.'/?type='.$type.'&error_msg='.urlencode($error_msg));
 				} else {
 					$error_msg = _('Provided Link is not a valid URL.');
-					session_redirect('plugins/'.$headermenu->name.'/?type=globaladmin&error_msg='.urlencode($error_msg));
+					session_redirect('plugins/'.$headermenu->name.'/?type='.$type.'&error_msg='.urlencode($error_msg));
 				}
 			}
 			if (!empty($htmlcode)) {
 				if ($headermenu->addLink('', $name, $description, $linkmenu, 'htmlcode', $htmlcode)) {
 					$feedback = _('Task succeeded.');
-					session_redirect('plugins/'.$headermenu->name.'/?type=globaladmin&feedback='.urlencode($feedback));
+					session_redirect('plugins/'.$headermenu->name.'/?type='.$type.'&feedback='.urlencode($feedback));
 				}
 				$error_msg = _('Task failed');
-				session_redirect('plugins/'.$headermenu->name.'/?type=globaladmin&error_msg='.urlencode($error_msg));
+				session_redirect('plugins/'.$headermenu->name.'/?type='.$type.'&error_msg='.urlencode($error_msg));
 			}
 			$warning_msg = _('Missing Link URL or Html Code.');
-			session_redirect('plugins/'.$headermenu->name.'/?type=globaladmin&warning_msg='.urlencode($warning_msg));
+			session_redirect('plugins/'.$headermenu->name.'/?type='.$type.'&warning_msg='.urlencode($warning_msg));
+		}
+		case 'groupmenu': {
+			if (!empty($link)) {
+				if (util_check_url($link)) {
+					if ($headermenu->addLink($link, $name, $description, $linkmenu)) {
+						$feedback = _('Task succeeded.');
+						session_redirect('plugins/'.$headermenu->name.'/?type='.$type.'&group_id='.$group_id.'&feedback='.urlencode($feedback));
+					}
+					$error_msg = _('Task failed');
+					session_redirect('plugins/'.$headermenu->name.'/?type='.$type.'&group_id='.$group_id.'&error_msg='.urlencode($error_msg));
+				} else {
+					$error_msg = _('Provided Link is not a valid URL.');
+					session_redirect('plugins/'.$headermenu->name.'/?type='.$type.'&group_id='.$group_id.'&error_msg='.urlencode($error_msg));
+				}
+			}
 		}
 	}
 }
 $warning_msg = _('No link to create or name missing.');
-session_redirect('plugins/'.$headermenu->name.'/?type=globaladmin&warning_msg='.urlencode($warning_msg));
+$url = 'plugins/'.$headermenu->name.'/?type='.$type;
+if (isset($group_id)) {
+	$url .= '&group_id='.$group_id;
+}
+session_redirect($url.'&warning_msg='.urlencode($warning_msg));
diff --git a/src/plugins/headermenu/common/headermenuPlugin.class.php b/src/plugins/headermenu/common/headermenuPlugin.class.php
index 7c6ee9c..e7335cb 100644
--- a/src/plugins/headermenu/common/headermenuPlugin.class.php
+++ b/src/plugins/headermenu/common/headermenuPlugin.class.php
@@ -27,9 +27,9 @@ class headermenuPlugin extends Plugin {
 	var $pageid;
 
 	function __construct() {
-		$this->Plugin() ;
-		$this->name = 'headermenu' ;
-		$this->text = 'headermenu' ;
+		$this->Plugin();
+		$this->name = 'headermenu';
+		$this->text = 'headermenu';
 		$this->_addHook('headermenu');
 		$this->_addHook('site_admin_option_hook');
 		$this->_addHook('outermenu');
@@ -39,7 +39,7 @@ class headermenuPlugin extends Plugin {
 		$this->_addHook('project_admin_plugins');
 	}
 
-	function CallHook ($hookname, &$params) {
+	function CallHook($hookname, &$params) {
 		switch ($hookname) {
 			case 'headermenu': {
 				$this->getHeaderLink();
@@ -332,6 +332,18 @@ class headermenuPlugin extends Plugin {
 	}
 
 	/**
+	 * getProjectAdminView - display the Project Admin View
+	 *
+	 * @return	bool	true
+	 */
+	function getProjectAdminView() {
+		global $gfplugins;
+		$user = session_get_user();
+		include $gfplugins.$this->name.'/view/admin/viewProjectConfiguration.php';
+		return true;
+	}
+
+	/**
 	 * getPluginDescription - display the description of this plugin in pluginman admin page
 	 *
 	 * @return	string	the description
diff --git a/src/plugins/headermenu/view/admin/viewGlobalConfiguration.php b/src/plugins/headermenu/view/admin/viewGlobalConfiguration.php
index f4b162c..eaa3252 100644
--- a/src/plugins/headermenu/view/admin/viewGlobalConfiguration.php
+++ b/src/plugins/headermenu/view/admin/viewGlobalConfiguration.php
@@ -1,6 +1,6 @@
 <?php
 /**
- * headermenuPlugin Class
+ * headermenu : viewGlobalConfiguration page
  *
  * Copyright 2012 Franck Villaume - TrivialDev
  * http://fusionforge.org
@@ -24,7 +24,6 @@
 global $HTML;
 global $headermenu;
 
-session_require_global_perm('forge_admin');
 ?>
 
 <script language="Javascript" type="text/javascript">//<![CDATA[
diff --git a/src/plugins/headermenu/view/admin/viewProjectConfiguration.php b/src/plugins/headermenu/view/admin/viewProjectConfiguration.php
new file mode 100644
index 0000000..299cdee
--- /dev/null
+++ b/src/plugins/headermenu/view/admin/viewProjectConfiguration.php
@@ -0,0 +1,49 @@
+<?php
+/**
+ * headermenu : viewProjectConfiguration page
+ *
+ * Copyright 2012 Franck Villaume - TrivialDev
+ * http://fusionforge.org
+ *
+ * This file is part of FusionForge. FusionForge is free software;
+ * you can redistribute it and/or modify it under the terms of the
+ * GNU General Public License as published by the Free Software
+ * Foundation; either version 2 of the Licence, or (at your option)
+ * any later version.
+ *
+ * FusionForge is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with FusionForge; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ */ 
+
+global $HTML;
+global $headermenu;
+global $group_id;
+
+?>
+
+<?php
+$linksArray = $headermenu->getAvailableLinks('groupmenu');
+
+echo '<form method="POST" name="addLink" action="index.php?type=projectadmin&group_id='.$group_id.'&action=addLink">';
+echo '<table><tr>';
+echo $HTML->boxTop(_('Add a new link'));
+echo '<td>'._('Displayed Name').'</td><td><input name="name" type="text" maxsize="255" /></td>';
+echo '</tr><tr>';
+echo '<td>'._('Description').'</td><td><input name="description" type="text" maxsize="255" /></td>';
+echo '</tr><tr>';
+echo '<tr id="urlcode" >';
+echo '<td>'._('URL').'</td><td><input name="link" type="text" maxsize="255" /></td>';
+echo '</tr><tr>';
+echo '<td>';
+echo '<input type="hidden" name="linkmenu" value="groupmenu" />';
+echo '<input type="submit" value="'. _('Add') .'" />';
+echo '</td>';
+echo $HTML->boxBottom();
+echo '</tr></table>';
+echo '</form>';
diff --git a/src/plugins/headermenu/www/index.php b/src/plugins/headermenu/www/index.php
index da2d981..d0ea3eb 100644
--- a/src/plugins/headermenu/www/index.php
+++ b/src/plugins/headermenu/www/index.php
@@ -1,6 +1,6 @@
 <?php
 /**
- * headermenu plugin
+ * headermenu plugin : index page
  *
  * Copyright 2012, Franck Villaume - TrivialDev
  * http://fusionforge.org
@@ -76,8 +76,29 @@ switch ($type) {
 		}
 		$group_id = getIntFromRequest('group_id');
 		session_require_perm('project_admin', $group_id);
+		$action = getStringFromRequest('action');
+		$view = getStringFromRequest('view');
+		switch ($action) {
+			case 'addLink':
+			case 'updateLinkValue':
+			case 'deleteLink':
+			case 'updateLinkStatus': {
+				global $gfplugins;
+				include($gfplugins.$headermenu->name.'/action/'.$action.'.php');
+				break;
+			}
+		}
 		$headermenu->getHeader($type);
-		
+		switch ($view) {
+			case 'updateLinkValue':
+				global $gfplugins;
+				include($gfplugins.$headermenu->name.'/view/admin/'.$view.'.php');
+				break;
+			default:
+				$headermenu->getProjectAdminView();
+				break;
+		}
+		break;
 	}
 }
 

commit 6adf0b8d6a4feff910a2d0a70aaa028cab476e46
Author: Franck Villaume <franck.villaume at trivialdev.com>
Date:   Sun Dec 23 21:28:40 2012 +0100

    sync CHANGES

diff --git a/src/CHANGES b/src/CHANGES
index 97eddb7..630233a 100644
--- a/src/CHANGES
+++ b/src/CHANGES
@@ -15,7 +15,8 @@ FusionForge-5.3:
 * Docman: add report view as in FRS (TrivialDev)
 
 Plugins:
-* headermenu: new plugin to handle links in headermenu or outermenu (TrivialDev)
+* headermenu: new plugin to handle links in headermenu, outermenu & groupmenu
+              replace the old extratabs plugin (TrivialDev)
 * scmgit: add browsing capability for user personal repository (TrivialDev)
 * scmgit: basic activity support (TrivialDev).
 * scmgit: multiple repositories per project (developed for/sponsored by AdaCore)

commit daed2417204c4366af722e84303ac39f882cef6b
Author: Franck Villaume <franck.villaume at trivialdev.com>
Date:   Sat Dec 22 20:28:10 2012 +0100

    start implement groupmenu hook in headermenu

diff --git a/src/plugins/headermenu/common/headermenuPlugin.class.php b/src/plugins/headermenu/common/headermenuPlugin.class.php
index 1d8fd29..7c6ee9c 100644
--- a/src/plugins/headermenu/common/headermenuPlugin.class.php
+++ b/src/plugins/headermenu/common/headermenuPlugin.class.php
@@ -33,6 +33,10 @@ class headermenuPlugin extends Plugin {
 		$this->_addHook('headermenu');
 		$this->_addHook('site_admin_option_hook');
 		$this->_addHook('outermenu');
+		$this->_addHook('groupisactivecheckbox'); // The "use ..." checkbox in editgroupinfo
+		$this->_addHook('groupisactivecheckboxpost');
+		$this->_addHook('groupmenu');
+		$this->_addHook('project_admin_plugins');
 	}
 
 	function CallHook ($hookname, &$params) {
@@ -49,6 +53,19 @@ class headermenuPlugin extends Plugin {
 				echo '<li>'.$this->getAdminOptionLink().'</li>';
 				break;
 			}
+			case 'groupmenu': {
+				$this->getGroupLink($params);
+				break;
+			}
+			case 'project_admin_plugins': {
+				$group_id = $params['group_id'];
+				$project = group_get_object($group_id);
+				if ($project->usesPlugin($this->name)) {
+					echo '<p>'.util_make_link('/plugins/headermenu/?type=projectadmin&group_id='.$group_id,
+					     _('Project HeaderMenu Admin'), array('class' => 'tabtitle', 'title' => _('Add/Remove/Activate/Desactivate tabs'))) . '</p>';
+				}
+				break;
+			}
 		}
 	}
 
@@ -104,6 +121,41 @@ class headermenuPlugin extends Plugin {
 	}
 
 	/**
+	 * getGroupLink - update the links before generate the tab.
+	 *
+	 * @param	array	hook params array
+	 * @return	bool	true...
+	 */
+	function getGroupLink($params) {
+		$availableLinks = $this->getAvailableLinks('groupmenu');
+		foreach ($availableLinks as $link) {
+			if ($link['is_enable']) {
+				switch ($link['linktype']) {
+					case 'url': {
+						$params['DIRS'][] = $link['url'];
+						$params['TITLES'][] = $link['name'];
+						$params['TOOLTIPS'][] = $link['description'];
+						break;
+					}
+					case 'htmlcode': {
+						$params['DIRS'][] = '/plugins/'.$this->name.'/?type=pageview&pageid='.$link['id_headermenu'];
+						$params['TITLES'][] = $link['name'];
+						$params['TOOLTIPS'][] = $link['description'];
+						break;
+					}
+					case 'iframe': {
+						$params['DIRS'][] = '/plugins/'.$this->name.'/?type=iframe&pageid='.$link['id_headermenu'];
+						$params['TITLES'][] = $link['name'];
+						$params['TOOLTIPS'][] = $link['description'];
+						break;
+					}
+				}
+			}
+		}
+		return true;
+	}
+
+	/**
 	 * getAvailableLinks - get all the links from the db of certain kind
 	 *
 	 * @param	string	the type of menu links search in db
@@ -222,6 +274,16 @@ class headermenuPlugin extends Plugin {
 	}
 
 	/**
+	 * iframeView - display the iframe
+	 *
+	 * @param	int	the iframe id
+	 * @return	string	the html code
+	 */
+	 function iframeView($pageid) {
+		return true;
+	 }
+
+	/**
 	 * getHeader - initialize header and js
 	 *
 	 * @param	string	type : user, project, globaladmin (aka group)
@@ -247,6 +309,12 @@ class headermenuPlugin extends Plugin {
 				$returned = true;
 				break;
 			}
+			case 'projectadmin': {
+				html_use_jquery();
+				site_header(array('title'=>_('Project Menu Admin'), 'toptab' => ''));
+				$returned = true;
+				break;
+			}
 		}
 		return $returned;
 	}
@@ -269,6 +337,6 @@ class headermenuPlugin extends Plugin {
 	 * @return	string	the description
 	 */
 	function getPluginDescription() {
-		return _('Get the ability to set new links next to the login menu (headermenu) or in the main menu (outermenu).');
+		return _('Get the ability to set new links next to the login menu (headermenu), in the main menu (outermenu) or in the project menu (groupmenu).');
 	}
 }
diff --git a/src/plugins/headermenu/www/index.php b/src/plugins/headermenu/www/index.php
index 2eaabcb..da2d981 100644
--- a/src/plugins/headermenu/www/index.php
+++ b/src/plugins/headermenu/www/index.php
@@ -70,6 +70,15 @@ switch ($type) {
 		echo $headermenu->pageView($pageid);
 		break;
 	}
+	case 'projectadmin': {
+		if (!session_loggedin()) {
+			exit_not_logged_in();
+		}
+		$group_id = getIntFromRequest('group_id');
+		session_require_perm('project_admin', $group_id);
+		$headermenu->getHeader($type);
+		
+	}
 }
 
 site_project_footer(array());

-----------------------------------------------------------------------

Summary of changes:
 src/CHANGES                                        |    2 +-
 src/plugins/headermenu/action/addLink.php          |   46 ++++--
 src/plugins/headermenu/action/deleteLink.php       |   15 +-
 src/plugins/headermenu/action/updateLinkStatus.php |   15 +-
 src/plugins/headermenu/action/updateLinkValue.php  |   43 ++---
 .../headermenu/action/validateOrder.php}           |   28 ++--
 .../headermenu/common/headermenuPlugin.class.php   |  160 ++++++++++++++++--
 .../headermenu/db/20121231-reorderentry.sql        |    2 +
 .../headermenu/view/admin/updateLinkValue.php      |   49 +++---
 .../view/admin/viewGlobalConfiguration.php         |   76 +++++++--
 ...figuration.php => viewProjectConfiguration.php} |   63 ++++----
 src/plugins/headermenu/www/index.php               |   44 ++++-
 .../headermenu/www/scripts/HeaderMenuController.js |  170 +++++++++++++++++++-
 src/www/themes/funky/Theme.class.php               |    5 +-
 14 files changed, 583 insertions(+), 135 deletions(-)
 copy src/{www/include/unicode.php => plugins/headermenu/action/validateOrder.php} (67%)
 create mode 100644 src/plugins/headermenu/db/20121231-reorderentry.sql
 copy src/plugins/headermenu/view/admin/{viewGlobalConfiguration.php => viewProjectConfiguration.php} (57%)


hooks/post-receive
-- 
FusionForge



More information about the Fusionforge-commits mailing list