<!DOCTYPE html>
<html lang="en">
	<link rel="stylesheet" href="https://code.jquery.com/mobile/1.4.5/jquery.mobile-1.4.5.min.css" />
	<script src="https://code.jquery.com/jquery-1.11.1.min.js"></script>
	<script src="https://code.jquery.com/mobile/1.4.5/jquery.mobile-1.4.5.min.js"></script>
	<script>	
		$(document).bind('pageinit', function () {
			
			var MSG_DOCUMENT_LOADED = 0;
			var MSG_INPUT_DATA = 1;
			var MSG_GROUP_DATA = 2;
			var MSG_SETTINGS_DATA = 3;
			var MSG_CREATE = 4;
			
			var groupData;
			
			function createElement(group, name, type, config) {
				var element = $("<div>").addClass("unit-config half");
				var input = $("<input>").attr("type", type).attr("data-name", name).attr("data-group", group);
				var inputId = group + "-" + type + "-" + name;
				input.attr("id", inputId).attr("name", inputId);
				var label = $("<label>").text(name).attr("for", inputId);
				if (type === "range") {
					input.attr("step", config.step).attr("value", config.value).attr("min", config.min).attr("max", config.max);
				} else if (type === "checkbox" && config.checked) {
					input.attr("checked", "checked");
				}

				element.append(label).append(input);
				return element;
			}
			
			function createGroupContainer(name) {
				var groupContainer = $("<div>").addClass("ui-corner-all custom-corners");
				var headContainer = $("<div>").addClass("ui-bar ui-bar-b");
				var header = $("<h3>").text(name);
				var contentContainer = $("<div>").addClass("group-content ui-body ui-body-a");
				headContainer.append(header);
				groupContainer.append(headContainer).append(contentContainer);
				return groupContainer;
			}
			
			function createGroup(name, elements) {

				var group = createGroupContainer(name);
				var content = group.find(".group-content");
				for (var i = 0; i < elements.length; i++){
					content.append(createElement(name, elements[i].name, elements[i].type, elements[i].config));
				}
				return group;
			}
			
			function createDump() {
				var group = createGroupContainer("JSON");
				var content = group.find(".group-content");
				var dumpBox = $("<textarea>").attr("cols", 40).attr("rows", 40).attr("id", "dump-box");
				content.append(dumpBox);
				return group;
			}
			
			function updateDump() {
				if (groupData) {
					var filterKeys = Object.keys(groupData);
					if (filterKeys.length > 0) {
						var dataKeys = Object.keys(groupData[filterKeys[0]]);
						var rows = (filterKeys.length) * (dataKeys.length + 2) + 2;
						$("#dump-box").attr("rows", rows).val(JSON.stringify(groupData, null, 2));
					}
				}					
			}
			
			function createNodes() {
				var controls = [
					{name: "count", type: "range", config: {"step": 1, "value": 0, "min":0, "max":30}},
					{name: "distance", type: "range", config: {"step": 0.001, "value": 0.05, "min":0.01, "max":0.1}}
				];
				var groupElement = createGroup("Extra Hand Nodes", controls);
				return groupElement;
			}
			
			EventBridge.scriptEventReceived.connect(function (msg) {
				var message = JSON.parse(msg);
				console.log("MessageType: " + message.type);				
				if (message.type === MSG_GROUP_DATA) {
					groupData = message.data;
					var filterKeys = Object.keys(groupData);
					for (var i = 0; i < filterKeys.length; i++) {
						var parameters = groupData[filterKeys[i]];
						var controls = [
							{name: "stiffness", type: "range", config: {"step": 0.05, "value": parameters.stiffness, "min":0.0, "max":1.0}},
							{name: "gravity", type: "range", config: {"step": 0.0001, "value": parameters.gravity, "min":-0.05, "max":0.05}},
							{name: "damping", type: "range", config: {"step": 0.05, "value": parameters.damping, "min":0.0, "max":1.0}},
							{name: "inertia", type: "range", config: {"step": 0.05, "value": parameters.inertia, "min":0.0, "max":1.0}},
							{name: "delta", type: "range", config: {"step": 0.05, "value": parameters.delta, "min":0.0, "max":1.0}},
							{name: "friction", type: "range", config: {"step": 0.05, "value": parameters.friction, "min":0.0, "max":1.0}}
						];
						var groupElement = createGroup(filterKeys[i], controls);
						$("#control-panel").append(groupElement);
					}
				} else if (message.type === MSG_SETTINGS_DATA) {
					var controls = [
						{name: "avatar", type: "checkbox", config: {"checked": message.data.avatar}},
						{name: "collisions", type: "checkbox", config: {"checked": message.data.collisions}},
						{name: "debug", type: "checkbox", config: {"checked": message.data.debug}},
						{name: "solid", type: "checkbox", config: {"checked": message.data.solid}}
					];
					var groupElement = createGroup("Settings", controls);
					$("#control-panel").append(groupElement);
				} else if (message.type === MSG_CREATE) {
					$("#control-panel").append(createDump());
					$("#nodes-panel").append(createNodes());
					$("#control-panel").trigger('create');
					$("#nodes-panel").trigger('create');
					$("input").change(function(event) {
						var group = $(this).data("group");
						var name = $(this).data("name");
						if (groupData[group] && groupData[group][name]) {
							groupData[group][name] = this.value;
							updateDump();
						}
						EventBridge.emitWebEvent(JSON.stringify({type:MSG_INPUT_DATA, group: group, name: name, value: this.value}));
					});
					updateDump();
				}
			});
			
			$(".nav-text").click(function() {
				var index = $(this).data("idx");
				if (index === 0) {
					$("#nodes-panel").hide();
					$("#control-panel").show();
				} else {
					$("#nodes-panel").show();
					$("#control-panel").hide();
				}
			});

			EventBridge.emitWebEvent(JSON.stringify({type: MSG_DOCUMENT_LOADED}));
		});

	</script>
	
	<head>
		<meta charset="utf-8" />
		<style>
			.unit-config.third{
				width: 33%;
				display: inline-block;
			}
			.unit-config.half{
				width: 49.5%;
				display: inline-block;
			}
			.nav-bar{
				width: 440px;
			}
			.nav-text > a {
				font-size: 20px !important; 
			}
		</style>
		<body>
			<div id="nav-panel" style="margin:10px">
				<div data-role="navbar" class="nav-bar">
					<ul>
						<li class="nav-text" data-idx=0 ><a href="#" class="ui-btn-active">Joints</a></li>
						<li class="nav-text" data-idx=1 ><a href="#" >Nodes</a></li>
					</ul>
				</div><!-- /navbar -->
			</div>
			<div id="control-panel" style="margin:10px">

			</div>
			<div id="nodes-panel" style="margin:10px">

			</div>
		</body>
	</head>
</html>