var FormView = View.extend({ method: "post", useMinotaur: false, events: { "submit form": "save" }, initialize: function(opt){ if (opt && opt.parent) { this.parent = opt.parent } this.$form = this.$("form") this.$errors = this.$(".errors") this.$errorList = this.$(".errorList") }, reset: function(){ this.$("input,textarea").not("[type='submit']").not("[type='hidden']").val("") }, showErrors: function(errors){ if (errors && errors.length) { this.$errorList.empty(); for (var i in errors) { this.$errorList.append('
' + errors[i] + '
'); } this.$errors.css("opacity", 1.0); setTimeout(function(){ this.$errors.show().css("opacity", 1.0); }.bind(this), 200) } }, serialize: function(){ var fd = new FormData(), hasCSRF = false this.$("input[name], select[name], textarea[name]").each( function(){ if (this.type == "file") { if (this.files.length > 0) { fd.append(this.name, this.files[0]); } } else if (this.type == "password") { if (this.value.length > 0) { fd.append(this.name, SHA1.hex('bucky$' + this.value + '$bucky')) } } else { fd.append(this.name, this.value); hasCSRF = hasCSRF || this.name == "_csrf" } }); if (! hasCSRF) { fd.append("_csrf", $("[name=_csrf]").attr("value")) } return fd }, save: function(e, successCallback, errorCallback){ e && e.preventDefault() this.$errors.hide().css("opacity", 0.0); if (this.validate) { var errors = this.validate() if (errors && errors.length) { if (errorCallback) { errorCallback(errors) } else { this.showErrors(errors) } return } } var action = typeof this.action == "function" ? this.action() : this.action if (! action) return var request = $.ajax({ url: action, type: this.method, data: this.serialize(), headers: { "csrf-token": $("[name=_csrf]").attr("value") }, dataType: "json", processData: false, contentType: false, success: function(response){ if (response.error) { var errors = [] for (var key in response.error.errors) { errors.push(response.error.errors[key].message); } if (errorCallback) { errorCallback(errors) } else { this.showErrors(errors) } return } if (successCallback) { successCallback(response) } if (this.success) { this.success(response) } }.bind(this), error: function(response){ }.bind(this), complete: function(response){ if (this.useMinotaur) { Minotaur.hide() } }.bind(this), }) if (this.useMinotaur) { Minotaur.show() } this.beforeSend && this.beforeSend() }, }) /* var ModalFormView = ModalView.extend(FormView.prototype).extend({ load: function(){ this.reset() this.show() } }) */