sS hselect(S name, Map map, O... params) { ret hselect(map, paramsPlus_skipFirst(params, +name)); } sS hselect(Map map, O... params) { new StringBuilder buf; S selected = null; if (odd(l(params))) { selected = str(first(params)); params = dropFirst(params); } int i = indexOf(params, "allowEmpty"); if (even(i)) { buf.append("\n"); params[i] = params[i+1] = null; } if (nempty(map)) for (O key : keys(map)) { O value = map.get(key); S k = str(key); buf.append(tag("option", htmlencode(str(or(value, ""))), value := k, selected := eq(selected, k) ? "selected" : null)).append("\n"); } ret tag("select", buf, params) + "\n"; }