Create a function that accepts the schema and the data, then create the form in that function. Here is a basic example. In production you could use a switch statement in the function for different data types.
Fiddle: http://jsfiddle.net/CR58L/8/
var FormBuilder = function(schema, data) {
this.schema = schema
this.data = data
this.form = document.createElement("form")
this.inputs = []
this.form.addEventListener("submit", this)
this.createInputs()
}
FormBuilder.prototype = {
"createElement": function(field, data, fieldset) {
var fieldset = fieldset || false,
element, value
switch ( data.type ) {
case "String":
element = document.createElement("input")
element.setAttribute("name", field)
value = (fieldset ? this.data[fieldset][field] : this.data[field]) || ""
element.setAttribute("value", value)
if ( data.required === "true" ) element.setAttribute("required", "required")
if ( fieldset ) element.setAttribute("data-fieldset", fieldset)
break;
}
this.inputs.push(element)
return element
},
"createInputs": function() {
var element, fieldset
for ( var field in this.schema ) {
if ( this.schema[field]["type"] ) {
element = this.createElement(field, this.schema[field])
this.form.appendChild(element)
} else {
fieldset = document.createElement("fieldset")
legend = document.createElement("legend")
legend.innerHTML = field
fieldset.appendChild(legend)
for ( var input in this.schema[field] ) {
element = this.createElement(input, this.schema[field][input], field)
fieldset.appendChild(element)
}
this.form.appendChild(fieldset)
}
}
element = document.createElement("button")
element.setAttribute("type", "submit")
element.innerHTML = "Submit"
this.form.appendChild(element)
},
"handleEvent": function(e) {
e.preventDefault()
var element, _dataRef, fieldset
for ( var input in this.inputs ) {
element = this.inputs[input]
fieldset = element.getAttribute("data-fieldset")
_dataRef = fieldset ? this.data[fieldset] : this.data
_dataRef[element.getAttribute("name")] = element.value
}
console.log(data)
}
}
var fb = new FormBuilder(schema, data)
document.getElementById("container").appendChild(fb.form)