1 define(function(require) {
 
   5     var $ = require('libs/jquery'),
 
   6         _ = require('libs/underscore'),
 
   7         Backbone = require('libs/backbone'),
 
   8         dialogTemplate = require('libs/text!./dialog.html'),
 
  10         fieldTemplates.checkbox = require('libs/text!./templates/checkbox.html');
 
  11         fieldTemplates.select = require('libs/text!./templates/select.html');
 
  12         fieldTemplates.textarea = require('libs/text!./templates/textarea.html');
 
  13         fieldTemplates.input = require('libs/text!./templates/input.html');
 
  17     var DialogView = Backbone.View.extend({
 
  18         template: _.template(dialogTemplate),
 
  20             'click .execute-btn': 'onExecute',
 
  21             'click .cancel-btn': 'onCancel',
 
  22             'click .close': 'close'
 
  24         initialize: function() {
 
  26             this.actionsDisabled = false;
 
  29             this.setElement(this.template(_.extend({
 
  30                 executeButtonText: null,
 
  31                 cancelButtonText: null,
 
  36             var body = this.$('.modal-body');
 
  37             (this.options.fields || []).forEach(function(field) {
 
  38                 var template = fieldTemplates[field.type];
 
  40                     throw new Error('Field type {type} not recognized.'.replace('{type}', field.type));
 
  42                 var widget = $(_.template(template)(_.extend({description: '', initialValue: ''}, field)));
 
  46                 if(_.isFunction(field.prePasteHandler) && field.type === 'input') { // TODO: extract this out to widget specific impl.
 
  47                     widget.find('input').on('paste', function(e) {
 
  48                         var clipboardData = e.originalEvent.clipboardData;
 
  49                         if(!clipboardData || !clipboardData.getData) {
 
  53                         var text = clipboardData.getData('text/plain').replace(/\r?\n|\r/g, ' ');
 
  54                         $(e.target).val(field.prePasteHandler(text));
 
  59             if(this.options.text) {
 
  60                 body.append('<p>' + this.options.text + '</p>');
 
  63             this.$el.modal({backdrop: 'static'});
 
  64             this.$el.modal('show');
 
  65             this.$('textarea, input').first().focus();
 
  67         onExecute: function(e) {
 
  72             (this.options.fields || []).forEach(function(field) {
 
  73                 var widget = view.$('[name=' + field.name +']');
 
  74                 formData[field.name] = widget.val();
 
  77             this.trigger('execute', {
 
  79                 success: function() { view.actionsDisabled = false; view.close(); },
 
  80                 error: function() { view.actionsDisabled = false; view.close(); },
 
  83         onCancel: function() {
 
  84             this.trigger('cancel');
 
  91             if(!this.actionsDisabled) {
 
  92                 this.$el.modal('hide');
 
  95             this.trigger('close');
 
  97         toggleButtons: function(toggle) {
 
  98             this.$('.btn, button').toggleClass('disabled', !toggle);
 
  99             this.$('textarea').attr('disabled', !toggle);
 
 100             this.actionsDisabled = !toggle;
 
 102         setContentView: function(view) {
 
 103             var body = this.$('.modal-body');
 
 109         create: function(config) {
 
 110             return new DialogView(config);