+ <:-.if field.units -:>
+ <:-= field.units | html -:>
+ <:-.end if -:>
+ <:.end if -:>
+</span>
+</div>
+<:.end define -:>
+
+<:.define fieldset -:>
+<:# like field, but wrap in a per-field field set.
+parameters:
+ name - field name
+ fields - hash of fields (may be set by page instead)
+:>
+ <:.set f = fields[name] -:>
+ <:.if f.is_hash -:>
+<fieldset>
+ <:.if !f.nolabel -:>
+ <legend><:= f.description :></legend>
+ <:.end if -:>
+ <:.call "input", "name":name, "field":f -:>
+</fieldset>
+ <:.elsif fields.is_hash -:>
+<p>Unknown field id '<b><:= name :></b>', available fields are '<:= fields.keys.join("', '") :>'</p>
+ <:.else -:>
+<p>fields isn't a hash, something is wrong.</p>
+ <:.end if -:>
+<:.end define -:>
+
+<:.define display -:>
+<:# paramaters:
+ name - field name
+ field - entry from fields
+ object - source for defaults in edit mode
+:>
+<: .if object -:>
+<: .set default = object.$name -:>
+<: .end if -:>
+<: .if field.type and field.type eq "date" and default ne "" -:>
+<: .set default = default.replace(/(\d+)\D+(\d+)\D+(\d+)/, "$3/$2/$1") -:>
+<: .elsif field.type and field.type eq "time" and default ne "" -:>
+<: .set default = bse.date(default =~ /:00$/ ? "%I:%M%p" : "%I:%M:%S%p", default).replace(/^0/, "").lower() -:>
+<: .end if -:>
+<: .if field.htmltype eq "textarea" -:>
+<textarea id="<:= name | html :>" name="<:= name | html :>" rows="<:= field.height ? field.height : cfg.entry("forms", "textarea_rows", 10) :>" cols=<:= field.width ? field.width : cfg.entry("textarea_cols", 60) | html :> readonly>
+<:-= default | html -:>
+</textarea>
+<: .elsif field.htmltype eq "checkbox" -:>
+<input id="<:= name | html :>" type="checkbox" name="<:= name | html :>"<:= is_checked ? ' checked="checked"' : '' :> value="<:= field.value ? field.value : 1 | html :>" readonly>
+<: .elsif field.htmltype eq "multicheck" -:>
+<:# we expect default to be a list of selected checks -:>
+<:.set values = field.select["values"] -:>
+<:.set values = values.is_code ? values() : values -:>
+<:.call "make_multicheck",
+ "id":field.select.id,
+ "desc":field.select.label,
+ "readonly":1 -:>
+<: .elsif field.htmltype eq "select" -:>
+<:.set values = field.select["values"] -:>
+<:.set values = values.is_code ? values() : values -:>
+<:# find the selected value and display it's label -:>
+<:.set sid = field.select.id -:>
+<:.set sdesc = field.select.label -:>
+<:.for value in values -:>
+ <:.if value.$id eq default -:>
+ <:= value.$desc -:>
+ <:.end if -:>
+<:.end for -:>
+<: .else -:>
+<input id="<:= name :>" type="text" name="<:= name :>" value="<:= default :>"
+<:-= field.width ? ' size="' _ field.width _ '"' : '' | raw :> readonly>
+<: .end if -:>
+<:.end define -:>
+
+<:.define inlinefieldro -:>
+<:# parameters:
+ name - the field name
+ field - a field, as an entry in fields
+-:>
+ <:.if field.is_hash -:>
+<div>
+ <label for="<:= name :>"><:= field.nolabel ? "" : field.description :>:</label>
+ <span><:.call "display", "name":name -:>
+ <:-.if field.units -:>
+ <:-= field.units -:>
+ <:-.end if -:>
+ <:.end if -:>