Index: binaries/data/mods/public/gui/common/functions_utility.js
===================================================================
--- binaries/data/mods/public/gui/common/functions_utility.js	(revision 18363)
+++ binaries/data/mods/public/gui/common/functions_utility.js	(working copy)
@@ -41,6 +41,59 @@
 	return files;
 }
 
+// Run through a "Content" list and parse elements for formatting and translation
+function parseTextHelper(list)
+{
+	let result = "";
+
+	for (let object of list)
+	{
+		if (object.LangName)
+			result += "[font=\"sans-bold-stroke-14\"]" + escapeText(object.LangName) + "\n";
+
+		if (object.Title)
+			result += "[font=\"sans-bold-stroke-14\"]" + escapeText(translate(object.Title)) + "\n";
+
+		if (object.Subtitle)
+			result += "[font=\"sans-bold-14\"]" + escapeText(translate(object.Subtitle)) + "\n";
+
+		if (object.itemText)
+			result +=  "[font=\"sans-bold-14\"]" + translate("• ");
+		if (object.namedItem)
+			result += "[font=\"sans-14\"]" + sprintf("%(namedItem)s —  ", { "namedItem": escapeText(translate(object.namedItem)) });
+		if (object.itemText)
+			result += "[font=\"sans-14\"]" + escapeText(translate(object.itemText)) + "\n";
+
+		if (object.hotkey)
+			result += "[font=\"sans-14\"]" + sprintf("%(hotkey)s: ", { "hotkey": escapeText(translateWithContext("hotkey", object.hotkey)) });
+
+		if (object.text)
+			result += "[font=\"sans-14\"]" +  escapeText(translate(object.text)) + "\n";
+
+		if (object.newline)
+			result += "\n";
+
+		if (object.List)
+		{
+			for (let element of object.List)
+			{
+				if (element.nick && element.name)
+					result += "[font=\"sans-14\"]" + escapeText(sprintf(translate("%(nick)s - %(name)s"), { "nick": element.nick, "name": element.name })) + "\n";
+				else if (element.nick)
+					result += "[font=\"sans-14\"]" +  escapeText(element.nick) + "\n";
+				else if (element.name)
+					result += "[font=\"sans-14\"]" +  escapeText(element.name) + "\n";
+			}
+			result += "\n";
+		}
+
+		if (object.Content)
+			result += "\n" + parseTextHelper(object.Content) + "\n";
+	}
+
+	return result;
+}
+
 // A sorting function for arrays of objects with 'name' properties, ignoring case
 function sortNameIgnoreCase(x, y)
 {
Index: binaries/data/mods/public/gui/credits/credits.js
===================================================================
--- binaries/data/mods/public/gui/credits/credits.js	(revision 18363)
+++ binaries/data/mods/public/gui/credits/credits.js	(working copy)
@@ -15,7 +15,7 @@
 			continue;
 		}
 		g_ButtonNames[name] = json.Title || name;
-		g_PanelTexts[name] = parseHelper(json.Content);
+		g_PanelTexts[name] = parseTextHelper(json.Content);
 	}
 
 	placeButtons();
@@ -45,43 +45,6 @@
 	}
 }
 
-// Run through a "Content" list and parse elements for formatting and translation
-function parseHelper(list)
-{
-	let result = "";
-
-	for (let object of list)
-	{
-		if (object.LangName)
-			result += "[font=\"sans-bold-stroke-14\"]" + object.LangName + "\n";
-
-		if (object.Title)
-			result += "[font=\"sans-bold-stroke-14\"]" + translate(object.Title) + "\n";
-
-		if (object.Subtitle)
-			result += "[font=\"sans-bold-14\"]" + translate(object.Subtitle) + "\n";
-
-		if (object.List)
-		{
-			for (let element of object.List)
-			{
-				if (element.nick && element.name)
-					result += "[font=\"sans-14\"]" + sprintf(translate("%(nick)s - %(name)s"), { "nick": element.nick, "name": element.name }) + "\n";
-				else if (element.nick)
-					result += "[font=\"sans-14\"]" + element.nick + "\n";
-				else if (element.name)
-					result += "[font=\"sans-14\"]" + element.name + "\n";
-			}
-			result += "\n";
-		}
-
-		if (object.Content)
-			result += "\n" + parseHelper(object.Content) + "\n";
-	}
-
-	return result;
-}
-
 function selectPanel(i)
 {
 	if (g_ActivePanel != -1)
Index: binaries/data/mods/public/gui/credits/credits.xml
===================================================================
--- binaries/data/mods/public/gui/credits/credits.xml	(revision 18363)
+++ binaries/data/mods/public/gui/credits/credits.xml	(working copy)
@@ -8,6 +8,7 @@
 
 <objects>
 	<script file="gui/common/functions_global_object.js"/>
+	<script file="gui/common/functions_utility.js"/>
 	<script directory="gui/credits/"/>
 
 	<!-- Add a translucent black background to fade out the menu page -->
Index: binaries/data/mods/public/gui/lobby/Terms_of_Service.json
===================================================================
--- binaries/data/mods/public/gui/lobby/Terms_of_Service.json	(nonexistent)
+++ binaries/data/mods/public/gui/lobby/Terms_of_Service.json	(working copy)
@@ -0,0 +1,25 @@
+{
+	"Title": "0 A.D. Empires Ascendant Multiplayer Lobby Terms of Service",
+	"Content": [
+		{ "text": "Definitions:" },
+		{ "itemText": "The \"service\" is the 0 A.D. Empires Ascendant Multiplayer Lobby provided by Wildfire Games (WFG)." },
+		{ "itemText": "\"You\" are the user of the service." },
+		{ "itemText": "\"We\" are the collective of all Wildfire Games (WFG) team members." },
+		{ "itemText": "\"Rating\" refers to the process of analyzing various user statistics for the purpose of generating a single comprehensive score." },
+		{ "itemText": "\"Moderate\" refers to the process of enforcing usage policies." },
+		{ "newline": true },
+		{ "item": "By using the service you agree to:" },
+		{ "item": "1. Follow all usage policies." },
+		{ "item": "2. Allow user identifiable statistics to be gathered for the purposes of rating, user profiles, and community statistics." },
+		{ "item": "We also reserve the right to:" },
+		{ "item": "1. Moderate the service." },
+		{ "item": "2. Appoint others to moderate the service." },
+		{ "item": "3. Discontinue or interrupt service at any time with or without prior announcement." },
+		{ "item": "4. Change the service at any time with or without announcement." },
+		{ "item": "5. Delete any and all service data at any time with or without announcement." },
+		{ "item": "6. Collect any or all user identifiable statistics at any time without consent for:" },
+		{ "item": "a. Private analysis by Wildfire Games (WFG) team members and their affiliates." },
+		{ "item": "b. Anonymized public release by Wildfire Games (WFG) team members." },
+		{ "item": "7. Change this document in any way; at any time; on the condition that the user of the service is given adequate notice of the change (the definition of adequate notice will be determined at the time by a panel of Wildfire Games (WFG) team members)." }
+	]
+}
Index: binaries/data/mods/public/gui/lobby/Terms_of_Service.txt
===================================================================
--- binaries/data/mods/public/gui/lobby/Terms_of_Service.txt	(revision 18363)
+++ binaries/data/mods/public/gui/lobby/Terms_of_Service.txt	(nonexistent)
@@ -1,20 +0,0 @@
-0 A.D. Empires Ascendant Multiplayer Lobby Terms of Service
-Definitions:
- * The "service" is the 0 A.D. Empires Ascendant Multiplayer Lobby provided by Wildfire Games (WFG).
- * "You" are the user of the service.
- * "We" are the collective of all Wildfire Games (WFG) team members.
- * "Rating" refers to the process of analyzing various user statistics for the purpose of generating a single comprehensive score.
- * "Moderate" refers to the process of enforcing usage policies.
-By using the service you agree to:
- 1. Follow all usage policies.
- 2. Allow user identifiable statistics to be gathered for the purposes of rating, user profiles, and community statistics.
-We also reserve the right to:
- 1. Moderate the service.
- 2. Appoint others to moderate the service.
- 3. Discontinue or interrupt service at any time with or without prior announcement.
- 4. Change the service at any time with or without announcement.
- 5. Delete any and all service data at any time with or without announcement.
- 6. Collect any or all user identifiable statistics at any time without consent for:
-  a. Private analysis by Wildfire Games (WFG) team members and their affiliates.
-  b. Anonymized public release by Wildfire Games (WFG) team members.
- 7. Change this document in any way; at any time; on the condition that the user of the service is given adequate notice of the change (the definition of adequate notice will be determined at the time by a panel of Wildfire Games (WFG) team members).
Index: binaries/data/mods/public/gui/lobby/Terms_of_Use.json
===================================================================
--- binaries/data/mods/public/gui/lobby/Terms_of_Use.json	(nonexistent)
+++ binaries/data/mods/public/gui/lobby/Terms_of_Use.json	(working copy)
@@ -0,0 +1,23 @@
+{
+	"Title": "0 A.D. Empires Ascendant Multiplayer Lobby Terms of Use",
+	"Content": [
+		{ "text": "Definitions:" },
+		{ "itemText": "The \"service\" is the 0 A.D. Empires Ascendant Multiplayer Lobby provided by Wildfire Games (WFG)." },
+		{ "itemText": "\"You\" are the user of the service." },
+		{ "itemText": "\"Impersonate\" refers to the action in which you attempt to exploit another's identity for your own purposes." },
+		{ "itemText": "\"Spam\" refers to irrelevant or inappropriate messages sent to a large number of recipients." },
+		{ "itemText": "\"Rating\" refers to the per-user comprehensive score." },
+		{ "itemText": "\"Ranked games\" refers to games in which rating changing statistics are tracked." },
+		{ "text": "You agree to:" },
+		{ "text": "1. Only create one account per unique user on the service unless authorized by a Wildfire Games (WFG) team member." },
+		{ "text": "2. Not post profane statements, rude humor, pornographic content, or discriminatory comments on the service." },
+		{ "text": "3. Not purposefully demean the worth of others using the service." },
+		{ "text": "4. Not use the service to promote specific goods, services, or products." },
+		{ "text": "5. Not impersonate other users of the service." },
+		{ "text": "6. Not spam the service." },
+		{ "text": "7. Not attempt to artificially adjust any user of the service's rating or any of the statistics which impact it. (Examples of this are, but are not limited to: cheating in ranked games, reverse engineering the service, and taking advantage of other users of the service.)" },
+		{ "text": "8. Allow yourself to be removed from the service if at any time a moderator determines your behavior is not consistent with these rules." },
+		{ "text": "We also reserve the right to:" },
+		{ "text": "1. Change this document in any way; at any time; on the condition that the user of the service is given adequate notice of the change (the definition of adequate notice will be determined at the time by a panel of Wildfire Games (WFG) team members)." }
+	]
+}
Index: binaries/data/mods/public/gui/lobby/Terms_of_Use.txt
===================================================================
--- binaries/data/mods/public/gui/lobby/Terms_of_Use.txt	(revision 18363)
+++ binaries/data/mods/public/gui/lobby/Terms_of_Use.txt	(nonexistent)
@@ -1,19 +0,0 @@
-0 A.D. Empires Ascendant Multiplayer Lobby Terms of Use
-Definitions:
- * The "service" is the 0 A.D. Empires Ascendant Multiplayer Lobby provided by Wildfire Games (WFG).
- * "You" are the user of the service.
- * "Impersonate" refers to the action in which you attempt to exploit another's identity for your own purposes.
- * "Spam" refers to irrelevant or inappropriate messages sent to a large number of recipients.
- * "Rating" refers to the per-user comprehensive score.
- * "Ranked games" refers to games in which rating changing statistics are tracked.
-You agree to:
- 1. Only create one account per unique user on the service unless authorized by a Wildfire Games (WFG) team member.
- 2. Not post profane statements, rude humor, pornographic content, or discriminatory comments on the service.
- 3. Not purposefully demean the worth of others using the service.
- 4. Not use the service to promote specific goods, services, or products.
- 5. Not impersonate other users of the service.
- 6. Not spam the service.
- 7. Not attempt to artificially adjust any user of the service's rating or any of the statistics which impact it. (Examples of this are, but are not limited to: cheating in ranked games, reverse engineering the service, and taking advantage of other users of the service.)
- 8. Allow yourself to be removed from the service if at any time a moderator determines your behavior is not consistent with these rules.
-We also reserve the right to:
- 1. Change this document in any way; at any time; on the condition that the user of the service is given adequate notice of the change (the definition of adequate notice will be determined at the time by a panel of Wildfire Games (WFG) team members).
Index: binaries/data/mods/public/gui/manual/intro.txt
===================================================================
--- binaries/data/mods/public/gui/manual/intro.txt	(revision 18363)
+++ binaries/data/mods/public/gui/manual/intro.txt	(nonexistent)
@@ -1,130 +0,0 @@
-[font="sans-bold-18"]0 A.D. in-game manual
-[font="sans-14"]
-Thank you for installing 0 A.D.! This page will give a brief overview of the features available in this incomplete, under-development, alpha version of the game.
-
-[font="sans-bold-16"]Graphics settings
-[font="sans-14"]You can switch between fullscreen and windowed mode by pressing Alt + Enter. In windowed mode, you can resize the window. If the game runs too slowly, you can change some settings in the configuration file: look for binaries/data/config/default.cfg in the location where the game is installed, which gives instructions for editing, and try disabling the "fancywater" and "shadows" options.
-
-[font="sans-bold-16"]Playing the game
-[font="sans-14"]The controls and gameplay should be familiar to players of traditional RTS games. There are currently a lot of missing features and poorly-balanced stats – you will probably have to wait until a beta release for it to work well.
-
-Basic controls:
-• Left-click to select units.
-• Left-click-and-drag to select groups of units.
-• Right-click to order units to the target.
-• Arrow keys or WASD keys to move the camera.
-• Ctrl + arrow keys, or shift + mouse wheel, to rotate the camera.
-• Mouse wheel, or "+" and "-" keys, to zoom.
-
-[font="sans-bold-16"]Modes
-[font="sans-14"]The main menu gives access to two game modes:
-
-• [font="sans-bold-14"]Single-player[font="sans-14"] — play a sandbox game or against one or more AI opponents. The AI/AIs are under development and may not always be up to date on the new features, but you can test playing the game against an actual opponent if you aren't able to play with a human.
-
-• [font="sans-bold-14"]Multiplayer[font="sans-14"] — play against human opponents over the internet.
-
-To set up a multiplayer game, one player must select the "Host game" option. The game uses UDP port 20595, so the host must configure their NAT/firewall/etc to allow this. Other players can then select "Join game" and enter the host's IP address.
-
-[font="sans-bold-16"]Game setup
-[font="sans-14"]In a multiplayer game, only the host can alter the game setup options.
-
-First, select what type of map you want to play:
-• [font="sans-bold-14"]Random map[font="sans-14"] — A map created automatically from a script
-• [font="sans-bold-14"]Scenario map[font="sans-14"] — A map created by map designers and with fixed civilisations
-• [font="sans-bold-14"]Skirmish map[font="sans-14"] — A map created by map designers but where the civilisations can be chosen
-
-Then the maps can be futher filtered. The default maps are generally playable maps. Naval maps are maps where not all opponents can be reached over land and demo maps are maps used for testing purposes (generally not useful to play on). The "All Maps" filter shows all maps together in one list.
-
-Finally change the settings. For random maps this includes the number of players, the size of a map, etc. For scenarios you can only select who controls which player (decides where you start on the map etc). The options are either a human player, an AI or no player at all (the opponent will just be idle).
-
-When you are ready to start, click the "Start game" button.
-
-[font="sans-bold-16"]Hotkeys:
-[font="sans-bold-14"]Global
-[font="sans-14"]Alt + F4: Close the game, without confirmation
-Alt + Enter: Toggle between fullscreen and windowed
-~ or F9: Show/hide console
-Alt + F: Show/hide frame counter (FPS)
-F11: Enable/disable real-time profiler (toggles through the displays of information)
-Shift + F11: Save current profiler data to "logs/profile.txt"
-F2: Take screenshot (in .png format, location is displayed in the top left of the GUI after the file has been saved, and can also be seen in the console/logs if you miss it there)
-Shift + F2: Take huge screenshot (6400px*4800px, in .bmp format, location is displayed in the top left of the GUI after the file has been saved, and can also be seen in the console/logs if you miss it there)
-
-[font="sans-bold-14"]In Game
-[font="sans-14"]Double Left Click \[on unit]: Select all of your units of the same kind on the screen (even if they're different ranks)
-Triple Left Click \[on unit]: Select all of your units of the same kind and the same rank on the screen
-Alt + Double Left Click \[on unit]: Select all your units of the same kind on the entire map (even if they have different ranks)
-Alt + Triple Left Click \[on unit]: Select all your units of the same kind and rank on the entire map
-Shift + F5: Quicksave
-Shift + F8: Quickload
-F10: Open/close menu
-F12: Show/hide time elapsed counter
-ESC: Close all dialogs (chat, menu) or clear selected units
-Enter/return: Open/send chat
-T: Send team chat
-Pause: Pause/resume the game
-Delete: Delete currently selected units/buildings
-Shift + Delete: Delete currently selected units/buildings without confirmation
-,: Select idle fighters
-.: Select idle workers (including citizen soldiers)
-H: Stop (halt) the currently selected units.
-Ctrl + 1 (and so on up to Ctrl + 0): Create control group 1 (to 0) from the selected units/buildings
-1 (and so on up to 0): Select the units/buildings in control group 1 (to 0)
-Shift + 1 (to 0): Add control group 1 (to 0) to the selected units/buildings
-Ctrl + F5 (and so on up to F8): Mark the current camera position, for jumping back to later.
-F5, F6, F7, and F8: Move the camera to a marked position. Jump back to the last location if the camera is already over the marked position.
-Z, X, C, V, B, N, M: With training buildings selected. Add the 1st, 2nd, ... unit shown to the training queue for all the selected buildings.
-PageUp with units selected: highlights the units/buildings guarded by the selection.
-PageDown with units/buildings selected: highlights the units guarding the selection.
-Tab: See all status bars (which would also show the building progress)
-
-[font="sans-bold-14"]Modify mouse action
-[font="sans-14"]Ctrl + Right Click on building: Garrison
-Shift + Right Click: Queue the move/build/gather/etc order
-Shift + Left click when training unit/s: Add units in batches of five
-Shift + Left Click or Left Drag over unit on map: Add unit to selection
-Ctrl + Left Click or Left Drag over unit on map: Remove unit from selection
-Alt + Left Drag over units on map: Only select military units
-I + Left Drag over units on map: Only select idle units
-Ctrl + Left Click on unit/group icon with multiple units selected: Deselect
-Right Click with a building/buildings selected: sets a rally point for units created/ungarrisoned from that building.
-Ctrl + Right Click with units selected:
-    - If the cursor is over an allied structure: Garrison
-    - If the cursor is over a non-allied unit or building: Attack (instead of capture or gather)
-    - Otherwise: Attack move (by default all enemy units and structures along the way are targeted, use Ctrl + Q + Right Click to target only units). 
-
-[font="sans-bold-14"]Overlays
-[font="sans-14"]Alt + G: Hide/show the GUI
-Alt + D: Show/hide developer overlay (with developer options)
-Alt + W: Toggle wireframe mode (press once to get wireframes overlaid over the textured models, twice to get just the wireframes colored by the textures, thrice to get back to normal textured mode)
-Alt + S: Toggle unit silhouettes (might give a small performance boost)
-Alt + Z: Toggle sky
-
-[font="sans-bold-14"]Camera manipulation
-[font="sans-14"]W or \[up]: Pan screen up
-S or \[down]: Pan screen down
-A or \[left]: Pan screen left
-D or \[right]: Pan screen right
-Ctrl + W or \[up]: Rotate camera to look upward
-Ctrl + S or \[down]: Rotate camera to look downward
-Ctrl + A or \[left]: Rotate camera clockwise around terrain
-Ctrl + D or \[right]: Rotate camera anticlockwise around terrain
-Q: Rotate camera clockwise around terrain
-E: Rotate camera anticlockwise around terrain
-Shift + Mouse Wheel Rotate Up: Rotate camera clockwise around terrain
-Shift + Mouse Wheel Rotate Down: Rotate camera anticlockwise around terrain
-F: Follow the selected unit (move the camera to stop the camera from following the unit/s)
-R: Reset camera zoom/orientation
-+: Zoom in (keep pressed for continuous zoom)
--: Zoom out (keep pressed for continuous zoom)
-Alt + W: Toggle through wireframe modes
-Middle Mouse Button or / (Forward Slash): Keep pressed and move the mouse to pan
-
-[font="sans-bold-14"]During Building Placement
-[font="sans-14"]\[: Rotate building 15 degrees counter-clockwise
-]: Rotate building 15 degrees clockwise
-Left Drag: Rotate building using mouse (foundation will be placed on mouse release)
-
-[font="sans-bold-14"]When loading a saved game
-[font="sans-14"]Delete: delete the selected saved game asking confirmation
-Shift: do not ask confirmation when deleting a saved game

Property changes on: binaries/data/mods/public/gui/manual/intro.txt
___________________________________________________________________
Deleted: svn:eol-style
## -1 +0,0 ##
-native
\ No newline at end of property
Index: binaries/data/mods/public/gui/manual/manual.js
===================================================================
--- binaries/data/mods/public/gui/manual/manual.js	(revision 18363)
+++ binaries/data/mods/public/gui/manual/manual.js	(working copy)
@@ -2,7 +2,20 @@
 
 function init(data)
 {
-	Engine.GetGUIObjectByName("mainText").caption = Engine.TranslateLines(Engine.ReadFile("gui/" + data.page + ".txt"));
+	let json = Engine.ReadJSONFile("gui/" + data.page + ".json");
+	if (!json || !json.Content)
+	{
+		error("Could not load page" + data.page + "!");
+		return;
+	}
+	let text = ""
+	if (json.Title)
+		text += "[font=\"sans-bold-18\"]" + escapeText(translate(json.Title)) + "\n";
+
+	text += parseTextHelper(json.Content);
+
+	Engine.GetGUIObjectByName("mainText").caption = text;
+
 	if (data.callback)
 		hasCallback = true;
 	if (data.title)
Index: binaries/data/mods/public/gui/manual/manual.json
===================================================================
--- binaries/data/mods/public/gui/manual/manual.json	(nonexistent)
+++ binaries/data/mods/public/gui/manual/manual.json	(working copy)
@@ -0,0 +1,194 @@
+{
+	"Title": "0 A.D. in-game manual",
+	"Content": [
+		{ "newline": true },
+		{ "text": "Thank you for installing 0 A.D.! This page will give a brief overview of the features available in this incomplete, under-development, alpha version of the game." },
+		{ "newline": true },
+		{
+			"Title": "Graphics settings",
+			"Content": [
+				{ "text": "You can switch between fullscreen and windowed mode by pressing Alt + Enter. In windowed mode, you can resize the window. If the game runs too slowly, you can change some settings in the configuration file: look for binaries/data/config/default.cfg in the location where the game is installed, which gives instructions for editing, and try disabling the \"fancywater\" and \"shadows\" options." }
+			]
+		},
+		{
+			"Title": "Playing the game",
+			"Content": [
+				{ "text": "The controls and gameplay should be familiar to players of traditional RTS games. There are currently a lot of missing features and poorly-balanced stats – you will probably have to wait until a beta release for it to work well." },
+				"p",
+				{ "newline": true },
+				{ "text": "Basic controls:" },
+				{ "itemText": "Left-click to select units." },
+				{ "itemText": "Left-click-and-drag to select groups of units." },
+				{ "itemText": "Right-click to order units to the target." },
+				{ "itemText": "Arrow keys or WASD keys to move the camera." },
+				{ "itemText": "Ctrl + arrow keys, or shift + mouse wheel, to rotate the camera." },
+				{ "itemText": "Mouse wheel, or \"+\" and \"-\" keys, to zoom." }
+			]
+		},
+		{
+			"Title": "Modes",
+			"Content": [
+				{ "text": "The main menu gives access to two game modes:" },
+				{
+					"namedItem": "Single-player",
+					"itemText": "play a sandbox game or against one or more AI opponents. The AI/AIs are under development and may not always be up to date on the new features, but you can test playing the game against an actual opponent if you aren't able to play with a human."
+				},
+				{
+					"namedItem": "Multiplayer",
+					"itemText": "play against human opponents over the internet."
+				},
+				{ "newline": true },
+				{ "text": "To set up a multiplayer game, one player must select the \"Host game\" option. The game uses UDP port 20595, so the host must configure their NAT/firewall/etc to allow this. Other players can then select \"Join game\" and enter the host's IP address." }
+			]
+		},
+		{
+			"Title": "Game setup",
+			"Content": [
+				{ "text": "In a multiplayer game, only the host can alter the game setup options." },
+				{ "newline": true },
+				{ "text": "First, select what type of map you want to play:" },
+				{
+					"namedItem": "Random",
+					"itemText": "A map created automatically from a script"
+				},
+				{
+					"namedItem": "Scenario map",
+					"itemText": "A map created by map designers and with fixed civilisations"
+				},
+				{
+					"namedItem": "Skirmish map",
+					"itemText": "A map created by map designers but where the civilisations can be chosen"
+				},
+				{ "newline": true },
+				{ "text": "Then the maps can be futher filtered. The default maps are generally playable maps. Naval maps are maps where not all opponents can be reached over land and demo maps are maps used for testing purposes (generally not useful to play on). The \"All Maps\" filter shows all maps together in one list." },
+				{ "text": "Finally change the settings. For random maps this includes the number of players, the size of a map, etc. For scenarios you can only select who controls which player (decides where you start on the map etc). The options are either a human player, an AI or no player at all (the opponent will just be idle)." },
+				{ "text": "When you are ready to start, click the \"Start game\" button."}
+			]
+		},
+		{
+			"Title": "Hotkeys",
+			"Content": [
+				{
+					"Subtitle": "Global",
+					"Content": [
+						{ "hotkey": "Alt + F4", "text": "Close the game, without confirmation" },
+						{ "hotkey": "Alt + Enter", "text": "Toggle between fullscreen and windowed" },
+						{ "hotkey": "~ or F9", "text": "Show/hide console" },
+						{ "hotkey": "Alt + F", "text": "Show/hide frame counter (FPS)" },
+						{ "hotkey": "F11", "text": "Enable/disable real-time profiler (toggles through the displays of information)" },
+						{ "hotkey": "Shift + F11", "text": "Save current profiler data to \"logs/profile.txt\"" },
+						{ "hotkey": "F2", "text": "Take screenshot (in .png format, location is displayed in the top left of the GUI after the file has been saved, and can also be seen in the console/logs if you miss it there)" },
+						{ "hotkey": "Shift + F2", "text": "Take huge screenshot (6400px*4800px, in .bmp format, location is displayed in the top left of the GUI after the file has been saved, and can also be seen in the console/logs if you miss it there)" }
+					]
+				},
+				{
+					"Subtitle": "In Game",
+					"Content": [
+						{ "hotkey": "Double Left Click [on unit]", "text": "Select all of your units of the same kind on the screen (even if they're different ranks)" },
+						{ "hotkey": "Triple Left Click [on unit]", "text": "Select all of your units of the same kind and the same rank on the screen" },
+						{ "hotkey": "Alt + Double Left Click [on unit]", "text": "Select all your units of the same kind on the entire map (even if they have different ranks)" },
+						{ "hotkey": "Alt + Triple Left Click [on unit]", "text": "Select all your units of the same kind and rank on the entire map" },
+						{ "hotkey": "Shift + F5", "text": "Quicksave" },
+						{ "hotkey": "Shift + F8", "text": "Quickload" },
+						{ "hotkey": "F10", "text": "Open/close menu" },
+						{ "hotkey": "F12", "text": "Show/hide time elapsed counter" },
+						{ "hotkey": "ESC", "text": "Close all dialogs (chat, menu) or clear selected units" },
+						{ "hotkey": "Enter/return", "text": "Open/send chat" },
+						{ "hotkey": "T", "text": "Send team chat" },
+						{ "hotkey": "Pause", "text": "Pause/resume the game" },
+						{ "hotkey": "Delete", "text": "Delete currently selected units/buildings" },
+						{ "hotkey": "Shift + Delete", "text": "Delete currently selected units/buildings without confirmation" },
+						{ "hotkey": ",", "text": "Select idle fighters" },
+						{ "hotkey": ".", "text": "Select idle workers (including citizen soldiers)" },
+						{ "hotkey": "H", "text": "Stop (halt) the currently selected units." },
+						{ "hotkey": "Ctrl + 1 (and so on up to Ctrl + 0)", "text": "Create control group 1 (to 0) from the selected units/buildings" },
+						{ "hotkey": "1 (and so on up to 0)", "text": "Select the units/buildings in control group 1 (to 0)" },
+						{ "hotkey": "Shift + 1 (to 0)", "text": "Add control group 1 (to 0) to the selected units/buildings" },
+						{ "hotkey": "Ctrl + F5 (and so on up to F8)", "text": "Mark the current camera position, for jumping back to later." },
+						{ "hotkey": "F5, F6, F7, and F8", "text": "Move the camera to a marked position. Jump back to the last location if the camera is already over the marked position." },
+						{ "hotkey": "Z, X, C, V, B, N, M", "text": "With training buildings selected. Add the 1st, 2nd, ... unit shown to the training queue for all the selected buildings." },
+						{ "hotkey": "PageUp with units selected", "text": "highlights the units/buildings guarded by the selection." },
+						{ "hotkey": "PageDown with units/buildings selected", "text": "highlights the units guarding the selection." },
+						{ "hotkey": "Tab", "text": "See all status bars (which would also show the building progress)" }
+					]
+				},
+				{
+					"Subtitle": "Modify mouse action",
+					"Content": [
+						{ "hotkey": "Ctrl + Right Click on building", "text": "Garrison" },
+						{ "hotkey": "Shift + Right Click", "text": "Queue the move/build/gather/etc order" },
+						{ "hotkey": "Shift + Left click when training unit/s", "text": "Add units in batches of five" },
+						{ "hotkey": "Shift + Left Click or Left Drag over unit on map", "text": "Add unit to selection" },
+						{ "hotkey": "Ctrl + Left Click or Left Drag over unit on map", "text": "Remove unit from selection" },
+						{ "hotkey": "Alt + Left Drag over units on map", "text": "Only select military units" },
+						{ "hotkey": "I + Left Drag over units on map", "text": "Only select idle units" },
+						{ "hotkey": "Ctrl + Left Click on unit/group icon with multiple units selected", "text": "Deselect" },
+						{ "hotkey": "Right Click with a building/buildings selected", "text": "sets a rally point for units created/ungarrisoned from that building." },
+						{
+							"hotkey": "Ctrl + Right Click with units selected",
+							"Content": [
+								{ "text": "- If the cursor is over an allied structure: Garrison" },
+								{ "text": "- If the cursor is over a non-allied unit or building: Attack (instead of capture or gather)" },
+								{ "text": "- Otherwise: Attack move (by default all enemy units and structures along the way are targeted, use Ctrl + Q + Right Click to target only units)." }
+							]
+						}
+					]
+				},
+				{
+					"Subtitle": "Overlays",
+					"Content": [
+						{ "hotkey": "Alt + G", "text": "Hide/show the GUI" },
+						{ "hotkey": "Alt + D", "text": "Show/hide developer overlay (with developer options)" },
+						{ "hotkey": "Alt + W", "text": "Toggle wireframe mode (press once to get wireframes overlaid over the textured models, twice to get just the wireframes colored by the textures, thrice to get back to normal textured mode)" },
+						{ "hotkey": "Alt + S", "text": "Toggle unit silhouettes (might give a small performance boost)" },
+						{ "hotkey": "Alt + Z", "text": "Toggle sky" }
+					]
+				},
+				{
+					"Subtitle": "Camera manipulation",
+					"Content": [
+						{ "hotkey": "W or [up]", "text": "Pan screen up" },
+						{ "hotkey": "S or [down]", "text": "Pan screen down" },
+						{ "hotkey": "A or [left]", "text": "Pan screen left" },
+						{ "hotkey": "D or [right]", "text": "Pan screen right" },
+						{ "hotkey": "Ctrl + W or [up]", "text": "Rotate camera to look upward" },
+						{ "hotkey": "Ctrl + S or [down]", "text": "Rotate camera to look downward" },
+						{ "hotkey": "Ctrl + A or [left]", "text": "Rotate camera clockwise around terrain" },
+						{ "hotkey": "Ctrl + D or [right]", "text": "Rotate camera anticlockwise around terrain" },
+						{ "hotkey": "Q", "text": "Rotate camera clockwise around terrain" },
+						{ "hotkey": "E", "text": "Rotate camera anticlockwise around terrain" },
+						{ "hotkey": "Shift + Mouse Wheel Rotate Up", "text": "Rotate camera clockwise around terrain" },
+						{ "hotkey": "Shift + Mouse Wheel Rotate Down", "text": "Rotate camera anticlockwise around terrain" },
+						{ "hotkey": "F", "text": "Follow the selected unit (move the camera to stop the camera from following the unit/s)" },
+						{ "hotkey": "R", "text": "Reset camera zoom/orientation" },
+						{ "hotkey": "+", "text": "Zoom in (keep pressed for continuous zoom)" },
+						{ "hotkey": "-", "text": "Zoom out (keep pressed for continuous zoom)" },
+						{ "hotkey": "Alt + W", "text": "Toggle through wireframe modes" },
+						{ "hotkey": "Middle Mouse Button or / (Forward Slash)", "text": "Keep pressed and move the mouse to pan" }
+					]
+				},
+				{
+					"Subtitle": "During Building Placement",
+					"Content": [
+						{ "hotkey": "[", "text": "Rotate building 15 degrees counter-clockwise" },
+						{ "hotkey": "]", "text": "Rotate building 15 degrees clockwise" },
+						{ "hotkey": "Left Drag", "text": "Rotate building using mouse (foundation will be placed on mouse release)"}
+					]
+				},
+				{
+					"Subtitle": "When loading a saved game",
+					"Content": [
+						{ "hotkey": "Delete", "text": "delete the selected saved game asking confirmation" },
+						{ "hotkey": "Shift", "text": "do not ask confirmation when deleting a saved game" }
+					]
+				}
+			]
+		}
+	]
+}
+
+
+
+
+
+
Index: binaries/data/mods/public/gui/manual/manual.xml
===================================================================
--- binaries/data/mods/public/gui/manual/manual.xml	(revision 18363)
+++ binaries/data/mods/public/gui/manual/manual.xml	(working copy)
@@ -2,6 +2,7 @@
 
 <objects>
 	<script file="gui/common/functions_global_object.js"/>
+	<script file="gui/common/functions_utility.js"/>
 	<script file="gui/manual/manual.js"/>
 
 	<!-- Add a translucent black background to fade out the menu page -->
Index: binaries/data/mods/public/gui/manual/userreport.json
===================================================================
--- binaries/data/mods/public/gui/manual/userreport.json	(nonexistent)
+++ binaries/data/mods/public/gui/manual/userreport.json	(working copy)
@@ -0,0 +1,15 @@
+{
+	"Content": [
+		{ "text": "As a free, open source game, we don't have the resources to test on a wide range of systems, but we want to provide the best quality experience to as many players as possible. When you enable automatic feedback, we'll receive data to help us understand the hardware we should focus on supporting, and to identify performance problems we should fix." },
+		{ "newline": true },
+		{ "text": "The following data will be sent to our server:" },
+		{ "itemText": "A random user ID (stored in %APPDATA%\0ad\config\user.cfg on Windows, ~/.config/0ad/config/user.cfg on Unix), to let us detect repeated reports from the same user." },
+		{ "itemText": "Game version number and basic build settings (optimisation mode, CPU architecture, timestamp, compiler version)." },
+		{ "itemText": "Hardware details: OS version, graphics driver version, OpenGL capabilities, screen size, CPU details, RAM size." },
+		{ "itemText": "Performance details: a snapshot of timing data a few seconds after you start a match or change graphics settings." },
+		{ "newline": true },
+		{ "text": "The data will only be a few kilobytes each time you run the game, so bandwidth usage is minimal." },
+		{ "newline": true },
+		{ "text": "We will store the submitted data on our server, and may publish statistics or non-user-identifiable details to help other game developers with similar questions. We will store the IP address that submitted the data, to help detect abuse of the service, but will not publish it. The published data can be seen at http://feedback.wildfiregames.com/" }
+	]
+}
Index: binaries/data/mods/public/gui/manual/userreport.txt
===================================================================
--- binaries/data/mods/public/gui/manual/userreport.txt	(revision 18363)
+++ binaries/data/mods/public/gui/manual/userreport.txt	(nonexistent)
@@ -1,12 +0,0 @@
-As a free, open source game, we don't have the resources to test on a wide range of systems, but we want to provide the best quality experience to as many players as possible. When you enable automatic feedback, we'll receive data to help us understand the hardware we should focus on supporting, and to identify performance problems we should fix.
-
-The following data will be sent to our server:
-
-• A random user ID (stored in %APPDATA%\0ad\config\user.cfg on Windows, ~/.config/0ad/config/user.cfg on Unix), to let us detect repeated reports from the same user.
-• Game version number and basic build settings (optimisation mode, CPU architecture, timestamp, compiler version).
-• Hardware details: OS version, graphics driver version, OpenGL capabilities, screen size, CPU details, RAM size.
-• Performance details: a snapshot of timing data a few seconds after you start a match or change graphics settings.
-
-The data will only be a few kilobytes each time you run the game, so bandwidth usage is minimal.
-
-We will store the submitted data on our server, and may publish statistics or non-user-identifiable details to help other game developers with similar questions. We will store the IP address that submitted the data, to help detect abuse of the service, but will not publish it. The published data can be seen at http://feedback.wildfiregames.com/

Property changes on: binaries/data/mods/public/gui/manual/userreport.txt
___________________________________________________________________
Deleted: svn:eol-style
## -1 +0,0 ##
-native
\ No newline at end of property
Index: binaries/data/mods/public/gui/pregame/mainmenu.xml
===================================================================
--- binaries/data/mods/public/gui/pregame/mainmenu.xml	(revision 18363)
+++ binaries/data/mods/public/gui/pregame/mainmenu.xml	(working copy)
@@ -151,7 +151,7 @@
 					<action on="Press">
 						closeMenu();
 						<![CDATA[
-							Engine.PushGuiPage("page_manual.xml", {"page":"manual/intro", "title":getManual(), "url":"http://trac.wildfiregames.com/wiki/0adManual"});
+							Engine.PushGuiPage("page_manual.xml", {"page":"manual/manual", "title":getManual(), "url":"http://trac.wildfiregames.com/wiki/0adManual"});
 						]]>
 					</action>
 				</object>
Index: binaries/data/mods/public/gui/session/menu.js
===================================================================
--- binaries/data/mods/public/gui/session/menu.js	(revision 18363)
+++ binaries/data/mods/public/gui/session/menu.js	(working copy)
@@ -748,7 +748,7 @@
 	pauseGame();
 
 	Engine.PushGuiPage("page_manual.xml", {
-		"page": "manual/intro",
+		"page": "manual/manual",
 		"title": translate("Manual"),
 		"url": "http://trac.wildfiregames.com/wiki/0adManual",
 		"callback": "resumeGame"
Index: binaries/data/mods/public/l10n/messages.json
===================================================================
--- binaries/data/mods/public/l10n/messages.json	(revision 18363)
+++ binaries/data/mods/public/l10n/messages.json	(working copy)
@@ -161,13 +161,22 @@
                     }
                 }
             },
-            {
-                "extractor": "txt",
+			{
+                "extractor": "json",
                 "filemasks": [
-                    "gui/lobby/Terms_of_Service.txt",
-                    "gui/lobby/Terms_of_Use.txt"
+                    "gui/lobby/**.json"
                 ],
                 "options": {
+                    "keywords": [
+                        "Title",
+                        "Subtitle",
+                        "text",
+						"itemText",
+						"namedItem",
+                        "hotkey": {
+                            "tagAsContext": true
+						}
+                    ]
                 }
             }
         ]
@@ -213,13 +222,22 @@
                     }
                 }
             },
-            {
-                "extractor": "txt",
+			{
+                "extractor": "json",
                 "filemasks": [
-                    "gui/manual/intro.txt",
-                    "gui/manual/userreport.txt"
+                    "gui/manual/**.json"
                 ],
                 "options": {
+                    "keywords": [
+                        "Title",
+                        "Subtitle",
+                        "text",
+						"itemText",
+						"namedItem",
+                        "hotkey": {
+                            "tagAsContext": true
+						}
+                    ]
                 }
             }
         ]
