define( [ 'backbone.validation', 'underscore', 'jQuery/jquery.validation' ], function (Validation, _) { 'use strict'; return function () { var originalOnRender = this.prototype.onRender; var originalOnClose = this.prototype.onClose; var originalBeforeClose = this.prototype.onBeforeClose; var errorHandler = function (response) { if (response.status === 400) { var view = this; var validationErrors = JSON.parse(response.responseText); _.each(validationErrors, function (error) { view.$el.processServerError(error); }); } }; var validatedSync = function (method, model,options) { this.$el.removeAllErrors(); arguments[2].isValidatedCall = true; return model._originalSync.apply(this, arguments).fail(errorHandler.bind(this)); }; var bindToModel = function (model) { if (!model._originalSync) { model._originalSync = model.sync; model.sync = validatedSync.bind(this); } }; this.prototype.onRender = function () { Validation.bind(this); this.bindToModelValidation = bindToModel.bind(this); if (this.model) { this.bindToModelValidation(this.model); } if (originalOnRender) { originalOnRender.call(this); } }; this.prototype.onBeforeClose = function () { if (this.model) { Validation.unbind(this); } if (originalBeforeClose) { originalBeforeClose.call(this); } }; this.prototype.onClose = function () { if (this.model && this.model.isNew()) { this.model.destroy(); } if (originalOnClose) { originalBeforeClose.call(this); } }; return this; }; });