define(['js/views/validation',
        'gettext',
        'edx-ui-toolkit/js/utils/string-utils',
        'edx-ui-toolkit/js/utils/html-utils',
        'underscore',
        'jquery'],
    function(ValidatingView, gettext, StringUtils, HtmlUtils, _, $) {
        var GraderView = ValidatingView.extend({
    // Model class is CMS.Models.Settings.CourseGrader
            events: {
                'input input': 'updateModel',
                'input textarea': 'updateModel',
        // Leaving change in as fallback for older browsers
                'change input': 'updateModel',
                'change textarea': 'updateModel',
                'click .remove-grading-data': 'deleteModel',
        // would love to move to a general superclass, but event hashes don't inherit in backbone :-(
                'focus :input': 'inputFocus',
                'blur :input': 'inputUnfocus'
            },
            initialize: function() {
                this.listenTo(this.model, 'invalid', this.handleValidationError);
                this.selectorToField = _.invert(this.fieldToSelectorMap);
                this.render();
            },

            render: function() {
                return this;
            },
            fieldToSelectorMap: {
                'type': 'course-grading-assignment-name',
                'short_label': 'course-grading-assignment-shortname',
                'min_count': 'course-grading-assignment-totalassignments',
                'drop_count': 'course-grading-assignment-droppable',
                'weight': 'course-grading-assignment-gradeweight'
            },
            updateModel: function(event) {
        // HACK to fix model sometimes losing its pointer to the collection [I think I fixed this but leaving
        // this in out of paranoia. If this error ever happens, the user will get a warning that they cannot
        // give 2 assignments the same name.]
                if (!this.model.collection) {
                    this.model.collection = this.collection;
                }

                switch (event.currentTarget.id) {
                case 'course-grading-assignment-totalassignments':
                    this.$el.find('#course-grading-assignment-droppable').attr('max', $(event.currentTarget).val());
                    this.setField(event);
                    break;
                case 'course-grading-assignment-name':
            // Keep the original name, until we save
                    this.oldName = this.oldName === undefined ? this.model.get('type') : this.oldName;
            // If the name has changed, alert the user to change all subsection names.
                    if (this.setField(event) != this.oldName && !_.isEmpty(this.oldName)) {
                // overload the error display logic
                        this._cacheValidationErrors.push(event.currentTarget);
                        var message = StringUtils.interpolate(
                    gettext('For grading to work, you must change all {oldName} subsections to {newName}.'),
                            {
                                oldName: this.oldName,
                                newName: this.model.get('type')
                            }
                );
                        HtmlUtils.append($(event.currentTarget).parent(), this.errorTemplate({message: message}));
                    }
                    break;
                default:
                    this.setField(event);
                    break;
                }
            },
            deleteModel: function(e) {
                e.preventDefault();
                this.collection.remove(this.model);
            }
        });

        return GraderView;
    }); // end define()
