diff src/nabble/view/naml/dropdown.naml @ 0:7ecd1a4ef557

add content
author Franklin Schmidt <fschmidt@gmail.com>
date Thu, 21 Mar 2019 19:15:52 -0600
parents
children cc5b7d515580
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/nabble/view/naml/dropdown.naml	Thu Mar 21 19:15:52 2019 -0600
@@ -0,0 +1,885 @@
+<macro name="app_dropdown" requires="node">
+	<n.dropdown.
+		id="appdropdown"
+		text="[t]Options[/t]"
+		title="[t]Click for more options[/t]"
+		loadOnClick="/template/NamlServlet.jtp?macro=app_dropdown_later&node=[n.id/]"
+	>
+		<n.menu_subscription/>
+		<n.menu_post_by_email/>
+
+		<n.menu_separator/>
+
+		<n.menu_group. text="[t]Application[/t]">
+			<n.menu_edit_name_and_description/>
+			<n.menu_change_type/>
+			<n.menu_change_appearance/>
+			<n.menu_change_domain_name/>
+			<n.menu_mailing_list_archive_settings/>
+			<n.menu_change_language/>
+			<n.menu_change_title_and_meta_tags/>
+			<n.menu_extras_and_addons/>
+			<n.menu_use_google_analytics/>
+		</n.menu_group.>
+
+		<n.menu_group. text="[t]Structure[/t]">
+			<n.menu_create_sub_app/>
+			<n.menu_manage_pinned_topics/>
+			<n.menu_manage_sub_apps/>
+			<n.menu_parent_options/>
+		</n.menu_group.>
+
+		<n.menu_group. text="[t]Users[/t]">
+			<n.menu_change_permissions/>
+			<n.menu_manage_users_and_groups/>
+			<n.menu_manage_subscribers/>
+			<n.menu_manage_banned_users/>
+		</n.menu_group.>
+
+		<n.menu_separator/>
+
+		<n.menu_embedding_options/>
+		<n.menu_download_backup/>
+		<n.menu_delete/>
+
+		<n.other_menu_entries/>
+
+		<n.menu_sysadmin_options/>
+	</n.dropdown.>
+</macro>
+
+<macro name="app_dropdown_later" requires="servlet">
+	<n.javascript_response/>
+	<n.get_node_from_parameter.>
+		<n.menu_subscription/>
+		<n.menu_post_by_email/>
+
+		<n.menu_edit_name_and_description/>
+		<n.menu_change_type/>
+		<n.menu_change_appearance/>
+		<n.menu_change_domain_name/>
+		<n.menu_mailing_list_archive_settings/>
+		<n.menu_change_language/>
+		<n.menu_change_title_and_meta_tags/>
+		<n.menu_extras_and_addons/>
+		<n.menu_use_google_analytics/>
+
+		<n.menu_create_sub_app/>
+		<n.menu_manage_pinned_topics/>
+		<n.menu_manage_sub_apps/>
+		<n.menu_parent_options/>
+
+		<n.menu_change_permissions/>
+		<n.menu_manage_users_and_groups/>
+		<n.menu_manage_subscribers/>
+		<n.menu_manage_banned_users/>
+
+		<n.menu_embedding_options/>
+		<n.menu_download_backup/>
+		<n.menu_delete/>
+
+		<n.other_menu_entries/>
+
+		<n.menu_sysadmin_options/>
+	</n.get_node_from_parameter.>
+</macro>
+
+<macro name="topic_dropdown" requires="node">
+	<n.dropdown.
+		id="topicdropdown"
+		text="[t]Options[/t]"
+		title="[t]Click for more options[/t]"
+		loadOnClick="/template/NamlServlet.jtp?macro=topic_dropdown_later&node=[n.page_node.id/]"
+	>
+		<n.menu_topic_subscription/>
+		<n.menu_separator/>
+		<n.menu_move_topic/>
+		<n.menu_pin_topic/>
+		<n.menu_unpin_topic/>
+		<n.menu_lock_topic/>
+		<n.menu_unlock_topic/>
+		<n.menu_delete_topic/>
+		<n.menu_change_title_and_meta_tags/>
+		<n.menu_embed_post/>
+		<n.menu_permalink/>
+	</n.dropdown.>
+</macro>
+
+<macro name="topic_dropdown_later" requires="servlet">
+	<n.javascript_response/>
+	<n.get_node_from_parameter.>
+		<n.menu_topic_subscription/>
+		<n.menu_delete_topic/>
+		<n.menu_move_topic/>
+		<n.menu_pin_topic/>
+		<n.menu_unpin_topic/>
+		<n.menu_lock_topic/>
+		<n.menu_unlock_topic/>
+		<n.menu_change_title_and_meta_tags/>
+	</n.get_node_from_parameter.>
+</macro>
+
+<macro name="post_dropdown" requires="node">
+	<n.dropdown.
+		id="postdropdown[n.id/]"
+		text="[t]More[/t]"
+		title="[t]Click for more options[/t]"
+		loadOnClick="/template/NamlServlet.jtp?macro=post_dropdown_later&node=[n.id/]"
+	>
+		<n.menu_reply_to_author/>
+		<n.menu_edit_post/>
+		<n.menu_move_post/>
+		<n.menu_delete_post/>
+		<n.menu_change_post_date/>
+		<n.menu_print_post/>
+		<n.menu_permalink/>
+		<n.menu_raw_mail/>
+	</n.dropdown.>
+</macro>
+
+<macro name="post_dropdown_later" requires="servlet">
+	<n.javascript_response/>
+	<n.get_node_from_parameter.>
+		<n.menu_reply_to_author/>
+		<n.menu_edit_post/>
+		<n.menu_move_post/>
+		<n.menu_delete_post/>
+		<n.menu_change_post_date/>
+		<n.menu_raw_mail/>
+	</n.get_node_from_parameter.>
+</macro>
+
+<macro name="root_post_dropdown" requires="node">
+	<n.dropdown.
+		id="rootdropdown[n.id/]"
+		text="[t]Options[/t]"
+		title="[t]Click for more options[/t]"
+		loadOnClick="/template/NamlServlet.jtp?macro=root_post_dropdown_later&node=[n.id/]"
+	>
+		<n.menu_topic_subscription/>
+		<n.menu_reply_to_author/>
+		<n.menu_edit_post/>
+		<n.menu_move_post/>
+		<n.menu_delete_topic/>
+		<n.menu_pin_topic/>
+		<n.menu_unpin_topic/>
+		<n.menu_lock_topic/>
+		<n.menu_unlock_topic/>
+		<n.menu_change_post_date/>
+		<n.menu_change_title_and_meta_tags/>
+		<n.menu_embed_post/>
+		<n.menu_print_post/>
+		<n.menu_permalink/>
+		<n.menu_raw_mail/>
+	</n.dropdown.>
+</macro>
+
+<macro name="root_post_dropdown_later" requires="servlet">
+	<n.javascript_response/>
+	<n.get_node_from_parameter.>
+		<n.menu_topic_subscription/>
+		<n.menu_reply_to_author/>
+		<n.menu_edit_post/>
+		<n.menu_move_post/>
+		<n.menu_delete_topic/>
+		<n.menu_pin_topic/>
+		<n.menu_unpin_topic/>
+		<n.menu_lock_topic/>
+		<n.menu_unlock_topic/>
+		<n.menu_change_post_date/>
+		<n.menu_change_title_and_meta_tags/>
+		<n.menu_raw_mail/>
+	</n.get_node_from_parameter.>
+</macro>
+
+<macro name="menu_subscription" requires="node">
+	<n.if.is_in_command name="dropdown">
+		<then>
+			dropdown.add('subscriptionLink', '<n.javascript_string_encode.subscribe_link/>');
+		</then>
+		<else>
+			<n.set_local_node.this_node/>
+			<n.if.local_node.visitor_is_subscribed>
+				<then>
+					var text = '<b><t>Your subscription</t></b>: <n.javascript_string_encode.local_node.subject/> ';
+					text += '(<a href="[n.local_node.visitor_subscription.edit_path/]" ignore="y"><t>edit</t></a>)';
+					NabbleDropdown.replaceContents('subscriptionLink',text);
+				</then>
+			</n.if.local_node.visitor_is_subscribed>
+		</else>
+	</n.if.is_in_command>
+</macro>
+
+<macro name="menu_topic_subscription" requires="node">
+	<n.if.is_in_command name="dropdown">
+		<then>
+			dropdown.add('topicSubscriptionLink', '<n.javascript_string_encode.subscribe_link/>');
+		</then>
+		<else>
+			<n.set_local_node.this_node/>
+			<n.if.local_node.visitor_is_subscribed>
+				<then>
+					var text = '<b>You are subscribed</b> ';
+					text += '(<a href="[n.local_node.unsubscribe_path/]" ignore="y">unsubscribe</a>)';
+					NabbleDropdown.replaceContents('topicSubscriptionLink',text);
+				</then>
+			</n.if.local_node.visitor_is_subscribed>
+		</else>
+	</n.if.is_in_command>
+</macro>
+
+<macro name="menu_post_by_email" requires="node">
+	<n.if.not.is_associated_with_mailing_list_archive>
+		<then>
+			<n.if.is_in_command name="dropdown">
+				<then>
+					dropdown.add('postByEmail', '<n.javascript_string_encode.post_by_email_link/>', 'display:none');
+				</then>
+				<else>
+					<n.set_local_node.this_node/>
+					<n.if.visitor.can_create_topic_in.local_node>
+						<then>
+							NabbleDropdown.show('postByEmail');
+						</then>
+					</n.if.visitor.can_create_topic_in.local_node>
+				</else>
+			</n.if.is_in_command>
+		</then>
+	</n.if.not.is_associated_with_mailing_list_archive>
+</macro>
+
+<macro name="menu_edit_name_and_description" requires="node">
+	<n.if.is_in_command name="dropdown">
+		<then>
+			dropdown.add('editNameDescription', '<n.javascript_string_encode.edit_subject_and_message_link/>', 'display:none');
+		</then>
+		<else>
+			<n.set_local_node.this_node/>
+			<n.if.visitor.can_edit.local_node>
+				<then>
+					NabbleDropdown.show('editNameDescription');
+				</then>
+			</n.if.visitor.can_edit.local_node>
+		</else>
+	</n.if.is_in_command>
+</macro>
+
+<macro name="menu_change_appearance" requires="node">
+	<n.if.is_in_command name="dropdown">
+		<then>
+			dropdown.add('changeAppearance', '<n.javascript_string_encode.change_appearance_link/>', 'display:none');
+		</then>
+		<else>
+			<n.set_local_node.this_node/>
+			<n.if.both condition1="[n.local_node.is_root/]" condition2="[n.visitor.can_edit.local_node/]">
+				<then>
+					function hasChangeAppearanceToolbar() {
+						try {
+							if (parent.isChangeAppearance)
+								return true
+						} catch (err) {}
+						return false;
+					};
+					/* Avoid duplicate toolbars */
+					if (!hasChangeAppearanceToolbar())
+						NabbleDropdown.show('changeAppearance');
+				</then>
+			</n.if.both>
+		</else>
+	</n.if.is_in_command>
+</macro>
+
+<macro name="menu_change_language" requires="node">
+	<n.if.is_in_command name="dropdown">
+		<then>
+			dropdown.add('changeLanguage', '<n.javascript_string_encode.change_language_link/>', 'display:none');
+		</then>
+		<else>
+			<n.set_local_node.this_node/>
+			<n.if.both condition1="[n.local_node.is_root/]" condition2="[n.visitor.can_edit.local_node/]">
+				<then>
+					NabbleDropdown.show('changeLanguage');
+				</then>
+			</n.if.both>
+		</else>
+	</n.if.is_in_command>
+</macro>
+
+<macro name="menu_extras_and_addons" requires="node">
+	<n.if.is_in_command name="dropdown">
+		<then>
+			dropdown.add('addons', '<n.javascript_string_encode.extras_and_addons_link/>', 'display:none');
+		</then>
+		<else>
+			<n.set_local_node.this_node/>
+			<n.if.both condition1="[n.local_node.is_root/]" condition2="[n.visitor.can_edit.local_node/]">
+				<then>
+					NabbleDropdown.show('addons');
+				</then>
+			</n.if.both>
+		</else>
+	</n.if.is_in_command>
+</macro>
+
+<macro name="menu_change_title_and_meta_tags" requires="node">
+	<n.if.is_in_command name="dropdown">
+		<then>
+			dropdown.add('changeMetaTags', '<n.javascript_string_encode.change_title_and_meta_tags_link/>', 'display:none');
+		</then>
+		<else>
+			<n.set_local_node.this_node/>
+			<n.if.visitor.is_site_admin>
+				<then>
+					NabbleDropdown.show('changeMetaTags');
+				</then>
+			</n.if.visitor.is_site_admin>
+		</else>
+	</n.if.is_in_command>
+</macro>
+
+<macro name="menu_change_type" requires="node">
+	<n.if.is_in_command name="dropdown">
+		<then>
+			dropdown.add('changeType', '<n.javascript_string_encode.change_type_link/>', 'display:none');
+		</then>
+		<else>
+			<n.set_local_node.this_node/>
+			<n.if.visitor.can_edit.local_node>
+				<then>
+					NabbleDropdown.show('changeType');
+				</then>
+			</n.if.visitor.can_edit.local_node>
+		</else>
+	</n.if.is_in_command>
+</macro>
+
+<macro name="menu_change_domain_name" requires="node">
+	<n.if.is_in_command name="dropdown">
+		<then>
+			dropdown.add('changeDomainName', '<n.javascript_string_encode.change_domain_name_link/>', 'display:none');
+		</then>
+		<else>
+			<n.set_local_node.this_node/>
+			<n.if.both condition1="[n.visitor.can_edit.local_node/]" condition2="[n.local_node.is_root/]">
+				<then>
+					NabbleDropdown.show('changeDomainName');
+				</then>
+			</n.if.both>
+		</else>
+	</n.if.is_in_command>
+</macro>
+
+<macro name="menu_use_google_analytics" requires="node">
+	<n.if.is_in_command name="dropdown">
+		<then>
+			dropdown.add('useGoogleAnalytics', '<n.javascript_string_encode.use_google_analytics_link/>', 'display:none');
+		</then>
+		<else>
+			<n.set_local_node.this_node/>
+			<n.if.both condition1="[n.visitor.can_edit.local_node/]" condition2="[n.local_node.is_root/]">
+				<then>
+					NabbleDropdown.show('useGoogleAnalytics');
+				</then>
+			</n.if.both>
+		</else>
+	</n.if.is_in_command>
+</macro>
+
+<macro name="menu_create_sub_app" requires="node">
+	<n.if.is_in_command name="dropdown">
+		<then>
+			dropdown.add('createChildForum', '<n.javascript_string_encode.create_sub_app_link/>', 'display:none');
+		</then>
+		<else>
+			<n.set_local_node.this_node/>
+			<n.if.visitor.can_create_sub_apps_under.local_node>
+				<then>
+					NabbleDropdown.show('createChildForum');
+				</then>
+			</n.if.visitor.can_create_sub_apps_under.local_node>
+		</else>
+	</n.if.is_in_command>
+</macro>
+
+<macro name="menu_manage_pinned_topics" requires="node">
+	<n.if.is_in_command name="dropdown">
+		<then>
+			dropdown.add('managePinnedTopics', '<n.javascript_string_encode.manage_pinned_topics_link/>', 'display:none');
+		</then>
+		<else>
+			<n.set_local_node.this_node/>
+			<n.if>
+				<condition>
+					<n.both>
+						<condition1.not.regex_matches text="[n.local_node.type/]" pattern="board|category" />
+						<condition2.visitor.can_manage_pinned_topics_in.local_node/>
+					</n.both>
+				</condition>
+				<then>
+					NabbleDropdown.show('managePinnedTopics');
+				</then>
+			</n.if>
+		</else>
+	</n.if.is_in_command>
+</macro>
+
+<macro name="menu_manage_sub_apps" requires="node">
+	<n.if.is_in_command name="dropdown">
+		<then>
+			dropdown.add('manageSubApps', '<n.javascript_string_encode.manage_sub_apps_link/>', 'display:none');
+		</then>
+		<else>
+			<n.set_local_node.this_node/>
+			<n.if.visitor.can_edit.local_node>
+				<then>
+					NabbleDropdown.show('manageSubApps');
+				</then>
+			</n.if.visitor.can_edit.local_node>
+		</else>
+	</n.if.is_in_command>
+</macro>
+
+<macro name="menu_parent_options" requires="node">
+	<n.if.is_in_command name="dropdown">
+		<then>
+			dropdown.add('parentOptions', '<n.javascript_string_encode.parent_options_link/>', 'display:none');
+		</then>
+		<else>
+			<n.set_local_node.this_node/>
+			<n.if.visitor.can_move.local_node>
+				<then>
+					NabbleDropdown.show('parentOptions');
+				</then>
+			</n.if.visitor.can_move.local_node>
+		</else>
+	</n.if.is_in_command>
+</macro>
+
+<macro name="menu_change_permissions" requires="node">
+	<n.if.is_in_command name="dropdown">
+		<then>
+			dropdown.add('changePermissions', '<n.javascript_string_encode.change_permissions_link/>', 'display:none');
+		</then>
+		<else>
+			<n.set_local_node.this_node/>
+			<n.if.visitor.can_change_permissions_of.local_node>
+				<then>
+					NabbleDropdown.show('changePermissions');
+				</then>
+			</n.if.visitor.can_change_permissions_of.local_node>
+		</else>
+	</n.if.is_in_command>
+</macro>
+
+<macro name="menu_manage_users_and_groups" requires="node">
+	<n.if.is_in_command name="dropdown">
+		<then>
+			dropdown.add('manageGroups', '<n.javascript_string_encode.manage_users_and_groups_link/>', 'display:none');
+		</then>
+		<else>
+			<n.set_local_node.this_node/>
+			<n.if.both condition1="[n.local_node.is_root/]" condition2="[n.visitor.can_manage_users_and_groups/]">
+				<then>
+					NabbleDropdown.show('manageGroups');
+				</then>
+			</n.if.both>
+		</else>
+	</n.if.is_in_command>
+</macro>
+
+<macro name="menu_manage_subscribers" requires="node">
+	<n.if.is_in_command name="dropdown">
+		<then>
+			dropdown.add('manageSubscribers', '<n.javascript_string_encode.manage_subscribers_link/>', 'display:none');
+		</then>
+		<else>
+			<n.set_local_node.this_node/>
+			<n.if.visitor.can_manage_subscribers_of.local_node>
+				<then>
+					NabbleDropdown.show('manageSubscribers');
+				</then>
+			</n.if.visitor.can_manage_subscribers_of.local_node>
+		</else>
+	</n.if.is_in_command>
+</macro>
+
+<macro name="menu_manage_banned_users" requires="node">
+	<n.if.is_in_command name="dropdown">
+		<then>
+			dropdown.add('manageBannedUsers', '<n.javascript_string_encode.manage_banned_users_link/>', 'display:none');
+		</then>
+		<else>
+			<n.set_local_node.this_node/>
+			<n.if.both condition1="[n.local_node.is_root/]" condition2="[n.visitor.can_manage_banned_users/]">
+				<then>
+					NabbleDropdown.show('manageBannedUsers');
+				</then>
+			</n.if.both>
+		</else>
+	</n.if.is_in_command>
+</macro>
+
+<macro name="menu_mailing_list_archive_settings" requires="node">
+	<n.if.is_in_command name="dropdown">
+		<then>
+			dropdown.add('mailingListSettings', '<n.javascript_string_encode.mailing_list_archive_settings_link/>', 'display:none');
+		</then>
+		<else>
+			<n.set_local_node.this_node/>
+			<n.if>
+				<condition>
+					<n.both>
+						<condition1>
+							<n.visitor.can_edit.local_node/>
+						</condition1>
+						<condition2>
+							<n.either>
+								<condition1><n.local_node.is_a_mailing_list_archive/></condition1>
+								<condition2><n.not.local_node.has_sub_archive/></condition2>
+							</n.either>
+						</condition2>
+					</n.both>
+				</condition>
+				<then>
+					NabbleDropdown.show('mailingListSettings');
+				</then>
+			</n.if>
+		</else>
+	</n.if.is_in_command>
+</macro>
+
+<macro name="menu_embedding_options" requires="node">
+	<n.if.is_in_command name="dropdown">
+		<then>
+			dropdown.add('embeddingOptions', '<n.javascript_string_encode.embedding_options_link/>', 'display:none');
+		</then>
+		<else>
+			<n.set_local_node.this_node/>
+			<n.if.visitor.can_edit.local_node>
+				<then>
+					NabbleDropdown.show('embeddingOptions');
+				</then>
+			</n.if.visitor.can_edit.local_node>
+		</else>
+	</n.if.is_in_command>
+</macro>
+
+<macro name="menu_download_backup" requires="node">
+	<n.if.is_in_command name="dropdown">
+		<then>
+			dropdown.add('downloadBackup', '<n.javascript_string_encode.download_backup_link/>', 'display:none');
+		</then>
+		<else>
+			<n.set_local_node.this_node/>
+			<n.if.both condition1="[n.local_node.is_root/]" condition2="[n.visitor.is_site_admin/]">
+				<then>
+					NabbleDropdown.show('downloadBackup');
+				</then>
+			</n.if.both>
+		</else>
+	</n.if.is_in_command>
+</macro>
+
+<macro name="menu_delete" requires="node">
+	<n.if.is_in_command name="dropdown">
+		<then>
+			dropdown.add('deleteApp', '<n.javascript_string_encode.delete_link/>', 'display:none');
+		</then>
+		<else>
+			<n.set_local_node.this_node/>
+			<n.if.visitor.can_edit.local_node>
+				<then>
+					NabbleDropdown.show('deleteApp');
+				</then>
+			</n.if.visitor.can_edit.local_node>
+		</else>
+	</n.if.is_in_command>
+</macro>
+
+<macro name="menu_delete_topic" requires="node">
+	<n.if.is_in_command name="dropdown">
+		<then>
+			dropdown.add('deleteRecursively', '<n.javascript_string_encode.delete_recursively_link text="[t]Delete this topic[/t]"/>', 'display:none');
+			dropdown.add('deletePost', '<n.javascript_string_encode.delete_post_link text="[t]Delete this topic[/t]"/>', 'display:none');
+		</then>
+		<else>
+			<n.set_local_node.this_node/>
+			<n.if.visitor.can_delete_recursively.local_node>
+				<then>
+					NabbleDropdown.show('deleteRecursively');
+				</then>
+				<else.if.visitor.can_delete.local_node>
+					<then>
+						NabbleDropdown.show('deletePost');
+					</then>
+				</else.if.visitor.can_delete.local_node>
+			</n.if.visitor.can_delete_recursively.local_node>
+		</else>
+	</n.if.is_in_command>
+</macro>
+
+<macro name="menu_delete_post" requires="node">
+	<n.if.is_in_command name="dropdown">
+		<then>
+			dropdown.add('deletePost<n.id/>', '<n.javascript_string_encode.delete_post_link/>', 'display:none');
+			dropdown.add('deleteRecursively<n.id/>', '<n.javascript_string_encode.delete_recursively_link/>', 'display:none');
+		</then>
+		<else>
+			<n.set_local_node.this_node/>
+			<n.if.visitor.can_delete.local_node>
+				<then>
+					NabbleDropdown.show('deletePost<n.local_node.id/>');
+				</then>
+			</n.if.visitor.can_delete.local_node>
+			<n.if.visitor.can_delete_recursively.local_node>
+				<then>
+					NabbleDropdown.show('deleteRecursively<n.local_node.id/>');
+				</then>
+			</n.if.visitor.can_delete_recursively.local_node>
+		</else>
+	</n.if.is_in_command>
+</macro>
+
+<macro name="menu_edit_post" requires="node">
+	<n.if.is_in_command name="dropdown">
+		<then>
+			dropdown.add('editPost<n.id/>', '<n.javascript_string_encode.edit_post_link/>', 'display:none');
+		</then>
+		<else>
+			<n.set_local_node.this_node/>
+			<n.if.visitor.can_edit.local_node>
+				<then>
+					NabbleDropdown.show('editPost<n.local_node.id/>');
+				</then>
+			</n.if.visitor.can_edit.local_node>
+		</else>
+	</n.if.is_in_command>
+</macro>
+
+<macro name="menu_move_post" requires="node">
+	<n.if.is_in_command name="dropdown">
+		<then>
+			dropdown.add('movePost<n.id/>', '<n.javascript_string_encode.move_post_link/>', 'display:none');
+		</then>
+		<else>
+			<n.set_local_node.this_node/>
+			<n.if.visitor.can_move.local_node>
+				<then>
+					NabbleDropdown.show('movePost<n.local_node.id/>');
+				</then>
+			</n.if.visitor.can_move.local_node>
+		</else>
+	</n.if.is_in_command>
+</macro>
+
+<macro name="menu_move_topic" requires="node">
+	<n.if.is_in_command name="dropdown">
+		<then>
+			dropdown.add('moveTopic', '<n.javascript_string_encode.move_post_link text="[t]Move topic[/t]"/>', 'display:none');
+		</then>
+		<else>
+			<n.set_local_node.this_node/>
+			<n.if.visitor.can_move.local_node>
+				<then>
+					NabbleDropdown.show('moveTopic');
+				</then>
+			</n.if.visitor.can_move.local_node>
+		</else>
+	</n.if.is_in_command>
+</macro>
+
+<macro name="menu_pin_topic" requires="node">
+	<n.if.is_in_command name="dropdown">
+		<then>
+			dropdown.add('pinTopic', '<n.javascript_string_encode.pin_topic_link/>', 'display:none');
+		</then>
+		<else>
+			<n.set_local_node.this_node/>
+			<n.if.both condition1="[n.not.local_node.is_pinned/]" condition2="[n.visitor.can_manage_pinned_topics_in.local_node/]">
+				<then>
+					NabbleDropdown.show('pinTopic');
+				</then>
+			</n.if.both>
+		</else>
+	</n.if.is_in_command>
+</macro>
+
+<macro name="menu_unpin_topic" requires="node">
+	<n.if.is_in_command name="dropdown">
+		<then>
+			dropdown.add('unpinTopic', '<n.javascript_string_encode.unpin_topic_link/>', 'display:none');
+		</then>
+		<else>
+			<n.set_local_node.this_node/>
+			<n.if.both condition1="[n.local_node.is_pinned/]" condition2="[n.visitor.can_manage_pinned_topics_in.local_node/]">
+				<then>
+					NabbleDropdown.show('unpinTopic');
+				</then>
+			</n.if.both>
+		</else>
+	</n.if.is_in_command>
+</macro>
+
+<macro name="menu_lock_topic" requires="node">
+	<n.if.is_in_command name="dropdown">
+		<then>
+			dropdown.add('lockTopic', '<n.javascript_string_encode.lock_topic_link/>', 'display:none');
+		</then>
+		<else>
+			<n.set_local_node.this_node/>
+			<n.if.both condition1="[n.not.local_node.is_locked_topic/]" condition2="[n.visitor.can_manage_locked_topics_in.local_node/]">
+				<then>
+					NabbleDropdown.show('lockTopic');
+				</then>
+			</n.if.both>
+		</else>
+	</n.if.is_in_command>
+</macro>
+
+<macro name="menu_unlock_topic" requires="node">
+	<n.if.is_in_command name="dropdown">
+		<then>
+			dropdown.add('unlockTopic', '<n.javascript_string_encode.unlock_topic_link/>', 'display:none');
+		</then>
+		<else>
+			<n.set_local_node.this_node/>
+			<n.if.both condition1="[n.local_node.is_locked_topic/]" condition2="[n.visitor.can_manage_locked_topics_in.local_node/]">
+				<then>
+					NabbleDropdown.show('unlockTopic');
+				</then>
+			</n.if.both>
+		</else>
+	</n.if.is_in_command>
+</macro>
+
+<macro name="menu_change_post_date" requires="node">
+	<n.if.is_in_command name="dropdown">
+		<then>
+			dropdown.add('changePostDate<n.id/>', '<n.javascript_string_encode.change_post_date_link/>', 'display:none');
+		</then>
+		<else>
+			<n.set_local_node.this_node/>
+			<n.if.visitor.can_change_post_date_of.local_node>
+				<then>
+					NabbleDropdown.show('changePostDate<n.local_node.id/>');
+				</then>
+			</n.if.visitor.can_change_post_date_of.local_node>
+		</else>
+	</n.if.is_in_command>
+</macro>
+
+<macro name="menu_reply_to_author" requires="node">
+	<n.if.owner.is_authenticated>
+		<then>
+			<n.if.is_in_command name="dropdown">
+				<then>
+					dropdown.add('replyToAuthor<n.id/>', '<n.javascript_string_encode.reply_to_author_link/>', 'display:none');
+				</then>
+				<else>
+					<n.set_local_node.this_node/>
+					<n.if.not.visitor.equals.local_node.owner>
+						<then>
+							NabbleDropdown.show('replyToAuthor<n.local_node.id/>');
+						</then>
+					</n.if.not.visitor.equals.local_node.owner>
+				</else>
+			</n.if.is_in_command>
+		</then>
+	</n.if.owner.is_authenticated>
+</macro>
+
+<macro name="menu_embed_post" requires="node">
+	dropdown.add('embedPost<n.id/>', '<n.javascript_string_encode.embed_post_link/>');
+</macro>
+
+<macro name="menu_print_post" requires="node">
+	dropdown.add('print<n.id/>', '<n.javascript_string_encode.print_post_link/>');
+</macro>
+
+<macro name="menu_permalink" requires="node">
+	dropdown.add('permalink<n.id/>', '<n.javascript_string_encode.permalink/>');
+</macro>
+
+<macro name="menu_raw_mail" requires="node">
+	<n.if.is_in_command name="dropdown">
+		<then>
+			dropdown.add('rawMail<n.id/>', '<n.javascript_string_encode.raw_mail_link/>', 'display:none');
+		</then>
+		<else>
+			<n.set_local_node.this_node/>
+			<n.if.local_node.message.is_imported_mail>
+				<then.if.either condition1="[n.visitor.can_edit.local_node/]" condition2="[n.visitor.is_sysadmin/]">
+					<then>
+						NabbleDropdown.show('rawMail<n.local_node.id/>');
+					</then>
+				</then.if.either>
+			</n.if.local_node.message.is_imported_mail>
+		</else>
+	</n.if.is_in_command>
+</macro>
+
+<macro name="menu_sysadmin_options" requires="node">
+	<n.if.is_in_command name="dropdown">
+		<then>
+			dropdown.add('openShell', null, 'display:none');
+			<n.if.is_a_mailing_list_archive>
+				<then>
+					dropdown.add('uploadMbox', null, 'display:none');
+					dropdown.add('deleteRecursively', null, 'display:none');
+				</then>
+			</n.if.is_a_mailing_list_archive>
+		</then>
+		<else>
+			<n.set_local_node.this_node/>
+			<n.if.visitor.is_sysadmin>
+				<then>
+					NabbleDropdown.addContents('openShell','<n.javascript_string_encode.local_node.shell_link/>');
+					<n.if.local_node.is_a_mailing_list_archive>
+						<then>
+							NabbleDropdown.addContents('uploadMbox','<n.javascript_string_encode.local_node.upload_mbox_link/>');
+						</then>
+					</n.if.local_node.is_a_mailing_list_archive>
+				</then>
+			</n.if.visitor.is_sysadmin>
+		</else>
+	</n.if.is_in_command>
+</macro>
+
+<macro name="shell_link" requires="node">
+	<a href="/tools/Shell.jtp?cmd=node+=+ModelHome.getNode([n.id/])" target="_new"><span class="important">Open in shell</span></a>
+</macro>
+
+<macro name="upload_mbox_link" requires="node">
+	<a href="/tools/UploadMbox.jtp?forum=[n.id/]"><span class="important">Upload Mbox file</span></a>
+</macro>
+
+		------------- Dropdown Implementation -------------
+
+<macro name="dropdown" dot_parameter="options" parameters="id, text, title, element, loadOnClick">
+	<span id="dd_[n.id/]"></span>
+	<script type="text/javascript">
+		var dropdown = new NabbleDropdown("<n.id/>", "<n.javascript_string_encode.hide_null.text/>","<n.javascript_string_encode.hide_null.title/>");
+		<n.if.not.is_null.element>
+			<then>dropdown.customButton("<n.javascript_string_encode.element/>");</then>
+		</n.if.not.is_null.element>
+		<n.options/>
+		dropdown.build('dd_<n.id/>');
+		<n.if.not.is_empty.loadOnClick>
+			<then>dropdown.loadOnClick('<n.loadOnClick/>&_=' + Math.floor(Math.random()*999999));</then>
+		</n.if.not.is_empty.loadOnClick>
+	</script>
+</macro>
+
+<macro name="menu_group" dot_parameter="options" parameters="text">
+	dropdown.startGroup('<n.javascript_string_encode.text/>');
+	<n.options/>
+	dropdown.endGroup();
+</macro>
+
+<macro name="menu_separator">
+	dropdown.addSeparator();
+</macro>
+
+
+<macro name="other_menu_entries" requires="node">
+</macro>