%!
from itertools import izip_longest
%>
<%def name="renderControl(id_name, value, props)" >
%if props.html_type == "select":
%elif props.html_type == "checkbox":
%else:
%if getattr(props, 'html_help', False):
${props.html_help}
%endif
%endif
%def>
<%def name="renderFormLine(field_id_name, field, props, values, errors)">
${self.renderControl(id_name = field_id_name, value=values.get(field, ""), props = props)}
%if field in errors:
${errors[field]}
%endif
%def>
<%def name="buildListSubform(key, position, schema, values, errors)">
<${schema.html_tag} class="form-embedded ${schema.html_classes}" ${'id="template-{}"'.format(key.replace(".","-")) if position == 0 else ""|n}>
${position+1}
%for i, field in enumerate(schema.form_order):
<%
props = schema.fields[field]
field_id_name = "{}-{}.{}".format(key, position, field)
%>
${self.renderFormLine(field_id_name, field, props, values, getattr(errors, "error_dict", dict()))}
%endfor
${schema.html_tag}>
%def>
<%def name="buildSubform(key, schema, values, errors)">
<${schema.html_tag} class="${schema.html_classes}">
%for i, field in enumerate(schema.form_order):
<%
props = schema.fields[field]
field_id_name = "{}.{}".format(key, field)
%>
${self.renderFormLine(field_id_name, field, props, values, getattr(errors, "error_dict", dict()))}
%endfor
${schema.html_tag}>
%def>
<%def name="buildform(schema, values, errors)">
<%
values = values[schema.form_id]
errors = errors[schema.form_id]
%>
%def>
<%def name="buildValidators(root)">
%if request._LOCALE_ == 'de':
$.validator.methods.range = function (value, element, param) {
var globalizedValue = value.replace(",", ".");
return this.optional(element) || (globalizedValue >= param[0] && globalizedValue <= param[1]);
}
$.validator.methods.number = function (value, element) {
return this.optional(element) || /^-?(?:\d+|\d{1,3}(?:[\s\.,]\d{3})+)(?:[\.,]\d+)?$/.test(value);
}
%endif
${root}.find("form.form-validated").each(function(index, form){
$(form).validate({
errorClass: "help-inline"
,errorElement: "span"
,highlight: function (element, errorClass, validClass) {
$(element).closest(".control-group").addClass("error");
}
, unhighlight: function (element, errorClass, validClass) {
$(element).closest(".control-group").removeClass("error");
}
});
});
${root}.on({click:function(e){
var $target = $(e.target)
, $embeddedForm = $target.closest(".form-embedded")
, refLink = $target.closest(".form-embedded-wrapper").find(".add-more-listitem")
, delLink = $target.remove();
refLink.attr("_field_position", parseInt(refLink.attr("_field_position"), 10) - 1);
if($embeddedForm.prevAll(".form-embedded").length>1){
$embeddedForm.prev().prepend(delLink);
}
$embeddedForm.remove();
}
}, ".add-more-delete-link");
${root}.on({
click : function(e){
var $target = $(e.target)
, $form = $target.closest("form")
, templ = $("#template-"+$target.attr("_field_key"))
, new_node = templ.clone().removeAttr("id")
, new_position = parseInt($target.attr("_field_position"), 10) + 1
, inc = function(elem, attr){
elem.attr(attr, elem.attr(attr).replace(/-[0-9]+\./g, "-"+new_position+"."))
};
new_node.find("label").each(function(index, elem){
elem = $(elem); inc(elem, "for");
});
new_node.find("input,select,textarea").each(function(index, elem){
elem = $(elem);
inc(elem, "id");
inc(elem, "name");
elem.val("");
});
new_node.find(".control-number").html(new_position+1);
$target.attr("_field_position", new_position);
$target.closest(".add-more").before(new_node);
var delete_link = $form.find(".add-more-delete-link").remove();
if(delete_link.length === 0){
delete_link = $('×')
}
new_node.prepend(delete_link);
}
}, ".add-more-listitem");
%def>