(function() { var commands = {}; commands.bind = function(ctx, node, value) { if (node.style.display == "none") return; var value = ctx[value]; if (value == null) { node.style.display = "none"; } else if (typeof(value) == "object" && value.constructor == Array) { if (value.length) { for (var i = 0; i < value.length; i++) { var dup; if (i == value.length - 1) { dup = node; } else { var dup = node.cloneNode(true); node.parentNode.insertBefore(dup, node); } var subctx = value[i]; if (subctx != null && typeof(subctx) == "object") { subctx.$count = value.length; subctx.$index = i + 1; } commands.bind(value, dup, i); } } else { node.style.display = "none"; } } else { if (typeof(value) == "object") { ctx = value; } else { node.innerHTML = value; } renderChildren(ctx, node); } } commands["if"] = function(ctx, node, value) { with(ctx) { if (!(node.parentNode.ifValue = eval("(" + value + ")"))) { node.style.display = "none"; } } } commands["else"] = function(ctx, node, value) { if (node.parentNode.ifValue) { node.style.display = "none"; } else { commands["if"].apply(this, arguments); } } function render(ctx, node) { processCommand(ctx, node, "else"); processCommand(ctx, node, "if"); if (!processCommand(ctx, node, "bind")) { renderChildren(ctx, node); } } function renderChildren(ctx, node) { var nodes = node.childNodes; for (var i = 0; i < nodes.length; i++) { if (nodes[i].nodeType == 1) { render(ctx, nodes[i]); } } } function processCommand(ctx, node, command) { var value; if (value = node.getAttribute(command)) { node.setAttribute(command, ""); commands[command](ctx, node, value); return true; } } renderContext = function(ctx, node) { if (!node) node = document.body; render(ctx, node); } })();