# Source: src/js/views/RegisterCitationView.js

    /*global define */
    define(['jquery', 'underscore', 'backbone', "common/Utilities", 'text!templates/registerCitation.html'],
        function($, _, Backbone, Utilities, RegisterCitationTemplate) {
        'use strict';

        /**
        * @class RegisterCitationView
        * @classdesc A simple form for a user to input a DOI that cites or uses a dataset in DataONE.
        * When the form is submitted, the citation is registered with the DataONE Metrics service.
        * @classcategory Views
        * @screenshot RegisterCitationView.png
        * @extends Backbone.View
        */
        var RegisterCitationView = Backbone.View.extend(
          /** @lends RegisterCitationView.prototype */ {

            id:               'citation-modal',
            className:        'modal fade hide',

            /**
            * The URL to save the citation to
            * @type {string}
            */
            citationsUrl: MetacatUI.appModel.get("dataoneCitationsUrl"),

            template:         _.template(RegisterCitationTemplate),
            successFooterTemplate: _.template("<button class='btn btn-indigo'" +
                                                " data-dismiss='modal'" +
                                                ">Done</button>"),

            /**
            * The message to display the citation is successfully submitted
            * @type {string}
            */
            successMessage: 'Thank you! Your citation has been successfully submitted. ' +
                 'It may take up to 24 hours to see the citation on the dataset page.',

           /**
           * The message to display the citation has failed to submit
           * @type {string}
           */
            errorMessage: 'Sorry! We encountered an error while registering that citation. Please try ' +
                          'again or try emailing us the citation.',

            events: {
              'hidden'                              : 'teardown',
              'click .btn-register-citation'        : 'registerCitation',
              "focusout #publication-identifier"    : "validateDOI"
            },

            initialize: function(options) {
              _.bindAll(this, 'show', 'teardown', 'render');
              if((typeof options == "undefined")){
                  var options = {};
              }

              this.pid = options.pid;

            },

            /**
            * Shows this view on the page.
            */
            show: function() {
                this.$el.modal('show');
            },

            /**
            * Hides and removes this view from the page.
            */
            teardown: function() {
              this.$el.modal('hide');
              this.$el.data('modal', null);
              this.remove();
            },

            /**
             * Renders the submission form and creates a Bootstrap modal for this view
             */
            render: function() {
              this.$el.html(this.template());
              this.$el.modal({show:false}); // dont show modal on instantiation

              return this;
            },

            /**
             * Get inputs from the modal and sends it to the DataONE Metrics Service
             */
            registerCitation: function() {

              // check if the register button has been disabled
              if (this.$(".btn-register-citation").is(".disabled")) {
                return false;
              }

              // get the input values
              var publicationIdentifier = this.$("#publication-identifier").val();

              var citationType = this.$("#citationTypeCustomSelect").val();
              var relation_type = null;

              // If the user has not selected a valid
              if (citationType != 0) {
                  relation_type = citationType == 1 ? "isCitedBy" : "isReferencedBy";
              }
              else {
                  relation_type = "isCitedBy";
              }

              // get the form data before replacing everything with the loading icon!
              var formData = {};
              var citationObject = {};
              var citaitonRelatedIdentifiersObject = {}

              // initializing the citation POSt object
              formData["request_type"] = "dataset";
              formData["submitter"] = MetacatUI.appUserModel.get("username");
              formData["citations"] = new Array();

              // form the citation object
              citationObject["related_identifiers"] = new Array();
              citationObject["source_id"] = publicationIdentifier;

              // set the related identifiers
              citaitonRelatedIdentifiersObject["identifier"] = this.pid;
              citaitonRelatedIdentifiersObject["relation_type"] = relation_type;

              // include all the required data
              citationObject["related_identifiers"].push(citaitonRelatedIdentifiersObject);
              formData["citations"].push(citationObject);

              // ajax call to submit the given form and then render the results in the content area
              var viewRef = this;

              var requestSettings = {
                type: "POST",
                url: this.citationsUrl,
                contentType: false,
                processData: false,
                data: JSON.stringify(formData),
                dataType: "json",
                success: function(data, textStatus, jqXHR) {

                  MetacatUI.appView.showAlert(viewRef.successMessage, "alert-success",
                                              viewRef.$(".modal-body"), null,
                                              { includeEmail: false,
                                                 replaceContents: true
                                               });

                  viewRef.$(".modal-footer").html(viewRef.successFooterTemplate());
                },
                error: function(){

                  MetacatUI.appView.showAlert(viewRef.errorMessage, "alert-error",
                                              viewRef.$(".modal-body"), null,
                                              { includeEmail: true,
                                                 replaceContents: true
                                               });

                }
              }

              $.ajax(_.extend(requestSettings, MetacatUI.appUserModel.createAjaxSettings()));

            },

            /**
            * Validates if the given input is a valid DOI string or not
            * @since 2.15.0
            * @return {undefined}
            */
            validateDOI: function(){
              var identifierInput = this.$("#publication-identifier").val();

              if(!(Utilities.isValidDOI(identifierInput))){

                //Show a warning that the user was trying to edit old content
                MetacatUI.appView.showAlert({
                  message: "Please enter a valid DOI.",
                  classes: "alert-error",
                  container: this.$("#publication-identifier").parent(),
                  remove: true
                });

                this.$("#publication-identifier").addClass("register-citation-doi-validation");
                this.$(".btn-register-citation").addClass("disabled")
              }
              else {
                //Remove the validation error
                this.$(".alert-container").remove();

                this.$("#publication-identifier").removeClass("register-citation-doi-validation");

                // If the Disabled class is active
                if (this.$(".btn-register-citation").find(".disabled")) {
                  this.$(".btn-register-citation").removeClass("disabled");
                }
              }
            }

        });

         return RegisterCitationView;
      });