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

add content
author Franklin Schmidt <fschmidt@gmail.com>
date Thu, 21 Mar 2019 19:15:52 -0600
parents
children 2e504670a010
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/nabble/view/naml/change_appearance.naml	Thu Mar 21 19:15:52 2019 -0600
@@ -0,0 +1,1451 @@
+<macro name="change_appearance" requires="servlet">
+	<n.if.not.visitor.can_edit.root_node>
+		<then>
+			<n.login.><t>Only authorized users can proceed in this area.</t></n.login.>
+		</then>
+	</n.if.not.visitor.can_edit.root_node>
+
+	<n.nabble_html>
+		<do>
+			<n.embedding_redirection_js/>
+			<n.change_appearance_body/>
+		</do>
+		<output>
+			<![CDATA[<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">]]>
+			<html>
+				<head>
+					<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
+					<title>Change appearance of <n.root_node.subject/></title>
+					<link rel="stylesheet" href="/nabble.css?v=[n.css_version/]" type="text/css" />
+					<n.change_appearance_stylesheet/>
+					<n.nabble_javascript_libraries/>
+					<script type="text/javascript" src="/util/jscolor/jscolor.js"></script>
+					<script type="text/javascript">
+						jscolor.dir = '/images/jscolor/';
+					</script>
+					<n.change_appearance_js/>
+					<n.html_head_content/>
+				</head>
+				<body>
+					<n.html_body_content/>
+				</body>
+			</html>
+		</output>
+	</n.nabble_html>
+</macro>
+
+<macro name="change_appearance_stylesheet">
+	<style type="text/css">
+		body {
+			margin:0;
+			padding:0;
+			overflow:hidden;
+		}
+		#change-appearance {
+			padding:.8em;
+			font: normal 1em 'Open Sans', Verdana, sans-serif;
+			color: #EEE;
+			text-shadow: 1px 1px 0 #000;
+			background: url('gradients/v30_DDDDDD88_CCCCCC00') #000 repeat-x;
+		}
+		#preview-frame {
+			position:absolute;
+			width:100%;
+		}
+		span.change-appearance-group {
+			background: url("gradients/v30_FFFFFF65_DDDDDD00") repeat-x scroll 0 0 #222222;
+			font-weight:bold;
+			padding: .2em .4em;
+			border-color: #333 #555 #888;
+			border-width:2px;
+			border-style: solid;
+			margin-right:.7em;
+			cursor: pointer;
+			white-space:nowrap;
+		}
+		div.change-appearance-group-panel {
+			background-color: #000;
+			border: 2px solid #888;
+			width:30em;
+			padding:.5em;
+			margin-top:.3em;
+			position:absolute;
+			z-index:1000;
+			display:none;
+		}
+		.weak-color {
+			color: #bbb;
+		}
+		td.label-column {
+			white-space:nowrap;
+			font-weight:bold;
+		}
+		div.sub-section-title {
+			font-size:80%;
+			margin:.3em 0 .1em;
+			padding:.2em .3em;
+			border-bottom:1px solid #777;
+		}
+		span.option-button {
+			background:#444;
+			padding:.2em .4em;
+			color:#dd0;
+			margin:0 .3em .3em 0;
+			white-space:nowrap;
+			cursor:pointer;
+		}
+		div.dropdown-box {
+			width:20em;
+			padding: .3em;
+			background:#000;
+			border:2px solid #777;
+			display:none;
+			-moz-box-shadow: 2px 2px 10px #FFFFFF;
+			-webkit-box-shadow: 2px 2px 10px #FFFFFF;
+			box-shadow: 2px 2px 10px #FFFFFF;
+		}
+		.section-title {
+			font-weight:bold;
+			color: #dd0;
+		}
+		.small-description {
+			font-size:80%;
+			padding:.3em 0;
+			color:#ddd;
+		}
+		table {
+			border-spacing:0;
+			width:100%;
+		}
+		table td {
+			padding:0;
+		}
+		.error-message {
+			color:red;
+			font-weight:bold;
+			display:none;
+		}
+		.error-field { border: 3px solid red; }
+		a:link { color:#78F; }
+		a:visited { color:#76D; }
+		a.close-link {
+			font-size:200%;
+			position:absolute;
+			right:10px;
+			top:0;
+			text-decoration:none;
+			color:white;
+		}
+		div.color-scheme-row {
+			clear:both;
+			cursor:pointer;
+			margin-bottom:.2em;
+		}
+		div.color-scheme {
+			width:8px;
+			float:right;
+			font-size:80%;
+			margin-top:2px;
+		}
+	</style>
+</macro>
+
+<macro name="change_appearance_js">
+	<script type="text/javascript">
+		window.isChangeAppearance = true; /* see dropdown.naml */
+		var selectedFont = '#ADE';
+		function layout() {
+			var $frm = $('#preview-frame');
+			var $w = $(window);
+			var $tbar = $('#change-appearance');
+			$frm.height($w.height()-$tbar.height()-30);
+			$frm.css('top', $tbar.height()+20);
+		};
+		function closeFrame() {
+			location = '/';
+		};
+		function hideOpenMenus() {
+			$('span.change-appearance-group').next().slideUp('fast');
+		};
+
+		var font_list = [];
+		var color_list = [];
+		var preferences_list = [];
+		var css_list = [];
+		function addField(list, id, initial, def, type) {
+			list.push({
+				'id': id,
+				'initial': initial,
+				'default': def,
+				'type': type
+			});
+		};
+<![CDATA[
+		function setFieldValues0(list, source) {
+			for (var i=0; i < list.length; i++) {
+				var o = list[i];
+				var value = o[source];
+				if (o.type == 'checkbox')
+					checkboxValue('#'+o.id, value);
+				else if (o.type == 'radio')
+					$('#'+o.id+value).attr('checked', true);
+				else if (o.type == 'color') {
+					var input = document.getElementById(o.id);
+					if (input.color)
+						input.color.fromString(value);
+					else
+						$(input).val(value);
+				} else
+					$('#'+o.id).val(value);
+			}
+		};
+]]>
+		function setFieldValues() {
+			addField(font_list, 'font-size', '<n.javascript_string_encode.naml_configuration.get_value name="fontSize" default="84"/>', '84');
+			addField(font_list, 'main-font', '<n.javascript_string_encode.naml_configuration.get_value name="mainFontFamily" default=""/>', '');
+			addField(font_list, 'title-font', '<n.javascript_string_encode.naml_configuration.get_value name="titleFontFamily" default=""/>', '');
+			setFieldValues0(font_list, 'initial');
+
+			addField(color_list, 'bg-color', '<n.javascript_string_encode.naml_configuration.get_value name="bgColor" default="FFFFFF"/>', 'FFFFFF', 'color');
+			addField(color_list, 'light-bg-color', '<n.javascript_string_encode.naml_configuration.get_value name="lightBgColor" default="F2F2F2"/>', 'F2F2F2', 'color');
+			addField(color_list, 'shaded-bg-color', '<n.javascript_string_encode.naml_configuration.get_value name="shadedBgColor" default="EEEEEE"/>', 'EEEEEE', 'color');
+			addField(color_list, 'dark-bg-color', '<n.javascript_string_encode.naml_configuration.get_value name="darkBgColor" default="DDDDDD"/>', 'DDDDDD', 'color');
+			addField(color_list, 'highlight-bg-color', '<n.javascript_string_encode.naml_configuration.get_value name="highlightBgColor" default="FFFF99"/>', 'FFFF99', 'color');
+			addField(color_list, 'text-color', '<n.javascript_string_encode.naml_configuration.get_value name="textColor" default="000000"/>', '000000', 'color');
+			addField(color_list, 'text-weak-color', '<n.javascript_string_encode.naml_configuration.get_value name="textWeakColor" default="666666"/>', '666666', 'color');
+			addField(color_list, 'title-color', '<n.javascript_string_encode.naml_configuration.get_value name="titleColor" default="333333"/>', '333333', 'color');
+			addField(color_list, 'link-color', '<n.javascript_string_encode.naml_configuration.get_value name="linkColor" default="0000EE"/>', '0000EE', 'color');
+			addField(color_list, 'link-visited-color', '<n.javascript_string_encode.naml_configuration.get_value name="linkVisitedColor" default="551A8B"/>', '551A8B', 'color');
+			addField(color_list, 'input-text-color', '<n.javascript_string_encode.naml_configuration.get_value name="inputTextColor" default="000000"/>', '000000', 'color');
+			addField(color_list, 'input-bg-color', '<n.javascript_string_encode.naml_configuration.get_value name="inputBgColor" default="FFFFFF"/>', 'FFFFFF', 'color');
+			addField(color_list, 'light-border-color', '<n.javascript_string_encode.naml_configuration.get_value name="lightBorderColor" default="EEEEEE"/>', 'EEEEEE', 'color');
+			addField(color_list, 'medium-border-color', '<n.javascript_string_encode.naml_configuration.get_value name="mediumBorderColor" default="CCCCCC"/>', 'CCCCCC', 'color');
+			addField(color_list, 'dark-border-color', '<n.javascript_string_encode.naml_configuration.get_value name="darkBorderColor" default="666666"/>', '666666', 'color');
+			addField(color_list, 'info-bg-color', '<n.javascript_string_encode.naml_configuration.get_value name="infoBgColor" default="FFFFCC"/>', 'FFFFCC', 'color');
+			addField(color_list, 'info-text-color', '<n.javascript_string_encode.naml_configuration.get_value name="infoTextColor" default="000000"/>', '000000', 'color');
+			addField(color_list, 'error-bg-color', '<n.javascript_string_encode.naml_configuration.get_value name="errorBgColor" default="FFFFCC"/>', 'FFFFCC', 'color');
+			addField(color_list, 'error-text-color', '<n.javascript_string_encode.naml_configuration.get_value name="errorTextColor" default="000000"/>', '000000', 'color');
+			setFieldValues0(color_list, 'initial');
+
+			addField(preferences_list, 'show-search-box', '<n.javascript_string_encode.naml_configuration.get_value name="showSearchBox" default="true"/>', 'true', 'checkbox');
+			addField(preferences_list, 'search-box-alignment', '<n.javascript_string_encode.naml_configuration.get_value name="searchBoxAlignment" default="right"/>', 'right');
+			addField(preferences_list, 'show-app-title', '<n.javascript_string_encode.naml_configuration.get_value name="showAppTitle" default="true"/>', 'true', 'checkbox');
+			addField(preferences_list, 'app-title-alignment', '<n.javascript_string_encode.naml_configuration.get_value name="appTitleAlignment" default="center"/>', 'center');
+			addField(preferences_list, 'app-description-alignment', '<n.javascript_string_encode.naml_configuration.get_value name="appDescriptionAlignment" default="center"/>', 'center');
+			addField(preferences_list, 'page-layout', '<n.javascript_string_encode.naml_configuration.get_value name="pageLayout" default="wide"/>', 'wide');
+			addField(preferences_list, 'forum-topics-per-page', '<n.javascript_string_encode.naml_configuration.get_value name="forumTopicsPerPage" default="35"/>', '35');
+			addField(preferences_list, 'blog-topics-per-page', '<n.javascript_string_encode.naml_configuration.get_value name="blogTopicsPerPage" default="10"/>', '10');
+			addField(preferences_list, 'news-topics-per-page', '<n.javascript_string_encode.naml_configuration.get_value name="newsTopicsPerPage" default="25"/>', '25');
+			addField(preferences_list, 'gallery-topics-per-page', '<n.javascript_string_encode.naml_configuration.get_value name="galleryTopicsPerPage" default="16"/>', '16');
+			addField(preferences_list, 'mixed-topics-per-page', '<n.javascript_string_encode.naml_configuration.get_value name="mixedTopicsPerPage" default="6"/>', '6');
+			addField(preferences_list, 'classic-posts-per-page', '<n.javascript_string_encode.naml_configuration.get_value name="classicPostsPerPage" default="20"/>', '20');
+			addField(preferences_list, 'picture-size-classic', '<n.javascript_string_encode.naml_configuration.get_value name="pictureSizeClassic" default="big"/>', 'big');
+			addField(preferences_list, 'forum-format-', '<n.javascript_string_encode.naml_configuration.get_value name="forumFormat" default="standard"/>', 'standard', 'radio');
+			setFieldValues0(preferences_list, 'initial');
+
+			addField(css_list, 'custom-css', '<n.javascript_string_encode.naml_configuration.get_value name="customCss" default=""/>', '');
+			setFieldValues0(css_list, 'initial');
+		};
+
+		function confirmRestore() {
+			return confirm('Do you really want to restore the default values and lose your changes?');
+		};
+
+		function restoreFontDefaults() {
+			if (confirmRestore()) {
+				setFieldValues0(font_list, 'default');
+				applyFont();
+			}
+		};
+
+		function applyFont() {
+			try {
+				clearValidation();
+				validateRange('#font-size', 70, 140);
+			} catch(err) {
+				showErrorMessage('font');
+				return;
+			}
+			var fontSize = $('#font-size').val();
+			var mainFont = $('#main-font').val();
+			var titleFont = $('#title-font').val();
+			var params = {};
+			params['macro'] = 'save_font_config';
+			params['fontSize'] = fontSize;
+			params['mainFontFamily'] = mainFont;
+			params['titleFontFamily'] = titleFont;
+			apply(params);
+		};
+		function checkboxValue(selector, value) {
+			if (value) $(selector).attr('checked', true);
+			else $(selector).removeAttr('checked');
+		};
+
+		function restoreColorDefaults() {
+			if (confirmRestore()) {
+				setFieldValues0(color_list, 'default');
+				applyColor();
+			}
+		};
+
+		function applyColor() {
+			var params = {};
+			params['macro'] = 'save_color_config';
+			params['bgColor'] = $('#bg-color').val();
+			params['lightBgColor'] = $('#light-bg-color').val();
+			params['shadedBgColor'] = $('#shaded-bg-color').val();
+			params['darkBgColor'] = $('#dark-bg-color').val();
+			params['highlightBgColor'] = $('#highlight-bg-color').val();
+			params['textColor'] = $('#text-color').val();
+			params['textWeakColor'] = $('#text-weak-color').val();
+			params['titleColor'] = $('#title-color').val();
+			params['linkColor'] = $('#link-color').val();
+			params['linkVisitedColor'] = $('#link-visited-color').val();
+			params['inputTextColor'] = $('#input-text-color').val();
+			params['inputBgColor'] = $('#input-bg-color').val();
+			params['lightBorderColor'] = $('#light-border-color').val();
+			params['mediumBorderColor'] = $('#medium-border-color').val();
+			params['darkBorderColor'] = $('#dark-border-color').val();
+			params['infoBgColor'] = $('#info-bg-color').val();
+			params['infoTextColor'] = $('#info-text-color').val();
+			params['errorBgColor'] = $('#error-bg-color').val();
+			params['errorTextColor'] = $('#error-text-color').val();
+			apply(params);
+		};
+
+		function applyPreferences() {
+			try {
+				clearValidation();
+				validateRange('#forum-topics-per-page', 1, 100);
+				validateRange('#blog-topics-per-page', 1, 100);
+				validateRange('#gallery-topics-per-page', 1, 100);
+				validateRange('#news-topics-per-page', 1, 100);
+				validateRange('#classic-posts-per-page', 1, 100);
+				validateMixedCsv('#mixed-topics-per-page', 1, 20);
+			} catch(err) {
+				showErrorMessage('preferences');
+				return;
+			}
+			var showSearchBox = $('#show-search-box').is(':checked');
+			var searchBoxAlignment = $('#search-box-alignment').val();
+			var showAppTitle = $('#show-app-title').is(':checked');
+			var appTitleAlignment = $('#app-title-alignment').val();
+			var appDescriptionAlignment = $('#app-description-alignment').val();
+			var pageLayout = $('#page-layout').val();
+			var forumTopicsPerPage = $('#forum-topics-per-page').val();
+			var blogTopicsPerPage = $('#blog-topics-per-page').val();
+			var galleryTopicsPerPage = $('#gallery-topics-per-page').val();
+			var newsTopicsPerPage = $('#news-topics-per-page').val();
+			var mixedTopicsPerPage = $('#mixed-topics-per-page').val();
+			var pictureSizeClassic = $('#picture-size-classic').val();
+			var classicPostsPerPage = $('#classic-posts-per-page').val();
+			var forumFormat = $('#forum-format-standard').is(':checked')?'standard':'topics';
+			var params = {};
+			params['macro'] = 'save_preferences_config';
+			params['showSearchBox'] = showSearchBox;
+			params['searchBoxAlignment'] = searchBoxAlignment;
+			params['showAppTitle'] = showAppTitle;
+			params['appTitleAlignment'] = appTitleAlignment;
+			params['appDescriptionAlignment'] = appDescriptionAlignment;
+			params['pageLayout'] = pageLayout;
+			params['forumTopicsPerPage'] = forumTopicsPerPage;
+			params['blogTopicsPerPage'] = blogTopicsPerPage;
+			params['galleryTopicsPerPage'] = galleryTopicsPerPage;
+			params['newsTopicsPerPage'] = newsTopicsPerPage;
+			params['mixedTopicsPerPage'] = mixedTopicsPerPage;
+			params['pictureSizeClassic'] = pictureSizeClassic;
+			params['classicPostsPerPage'] = classicPostsPerPage;
+			params['forumFormat'] = forumFormat;
+			apply(params);
+		};
+		function restorePreferencesDefaults() {
+			if (confirmRestore()) {
+				setFieldValues0(preferences_list, 'default');
+				updateUI();
+				applyPreferences();
+			}
+		};
+		function applyCss() {
+			var customCss = $('#custom-css').val();
+			var params = {};
+			params['macro'] = 'save_css_config';
+			params['customCss'] = customCss;
+			apply(params);
+		};
+		function restoreCssDefaults() {
+			if (confirmRestore()) {
+				setFieldValues0(css_list, 'default');
+				applyCss();
+			}
+		};
+		function apply(params) {
+			hideOpenMenus();
+			window.preview.notice('<t>Loading...</t>');
+			$('.error-message').hide();
+			clearValidation();
+			$.post("/template/NamlServlet.jtp", params,
+				function(data) {
+					window.preview.location = '/';
+				}
+			);
+		};
+		function showErrorMessage(group) {
+			$('#error-message-'+group).show();
+		};
+		function clearValidation() {
+			$('.error-field').removeClass('error-field');
+		};
+		function updateUI() {
+			checkboxEnable('#show-search-box', '#search-box-alignment');
+			checkboxEnable('#show-app-title', '#app-title-alignment');
+		};
+		function checkboxEnable(checkbox, control) {
+			var checked = $(checkbox).is(':checked');
+			var $control = $(control);
+			if (checked) $control.removeAttr('disabled');
+			else $control.attr('disabled', true);
+		};
+		function setEventHandlers() {
+			$('#show-search-box').change(updateUI);
+			$('#show-app-title').change(updateUI);
+		};
+		$(document).ready(function() {
+			layout();
+			$(window).resize(layout);
+			setEventHandlers();
+			setFieldValues();
+			updateUI();
+			var $groups = $('span.change-appearance-group');
+			$groups.hover(function(){
+					$(this).css('color', selectedFont);
+				}, function(){
+					$(this).css('color', 'inherit');
+				}
+			);
+			$groups.click(function(e){
+				e.stopPropagation();
+				var $panel = $(this).next();
+				var isVisible = $panel.css('display') != 'none';
+				hideOpenMenus();
+				if (!isVisible)
+					$panel.css('left', $(this).offset().left).slideDown('fast');
+			});
+			$(document).click(function(e) {
+				var $t = $(e.target);
+				if ($t.parents().hasClass('jscolor'))
+					return;
+				if ($t.parents().hasClass('change-appearance-group-panel'))
+					return;
+				hideOpenMenus();
+			});
+		});
+		<![CDATA[
+		function validateRange(id,from,to) {
+			var $f = $(id);
+			var v = $f.val();
+			if (!isInteger(v) || parseInt(v) < from || parseInt(v) > to) {
+				$f.addClass('error-field').focus();
+				throw new Error();
+			}
+		};
+		function validateMixedCsv(id,from,to) {
+			var $f = $(id);
+			var v = $f.val();
+			var parts = v.split(',');
+			for (var i=0; i<parts.length; i++) {
+				var v = parts[i];
+				if (!isInteger(v) || parseInt(v) < from || parseInt(v) > to) {
+					$f.addClass('error-field').focus();
+					throw new Error();
+				}
+			}
+		};
+		function isInteger(s) {
+		  return (s.toString().search(/^-?[0-9]+$/) == 0);
+		}
+		var schemes = [];
+		function addColorScheme(name, values) {
+			var index = schemes.length;
+			schemes.push({
+				name: name,
+				values: values
+			});
+			var h = '<div id="scheme'+index+'" class="color-scheme-row">';
+			h += '<b>'+name+'</b>';
+			for (var i=values.length-1;i>=0;i--) {
+				h += '<div class="color-scheme" style="background:#'+values[i]+'">&nbsp;</div>';
+			}
+			h += '</div>';
+			$('#color-schemes-panel').append(h);
+			var $scheme = $(Nabble.get('scheme'+index));
+			$scheme.click(function() {
+				loadColorScheme(name);
+			});
+			$scheme.hover(function() {
+				$(this).css('background-color', '#777');
+			}, function() {
+				$(this).css('background-color', 'transparent');
+			});
+		}
+		function loadColorScheme(name) {
+			for (var i=0;i<schemes.length;i++) {
+				if (schemes[i].name == name) {
+					var values = schemes[i].values;
+					Nabble.get('bg-color').color.fromString(values[0]);
+					Nabble.get('light-bg-color').color.fromString(values[1]);
+					Nabble.get('shaded-bg-color').color.fromString(values[2]);
+					Nabble.get('dark-bg-color').color.fromString(values[3]);
+					Nabble.get('highlight-bg-color').color.fromString(values[4]);
+					Nabble.get('text-color').color.fromString(values[5]);
+					Nabble.get('text-weak-color').color.fromString(values[6]);
+					Nabble.get('title-color').color.fromString(values[7]);
+					Nabble.get('link-color').color.fromString(values[8]);
+					Nabble.get('link-visited-color').color.fromString(values[9]);
+					Nabble.get('input-text-color').color.fromString(values[10]);
+					Nabble.get('input-bg-color').color.fromString(values[11]);
+					Nabble.get('light-border-color').color.fromString(values[12]);
+					Nabble.get('medium-border-color').color.fromString(values[13]);
+					Nabble.get('dark-border-color').color.fromString(values[14]);
+					Nabble.get('info-bg-color').color.fromString(values[15]);
+					Nabble.get('info-text-color').color.fromString(values[16]);
+					Nabble.get('error-bg-color').color.fromString(values[17]);
+					Nabble.get('error-text-color').color.fromString(values[18]);
+					return;
+				}
+			}
+		};
+		]]>
+		$(document).ready(function() {
+			addColorScheme("<t>Default</t>", ["FFFFFF", "F2F2F2", "EEEEEE", "DDDDDD", "FFFF99", "000000", "666666", "333333", "0000EE", "551A8B", "000000", "FFFFFF", "EEEEEE", "CCCCCC", "666666", "FFFFCC", "000000", "FFFFCC", "000000"]);
+			addColorScheme("Desert 1", ["faf9f5", "f6f3ed", "efebe0", "e7dcc1", "ffff66", "454d4b", "807379", "4057ae", "4057ae", "4089AE", "000000", "FFFFFF", "EBE7DA", "E0DBCA", "D4CFBC", "FFFFCC", "000000", "FFFFCC", "000000"]);
+			addColorScheme("Desert 2", ["F2F1ED", "E7E4DE", "D9D5C8", "D9CCAC", "FFFF66", "323836", "665C61", "465FBC", "014885", "2F6480", "000000", "FFFFFF", "C9C6B8", "B8B2A1", "A19B89", "FAFAC6", "000000", "FAFAC6", "000000"]);
+			addColorScheme("Darkness", ["000000", "191919", "333333", "666666", "545500", "FFFFFF", "CCCCCC", "EEEEEE", "FFCC66", "FFFFCC", "FFFFFF", "332D25", "333333", "666666", "CCCCCC", "631900", "FFFFFF", "631900", "FFFFFF"]);
+			addColorScheme("Moonlight", ["0F1528", "151C33", "1A2237", "21366E", "001C72", "9DAAD9", "CCCCCC", "EEEEEE", "75ADF5", "C4C3DF", "FFFFFF", "1E354D", "263A52", "3A536B", "4E5D7D", "1A2237", "FFFFFF", "4A0D0D", "FFFFFF"]);
+			addColorScheme("Moonlight 2", ["1E2E40", "24374D", "2E4863", "365373", "7A6F33", "E3F0FF", "83ADDE", "B8B85C", "AEE0F2", "8AD1C1", "000000", "334A5E", "2D445E", "3C5A7D", "466A94", "59591D", "000000", "4A2125", "000000"]);
+			addColorScheme("Jungle", ["2D3D1E", "3C4A2F", "000000", "OE24OC", "787D2F", "D6E6D4", "B1B888", "C9C42E", "64C447", "8EB85D", "000000", "0B3811", "0C1F09", "19360D", "154511", "544E14", "FFFFFF", "4D2020", "FFFFFF"]);
+			addColorScheme("Princess", ["EDDCFF", "DACAE8", "FFEDF2", "DEC1E3", "C1B8FF", "000000", "26233B", "363BD1", "5A236B", "4E3170", "000000", "F0D3F0", "F3E0F6", "BBA3C4", "947696", "ABB1EB", "000000", "B2DFDF", "000000"]);
+			addColorScheme("Autumn", ["FFFDF3", "FAF3DC", "F5ECD3", "E8DDC2", "FFD996", "0D0D0D", "998262", "71180C", "8B2113", "85610F", "000000", "FFFFFF", "F7E5AE", "EDDBA7", "DBCB9B", "F1E27D", "000000", "963330", "FFFFFF"]);
+			addColorScheme("Dark Gray", ["3D3D3D", "333333", "191919", "000000", "545500", "FFFFFF", "CCCCCC", "EEEEEE", "FFCC66", "FFFFCC", "EEEEEE", "222222", "333333", "666666", "CCCCCC", "631900", "FFFFFF", "631900", "FFFFFF"]);
+		});
+	</script>
+</macro>
+
+<macro name="change_appearance_body">
+	<div id="change-appearance">
+		<n.add_group name="Font" contents="[n.font_editor_panel/]" apply_call="applyFont()" restore_defaults_call="restoreFontDefaults()" width="25em"/>
+		<n.add_group name="Color" contents="[n.color_editor_panel/]" apply_call="applyColor()" restore_defaults_call="restoreColorDefaults()" width="25em"/>
+		<n.add_group name="Preferences" contents="[n.preferences_editor_panel/]" apply_call="applyPreferences()" restore_defaults_call="restorePreferencesDefaults()" width="30em"/>
+		<n.add_group name="CSS" contents="[n.css_editor_panel/]" apply_call="applyCss()" restore_defaults_call="restoreCssDefaults()" width="30em"/>
+		<button style="padding:0;margin-top:-.1em" onclick="closeFrame()"><t>Close</t></button>
+	</div>
+	<iframe id="preview-frame" name="preview" src="/" allowTransparency="false" border="0"/>
+</macro>
+
+<macro name="add_group" parameters="name, contents, apply_call, restore_defaults_call, width">
+	<span class="change-appearance-group rounded">
+		<n.name/>
+	</span>
+	<div class="change-appearance-group-panel drop-shadow" style="width:[n.width/]">
+		<a class="close-link" href="javascript:void(0)" onclick="hideOpenMenus()">&times;</a>
+		<n.contents/>
+		<div style="text-align:right;padding-top:.5em">
+			<span id="error-message-[n.to_lower_case.name/]" class="error-message">Please fix error(s) above.</span>
+			<button class="toolbar action-button" onclick="[n.restore_defaults_call/]">Restore Defaults</button>
+			<button class="toolbar action-button" onclick="[n.apply_call/]">
+				<img src="/images/success.png" style="vertical-align:middle"/>
+				Apply
+			</button>
+		</div>
+	</div>
+</macro>
+
+<macro name="font_editor_panel">
+	<table>
+		<tr>
+			<td class="label-column">Font Size:</td>
+			<td><input type="text" size="3" maxlength="3" id="font-size" name="font-size" />%</td>
+		</tr>
+		<tr>
+			<td></td>
+			<td><div class="small-description" style="margin-bottom:1em">Value between 70 and 140% (default is 84%)</div></td>
+		</tr>
+		<tr>
+			<td class="label-column">Main Font:</td>
+			<td>
+				<input type="text" size="20" maxlength="20" id="main-font" name="font" />
+				<button id="main-dropdown" class="toolbar" style="font-size:80%;vertical-align:middle"><b>Choose Font</b></button>
+				<n.font_selector_panel id="main-font-selector" input_id="main-font"/>
+				<n.custom_dropdown clickable_id="main-dropdown" panel_id="main-font-selector"/>
+			</td>
+		</tr>
+		<tr>
+			<td></td>
+			<td><div class="small-description" style="margin-bottom:1em">Leave blank for default font.</div></td>
+		</tr>
+		<tr>
+			<td class="label-column">Title Font:</td>
+			<td>
+				<input type="text" size="20" maxlength="20" id="title-font" name="font" />
+				<button id="title-dropdown" class="toolbar" style="font-size:80%;vertical-align:middle"><b>Choose Font</b></button>
+				<n.font_selector_panel id="title-font-selector" input_id="title-font"/>
+				<n.custom_dropdown clickable_id="title-dropdown" panel_id="title-font-selector"/>
+			</td>
+		</tr>
+		<tr>
+			<td></td>
+			<td><div class="small-description">Leave blank for default font.</div></td>
+		</tr>
+	</table>
+</macro>
+
+<macro name="font_selector_panel" parameters="id, input_id">
+	<div id="[n.id/]" class="dropdown-box">
+		<div class="sub-section-title">Basic Fonts</div>
+		<div style="padding:0 .5em;line-height:1.8em">
+			<n.basic_font_option input_id="[n.input_id/]" font="Sans-serif"/>
+			<n.basic_font_option input_id="[n.input_id/]" font="Tahoma"/>
+			<n.basic_font_option input_id="[n.input_id/]" font="Arial"/>
+			<n.basic_font_option input_id="[n.input_id/]" font="Times"/>
+			<n.basic_font_option input_id="[n.input_id/]" font="Courier New"/>
+			<n.basic_font_option input_id="[n.input_id/]" font="Garamond"/>
+			<n.basic_font_option input_id="[n.input_id/]" font="Georgia"/>
+			<n.basic_font_option input_id="[n.input_id/]" font="Trebuchet MS"/>
+			<n.basic_font_option input_id="[n.input_id/]" font="Verdana"/>
+		</div>
+
+		<div class="sub-section-title">
+			Google Web Fonts
+		</div>
+		<div style="padding:0 .5em;line-height:1.8em">
+			<n.google_font_option input_id="[n.input_id/]" font="Short Stack"/>
+			<n.google_font_option input_id="[n.input_id/]" font="Open Sans"/>
+			<n.google_font_option input_id="[n.input_id/]" font="Alice"/>
+			<n.google_font_option input_id="[n.input_id/]" font="Questrial"/>
+			<n.google_font_option input_id="[n.input_id/]" font="Rokkitt"/>
+			<n.google_font_option input_id="[n.input_id/]" font="Varela Round"/>
+			<n.google_font_option input_id="[n.input_id/]" font="Days One"/>
+			<n.google_font_option input_id="[n.input_id/]" font="Copse"/>
+			<n.google_font_option input_id="[n.input_id/]" font="Quattrocento"/>
+			<n.google_font_option input_id="[n.input_id/]" font="Comfortaa"/>
+			<n.google_font_option input_id="[n.input_id/]" font="Play"/>
+			<n.google_font_option input_id="[n.input_id/]" font="Delius Swash Caps"/>
+			<n.google_font_option input_id="[n.input_id/]" font="Lobster"/>
+			<n.google_font_option input_id="[n.input_id/]" font="Kelly Slab"/>
+		</div>
+		<div class="small-description">
+			You can use any Google Web Font available (<a href="http://www.google.com/webfonts" target="_blank" rel="nofollow">view fonts</a>).
+			Just type the name of the font with the prefix "GWF=" (for example, try "GWF=Marvel").
+		</div>
+	</div>
+</macro>
+
+<macro name="preferences_editor_panel">
+	<table>
+		<tr>
+			<td><input type="checkbox" id="show-search-box"/></td>
+			<td class="label-column"><label for="show-search-box">Show search box</label></td>
+			<td>
+				<select id="search-box-alignment">
+					<option value="left">Left</option>
+					<option value="center">Center</option>
+					<option value="right">Right</option>
+				</select>
+			</td>
+			<td colspan="2"></td>
+		</tr>
+		<tr>
+			<td><input type="checkbox" id="show-app-title"/></td>
+			<td class="label-column"><label for="show-app-title">Show app title</label></td>
+			<td>
+				<select id="app-title-alignment">
+					<option value="left">Left</option>
+					<option value="center">Center</option>
+					<option value="right">Right</option>
+				</select>
+			</td>
+			<td colspan="2"></td>
+		</tr>
+		<tr>
+			<td></td>
+			<td class="label-column">Description alignment</td>
+			<td>
+				<select id="app-description-alignment">
+					<option value="left">Left</option>
+					<option value="center">Center</option>
+					<option value="right">Right</option>
+				</select>
+			</td>
+			<td colspan="2"></td>
+		</tr>
+		<tr>
+			<td></td>
+			<td class="label-column">Page layout</td>
+			<td>
+				<select id="page-layout">
+					<option value="wide">Wide</option>
+					<option value="narrow">Narrow</option>
+				</select>
+			</td>
+			<td colspan="2"></td>
+		</tr>
+		<tr>
+			<td colspan="5">
+				<hr color="#555" style="margin:0 0 .3em"/>
+			</td>
+		</tr>
+		<tr>
+			<td colspan="5" class="section-title">
+				Topics per page
+			</td>
+		</tr>
+		<tr>
+			<td></td>
+			<td class="label-column">Forum</td>
+			<td><input type="text" id="forum-topics-per-page" size="3"/></td>
+			<td class="label-column">Blog</td>
+			<td><input type="text" id="blog-topics-per-page" size="3"/></td>
+		</tr>
+		<tr>
+			<td></td>
+			<td class="label-column">Gallery</td>
+			<td><input type="text" id="gallery-topics-per-page" size="3"/></td>
+			<td class="label-column">Newspaper</td>
+			<td><input type="text" id="news-topics-per-page" size="3"/></td>
+		</tr>
+		<tr>
+			<td></td>
+			<td class="label-column">Mixed</td>
+			<td colspan="3">
+				<input type="text" id="mixed-topics-per-page" size="10"/>
+				<a href="[n.help.mixed_lengths.url/]" target="_blank">help article</a>
+			</td>
+		</tr>
+		<tr>
+			<td colspan="5">
+				<hr color="#555" style="margin:0 0 .3em"/>
+			</td>
+		</tr>
+		<tr>
+			<td colspan="5" class="section-title">
+				Classic topic page
+			</td>
+		</tr>
+		<tr>
+			<td></td>
+			<td class="label-column">Picture size</td>
+			<td colspan="3">
+				<select id="picture-size-classic">
+					<option value="big">Big</option>
+					<option value="small">Small</option>
+				</select>
+			</td>
+		</tr>
+		<tr>
+			<td></td>
+			<td class="label-column">Posts per page</td>
+			<td colspan="3">
+				<input type="text" id="classic-posts-per-page" size="3"/>
+			</td>
+		</tr>
+		<tr>
+			<td colspan="5">
+				<hr color="#555" style="margin:0 0 .3em"/>
+			</td>
+		</tr>
+		<tr>
+			<td colspan="5" class="section-title">
+				Forum Format
+			</td>
+		</tr>
+		<tr>
+			<td style="vertical-align:top"><input type="radio" id="forum-format-topics" name="forum-format"/></td>
+			<td colspan="4">
+				<label for="forum-format-topics"><b>Topics</b></label>
+				<div class="small-description">
+					By selecting this format, your forum will show topics from all sub-forums in a flat list.
+					This means you can browse topics without having to visit sub-forums.
+					This format is only useful when you have sub-forums.
+				</div>
+			</td>
+		</tr>
+		<tr>
+			<td style="vertical-align:top"><input type="radio" id="forum-format-standard" name="forum-format"/></td>
+			<td colspan="4">
+				<label for="forum-format-standard"><b>Standard</b></label>
+				<div class="small-description">
+					This format shows the list of topics on your forum front page.
+					If you create a child forum, it will appear as a folder on top of the topics.
+					Your forum may have multi-level sub-forums, but you only see topics and forums that are 1-level below your current forum.
+				</div>
+			</td>
+		</tr>
+	</table>
+</macro>
+
+<macro name="color_editor_panel">
+	<div style="margin-bottom:.4em">
+		<button id="color-schemes-button" class="toolbar" style="font-size:80%;vertical-align:middle">
+			<img src="/images/colors.png" width="12" height="12" style="vertical-align:middle"/>
+			<b>Color Schemes</b>
+		</button>
+		<div id="color-schemes-panel" class="dropdown-box"></div>
+		<n.custom_dropdown clickable_id="color-schemes-button" panel_id="color-schemes-panel"/>
+	</div>
+
+	<table>
+		<tr>
+			<td class="label-column">Background</td>
+			<td><input class="color" id="bg-color" size="6"/></td>
+		</tr>
+		<tr>
+			<td class="label-column">Light Background</td>
+			<td><input class="color" id="light-bg-color" size="6"/></td>
+		</tr>
+		<tr>
+			<td class="label-column">Shaded Background</td>
+			<td><input class="color" id="shaded-bg-color" size="6"/></td>
+		</tr>
+		<tr>
+			<td class="label-column">Dark Background</td>
+			<td><input class="color" id="dark-bg-color" size="6"/></td>
+		</tr>
+		<tr>
+			<td class="label-column">Highlight Background</td>
+			<td><input class="color" id="highlight-bg-color" size="6"/></td>
+		</tr>
+		<tr>
+			<td colspan="2">
+				<hr color="#555" style="margin:0 0 .3em"/>
+			</td>
+		</tr>
+		<tr>
+			<td class="label-column">Text</td>
+			<td><input class="color" id="text-color" size="6"/></td>
+		</tr>
+		<tr>
+			<td class="label-column">Text (Weak Color)</td>
+			<td><input class="color" id="text-weak-color" size="6"/></td>
+		</tr>
+		<tr>
+			<td class="label-column">Title</td>
+			<td><input class="color" id="title-color" size="6"/></td>
+		</tr>
+		<tr>
+			<td class="label-column">Link</td>
+			<td><input class="color" id="link-color" size="6"/></td>
+		</tr>
+		<tr>
+			<td class="label-column">Link Visited</td>
+			<td><input class="color" id="link-visited-color" size="6"/></td>
+		</tr>
+		<tr>
+			<td colspan="2">
+				<hr color="#555" style="margin:0 0 .3em"/>
+			</td>
+		</tr>
+		<tr>
+			<td class="label-column">Input Text</td>
+			<td><input class="color" id="input-text-color" size="6"/></td>
+		</tr>
+		<tr>
+			<td class="label-column">Input Background</td>
+			<td><input class="color" id="input-bg-color" size="6"/></td>
+		</tr>
+		<tr>
+			<td colspan="2">
+				<hr color="#555" style="margin:0 0 .3em"/>
+			</td>
+		</tr>
+		<tr>
+			<td class="label-column">Light Border</td>
+			<td><input class="color" id="light-border-color" size="6"/></td>
+		</tr>
+		<tr>
+			<td class="label-column">Medium Border</td>
+			<td><input class="color" id="medium-border-color" size="6"/></td>
+		</tr>
+		<tr>
+			<td class="label-column">Dark Border</td>
+			<td><input class="color" id="dark-border-color" size="6"/></td>
+		</tr>
+		<tr>
+			<td colspan="2">
+				<hr color="#555" style="margin:0 0 .3em"/>
+			</td>
+		</tr>
+		<tr>
+			<td class="label-column">Info Message Background</td>
+			<td><input class="color" id="info-bg-color" size="6"/></td>
+		</tr>
+		<tr>
+			<td class="label-column">Info Message Text</td>
+			<td><input class="color" id="info-text-color" size="6"/></td>
+		</tr>
+		<tr>
+			<td class="label-column">Error Message Background</td>
+			<td><input class="color" id="error-bg-color" size="6"/></td>
+		</tr>
+		<tr>
+			<td class="label-column">Error Message Text</td>
+			<td><input class="color" id="error-text-color" size="6"/></td>
+		</tr>
+	</table>
+</macro>
+
+<macro name="css_editor_panel">
+	<div style="margin:.2em .2em .4em;font-weight:bold">
+		Enter your custom Cascading Stylesheet (CSS) code:
+	</div>
+	<textarea id="custom-css" style="width:98%;height:20em"></textarea>
+</macro>
+
+<macro name="basic_font_option" parameters="input_id,font">
+	<span
+		class="rounded option-button"
+		onclick="$('#[n.input_id/]').val('[n.font/]')"
+		style="font-family:'[n.font/]'"
+	><n.font/></span>
+</macro>
+
+<macro name="google_font_option" parameters="input_id,font">
+	<n.put_in_head.>
+		<link href="http://fonts.googleapis.com/css?family=[n.encode_url.encode_text.font/]" rel="stylesheet" type="text/css"/>
+	</n.put_in_head.>
+	<span
+		class="rounded option-button"
+		onclick="$('#[n.input_id/]').val('GWF=[n.font/]')"
+		style="font-family:'[n.font/]'"
+	><n.font/></span>
+</macro>
+
+<macro name="save_font_config" requires="servlet">
+	<n.if.visitor.can_edit.root_node>
+		<then>
+			<n.naml_configuration.>
+				<n.set>
+					<name>fontSize</name>
+					<value><n.font_size_value/></value>
+					<default>84</default>
+					<naml>
+						<n.tweak_for_stylesheets.>
+							body, input, button, textarea, select {
+								font-size: <n.font_size_value/>%;
+							}
+						</n.tweak_for_stylesheets.>
+					</naml>
+				</n.set>
+				<n.set>
+					<name>titleFontFamily</name>
+					<value><n.title_font_value/></value>
+					<default></default>
+					<naml>
+						<n.tweak_for_font_family. selector=".second-font, h1, h2, h3, h4, h5, h6">
+							<n.title_font_value/>
+						</n.tweak_for_font_family.>
+					</naml>
+				</n.set>
+				<n.set>
+					<name>mainFontFamily</name>
+					<value><n.main_font_value/></value>
+					<default></default>
+					<naml>
+						<n.tweak_for_font_family. selector="body, input, button, textarea, select">
+							<n.main_font_value/>
+						</n.tweak_for_font_family.>
+					</naml>
+				</n.set>
+				<n.apply/>
+			</n.naml_configuration.>
+		</then>
+	</n.if.visitor.can_edit.root_node>
+</macro>
+
+<macro name="save_color_config" requires="servlet">
+	<n.if.visitor.can_edit.root_node>
+		<then>
+			<n.naml_configuration.>
+				<n.set_color_tweak name="bgColor" value="[n.bg_color_value/]" default="FFFFFF" selector="html,#nabble,.nabble .no-bg-color" property="background-color" macro="bg_color"/>
+				<n.set_color_tweak name="lightBgColor" value="[n.light_bg_color_value/]" default="F2F2F2" selector=".nabble .light-bg-color" property="background-color" macro="light_bg_color"/>
+				<n.set_color_tweak name="shadedBgColor" value="[n.shaded_bg_color_value/]" default="EEEEEE" selector=".nabble .shaded-bg-color" property="background-color" macro="shaded_bg_color"/>
+				<n.set_color_tweak name="darkBgColor" value="[n.dark_bg_color_value/]" default="DDDDDD" selector=".nabble .dark-bg-color" property="background-color" macro="dark_bg_color"/>
+				<n.set_color_tweak name="highlightBgColor" value="[n.highlight_bg_color_value/]" default="FFFF99" selector=".nabble .highlight" property="background-color" macro="highlight_bg_color"/>
+				<n.set_color_tweak name="textColor" value="[n.text_color_value/]" default="000000" selector=".nabble *" property="color" macro="text_color"/>
+				<n.set_color_tweak name="textWeakColor" value="[n.text_weak_color_value/]" default="666666" selector=".nabble .weak-color" property="color" macro="text_weak_color"/>
+				<n.set_color_tweak name="titleColor" value="[n.title_color_value/]" default="333333" selector=".nabble h1, .nabble h2, .nabble h3, .nabble h4, .nabble h5, .nabble h6" property="color" macro="title_color"/>
+				<n.set_color_tweak name="linkColor" value="[n.link_color_value/]" default="0000EE" selector=".nabble a:link, .nabble a.not-visited-link" property="color" macro="link_color"/>
+				<n.set_color_tweak name="linkVisitedColor" value="[n.link_visited_color_value/]" default="551A8B" selector=".nabble a:visited, .nabble a.visited-link" property="color" macro="link_visited_color"/>
+				<n.set_color_tweak name="inputTextColor" value="[n.input_text_color_value/]" default="000000" selector=".nabble select, .nabble input, .nabble textarea" property="color" macro="input_text_color"/>
+				<n.set_color_tweak name="inputBgColor" value="[n.input_bg_color_value/]" default="FFFFFF" selector=".nabble select, .nabble input, .nabble textarea" property="background-color" macro="input_bg_color"/>
+				<n.set_color_tweak name="lightBorderColor" value="[n.light_border_color_value/]" default="EEEEEE" selector=".nabble .light-border-color" property="border-color" macro="light_border_color"/>
+				<n.set_color_tweak name="mediumBorderColor" value="[n.medium_border_color_value/]" default="CCCCCC" selector=".nabble .medium-border-color" property="border-color" macro="medium_border_color"/>
+				<n.set_color_tweak name="darkBorderColor" value="[n.dark_border_color_value/]" default="666666" selector=".nabble .dark-border-color" property="border-color" macro="dark_border_color"/>
+				<n.set_color_tweak name="infoBgColor" value="[n.info_bg_color_value/]" default="FFFFCC" selector=".nabble .info-message, .nabble .info-message *" property="background-color" macro="info_bg_color"/>
+				<n.set_color_tweak name="infoTextColor" value="[n.info_text_color_value/]" default="000000" selector=".nabble .info-message, .nabble .info-message *" property="color" macro="info_text_color"/>
+				<n.set_color_tweak name="errorBgColor" value="[n.error_bg_color_value/]" default="FFFFCC" selector=".nabble .error-message, .nabble .error-message *" property="background-color" macro="error_bg_color"/>
+				<n.set_color_tweak name="errorTextColor" value="[n.error_text_color_value/]" default="000000" selector=".nabble .error-message, .nabble .error-message *" property="color" macro="error_text_color"/>
+				<n.apply/>
+			</n.naml_configuration.>
+		</then>
+	</n.if.visitor.can_edit.root_node>
+</macro>
+
+<macro name="set_color_tweak" parameters="name, value, default, selector, property, macro" requires="naml_configuration">
+	<n.set>
+		<name><n.name/></name>
+		<value><n.value/></value>
+		<default><n.default/></default>
+		<naml>
+			<![CDATA[
+			<override_macro name="]]><n.macro/><![CDATA[">
+				]]><n.value/><![CDATA[
+			</override_macro>
+			<override_macro name="site_style" unindent="true">
+				<n.overridden/>]]>
+				<n.selector/> { <n.property/>: #<n.value/>; }
+				<![CDATA[
+			</override_macro>
+			]]>
+		</naml>
+	</n.set>
+</macro>
+
+<macro name="save_preferences_config" requires="servlet">
+	<n.if.visitor.can_edit.root_node>
+		<then>
+			<n.naml_configuration.>
+				<n.set>
+					<name>showSearchBox</name>
+					<value><n.show_search_box_value/></value>
+					<default>true</default>
+					<naml>
+						<n.tweak_for_stylesheets.>
+							#search-box { display: none; }
+						</n.tweak_for_stylesheets.>
+					</naml>
+				</n.set>
+				<n.set>
+					<name>searchBoxAlignment</name>
+					<value><n.search_box_alignment_value/></value>
+					<default>right</default>
+					<naml>
+						<n.tweak_for_stylesheets.>
+							#search-box { text-align: <n.search_box_alignment_value/>; }
+						</n.tweak_for_stylesheets.>
+					</naml>
+				</n.set>
+				<n.set>
+					<name>showAppTitle</name>
+					<value><n.show_app_title_value/></value>
+					<default>true</default>
+					<naml>
+						<n.tweak_for_stylesheets.>
+							#forum-title { display: none; }
+						</n.tweak_for_stylesheets.>
+					</naml>
+				</n.set>
+				<n.set>
+					<name>appTitleAlignment</name>
+					<value><n.app_title_alignment_value/></value>
+					<default>center</default>
+					<naml>
+						<n.tweak_for_stylesheets.>
+							#forum-title {
+								float: <n.app_title_alignment_value/>;
+							}
+						</n.tweak_for_stylesheets.>
+					</naml>
+				</n.set>
+				<n.set>
+					<name>appDescriptionAlignment</name>
+					<value><n.app_description_alignment_value/></value>
+					<default>center</default>
+					<naml>
+						<n.tweak_for_stylesheets.>
+							#description-box {
+								text-align: <n.app_description_alignment_value/>;
+							}
+						</n.tweak_for_stylesheets.>
+					</naml>
+				</n.set>
+				<n.set>
+					<name>pageLayout</name>
+					<value><n.page_layout_value/></value>
+					<default>wide</default>
+					<naml>
+						<![CDATA[
+							<override_macro name="apply_app_namespace" dot_parameter="do">
+								<n.narrow_app_namespace.do />
+							</override_macro>
+
+							<override_macro name="apply_workgroup_app_namespace" dot_parameter="do">
+								<n.workgroup_narrow_app_namespace.do />
+							</override_macro>
+						]]>
+					</naml>
+				</n.set>
+				<n.set>
+					<name>pictureSizeClassic</name>
+					<value><n.picture_size_classic_value/></value>
+					<default>big</default>
+					<naml>
+						<![CDATA[
+						<override_macro name="has_small_avatar">
+							true
+						</override_macro>
+						]]>
+					</naml>
+				</n.set>
+				<n.set>
+					<name>classicPostsPerPage</name>
+					<value><n.classic_posts_per_page_value/></value>
+					<default>20</default>
+					<naml>
+						<![CDATA[
+						<override_macro name="classic_rows_per_page">
+							]]><n.classic_posts_per_page_value/><![CDATA[
+						</override_macro>
+						]]>
+					</naml>
+				</n.set>
+				<n.set>
+					<name>forumFormat</name>
+					<value><n.forum_format_value/></value>
+					<default>standard</default>
+					<naml>
+						<![CDATA[
+						<override_macro name="call_view_forum">
+							<n.call_view_topics/>
+						</override_macro>
+						]]>
+					</naml>
+				</n.set>
+				<n.set_tweak_for_simple_value
+					name="forumTopicsPerPage"
+					value="[n.forum_topics_per_page_value/]"
+					default="35"
+					macro="forum_topics_per_page"
+				/>
+				<n.set_tweak_for_simple_value
+					name="blogTopicsPerPage"
+					value="[n.blog_topics_per_page_value/]"
+					default="10"
+					macro="blog_topics_per_page"
+				/>
+				<n.set_tweak_for_simple_value
+					name="galleryTopicsPerPage"
+					value="[n.gallery_topics_per_page_value/]"
+					default="16"
+					macro="gallery_topics_per_page"
+				/>
+				<n.set_tweak_for_simple_value
+					name="newsTopicsPerPage"
+					value="[n.news_topics_per_page_value/]"
+					default="25"
+					macro="news_topics_per_page"
+				/>
+				<n.apply/>
+				<n.set_tweak_for_simple_value
+					name="mixedTopicsPerPage"
+					value="[n.mixed_topics_per_page_value/]"
+					default="6"
+					macro="mixed_topics_per_page"
+				/>
+				<n.apply/>
+			</n.naml_configuration.>
+		</then>
+	</n.if.visitor.can_edit.root_node>
+</macro>
+
+<macro name="save_css_config" requires="servlet">
+	<n.if.visitor.can_edit.root_node>
+		<then>
+			<n.naml_configuration.>
+				<n.set>
+					<name>customCss</name>
+					<value><n.custom_css_value/></value>
+					<default></default>
+					<naml>
+						<n.tweak_for_stylesheets.>
+							<n.custom_css_value/>
+						</n.tweak_for_stylesheets.>
+					</naml>
+				</n.set>
+				<n.apply/>
+			</n.naml_configuration.>
+		</then>
+	</n.if.visitor.can_edit.root_node>
+</macro>
+
+<macro name="set_tweak_for_simple_value" parameters="name, value, default, macro" requires="naml_configuration">
+	<n.set>
+		<name><n.name/></name>
+		<value><n.value/></value>
+		<default><n.default/></default>
+		<naml>
+			<![CDATA[
+			<override_macro name="]]><n.macro/><![CDATA[">
+				]]><n.value/><![CDATA[
+			</override_macro>
+			]]>
+		</naml>
+	</n.set>
+</macro>
+
+<macro name="tweak_for_stylesheets" dot_parameter="code">
+	<![CDATA[
+	<override_macro name="site_style">
+		<n.overridden/>
+		]]>
+			<n.compress.code/>
+		<![CDATA[
+	</override_macro>
+	]]>
+</macro>
+
+<macro name="tweak_for_font_family" dot_parameter="font" parameters="selector">
+	<![CDATA[
+	<override_macro name="nabble_stylesheets" unindent="true">
+		<n.overridden/>
+		]]>
+		<n.google_font_link.font/>
+		<style type="text/css">
+			<n.selector/> {
+				font-family: '<n.remove_gwf_prefix.font/>';
+			}
+		</style>
+		<![CDATA[
+	</override_macro>
+	]]>
+</macro>
+
+<macro name="google_font_link" dot_parameter="font">
+	<n.if.starts_with text="[n.font/]" prefix="GWF=">
+		<then>
+			<n.set_var. name="font_name">
+				<n.encode_url.encode_text.substring text="[n.font/]" begin="4"/>
+			</n.set_var.>
+			<![CDATA[
+			<link href='http://fonts.googleapis.com/css?family=]]><n.var name='font_name'/><![CDATA[' rel='stylesheet' type='text/css'/>
+			]]>
+		</then>
+	</n.if.starts_with>
+</macro>
+
+<macro name="remove_gwf_prefix" dot_parameter="font">
+	<n.if.starts_with text="[n.font/]" prefix="GWF=">
+		<then.substring text="[n.font/]" begin="4"/>
+		<else.font/>
+	</n.if.starts_with>
+</macro>
+
+<macro name="font_size_value">
+	<n.get_parameter name="fontSize"/>
+</macro>
+
+<macro name="main_font_value">
+	<n.get_parameter name="mainFontFamily"/>
+</macro>
+
+<macro name="title_font_value">
+	<n.get_parameter name="titleFontFamily"/>
+</macro>
+
+<macro name="show_search_box_value">
+	<n.get_parameter name="showSearchBox"/>
+</macro>
+
+<macro name="search_box_alignment_value">
+	<n.get_parameter name="searchBoxAlignment"/>
+</macro>
+
+<macro name="show_app_title_value">
+	<n.get_parameter name="showAppTitle"/>
+</macro>
+
+<macro name="app_title_alignment_value">
+	<n.get_parameter name="appTitleAlignment"/>
+</macro>
+
+<macro name="app_description_alignment_value">
+	<n.get_parameter name="appDescriptionAlignment"/>
+</macro>
+
+<macro name="picture_size_classic_value">
+	<n.get_parameter name="pictureSizeClassic"/>
+</macro>
+
+<macro name="classic_posts_per_page_value">
+	<n.get_parameter name="classicPostsPerPage"/>
+</macro>
+
+<macro name="forum_format_value">
+	<n.get_parameter name="forumFormat"/>
+</macro>
+
+<macro name="forum_topics_per_page_value">
+	<n.get_parameter name="forumTopicsPerPage"/>
+</macro>
+
+<macro name="blog_topics_per_page_value">
+	<n.get_parameter name="blogTopicsPerPage"/>
+</macro>
+
+<macro name="gallery_topics_per_page_value">
+	<n.get_parameter name="galleryTopicsPerPage"/>
+</macro>
+
+<macro name="news_topics_per_page_value">
+	<n.get_parameter name="newsTopicsPerPage"/>
+</macro>
+
+<macro name="mixed_topics_per_page_value">
+	<n.get_parameter name="mixedTopicsPerPage"/>
+</macro>
+
+<macro name="custom_css_value">
+	<n.get_parameter name="customCss"/>
+</macro>
+
+<macro name="page_layout_value">
+	<n.get_parameter name="pageLayout"/>
+</macro>
+
+<macro name="bg_color_value">
+	<n.get_parameter name="bgColor"/>
+</macro>
+
+<macro name="light_bg_color_value">
+	<n.get_parameter name="lightBgColor"/>
+</macro>
+
+<macro name="shaded_bg_color_value">
+	<n.get_parameter name="shadedBgColor"/>
+</macro>
+
+<macro name="dark_bg_color_value">
+	<n.get_parameter name="darkBgColor"/>
+</macro>
+
+<macro name="highlight_bg_color_value">
+	<n.get_parameter name="highlightBgColor"/>
+</macro>
+
+<macro name="text_color_value">
+	<n.get_parameter name="textColor"/>
+</macro>
+
+<macro name="text_weak_color_value">
+	<n.get_parameter name="textWeakColor"/>
+</macro>
+
+<macro name="title_color_value">
+	<n.get_parameter name="titleColor"/>
+</macro>
+
+<macro name="link_color_value">
+	<n.get_parameter name="linkColor"/>
+</macro>
+
+<macro name="link_visited_color_value">
+	<n.get_parameter name="linkVisitedColor"/>
+</macro>
+
+<macro name="input_text_color_value">
+	<n.get_parameter name="inputTextColor"/>
+</macro>
+
+<macro name="input_bg_color_value">
+	<n.get_parameter name="inputBgColor"/>
+</macro>
+
+<macro name="light_border_color_value">
+	<n.get_parameter name="lightBorderColor"/>
+</macro>
+
+<macro name="medium_border_color_value">
+	<n.get_parameter name="mediumBorderColor"/>
+</macro>
+
+<macro name="dark_border_color_value">
+	<n.get_parameter name="darkBorderColor"/>
+</macro>
+
+<macro name="info_bg_color_value">
+	<n.get_parameter name="infoBgColor"/>
+</macro>
+
+<macro name="info_text_color_value">
+	<n.get_parameter name="infoTextColor"/>
+</macro>
+
+<macro name="error_bg_color_value">
+	<n.get_parameter name="errorBgColor"/>
+</macro>
+
+<macro name="error_text_color_value">
+	<n.get_parameter name="errorTextColor"/>
+</macro>
+
+<macro name="chance_appearance_configurations">
+    fontSize,
+    mainFontFamily,
+    titleFontFamily,
+	bgColor,
+	lightBgColor,
+	shadedBgColor,
+	darkBgColor,
+	highlightBgColor,
+	textColor,
+	textWeakColor,
+	titleColor,
+	linkColor,
+	linkVisitedColor,
+	inputTextColor,
+	inputBgColor,
+	lightBorderColor,
+	mediumBorderColor,
+	darkBorderColor,
+	infoBgColor,
+	infoTextColor,
+	errorBgColor,
+	errorTextColor,
+	showSearchBox,
+	searchBoxAlignment,
+	showAppTitle,
+	appTitleAlignment,
+	appDescriptionAlignment,
+	pageLayout,
+	forumTopicsPerPage,
+	blogTopicsPerPage,
+	newsTopicsPerPage,
+	galleryTopicsPerPage,
+	mixedTopicsPerPage,
+	classicPostsPerPage,
+	pictureSizeClassic,
+	forumFormat,
+	customCss
+</macro>
+
+Macros below define the default colors of Nabble and should be used by custom designs.
+Color configurations override these macros to change the colors of custom designs.
+
+<macro name="bg_color">FFFFFF</macro>
+<macro name="light_bg_color">F2F2F2</macro>
+<macro name="shaded_bg_color">EEEEEE</macro>
+<macro name="dark_bg_color">DDDDDD</macro>
+<macro name="highlight_bg_color">FFFF99</macro>
+<macro name="text_color">000000</macro>
+<macro name="text_weak_color">666666</macro>
+<macro name="title_color">333333</macro>
+<macro name="link_color">0000EE</macro>
+<macro name="link_visited_color">551A8B</macro>
+<macro name="input_text_color">000000</macro>
+<macro name="input_bg_color">FFFFFF</macro>
+<macro name="light_border_color">EEEEEE</macro>
+<macro name="medium_border_color">CCCCCC</macro>
+<macro name="dark_border_color">666666</macro>
+<macro name="info_bg_color">FFFFCC</macro>
+<macro name="info_text_color">000000</macro>
+<macro name="error_bg_color">FFFFCC</macro>
+<macro name="error_text_color">000000</macro>
+