text: (function(define, undefined) {
      'use strict';
      define([
          'jquery', 'underscore', 'annotator_1.2.9',
          'js/edxnotes/utils/logger', 'js/edxnotes/utils/notes_collector',
          'js/edxnotes/views/shim', 'js/edxnotes/plugins/scroller',
          'js/edxnotes/plugins/events', 'js/edxnotes/plugins/accessibility',
          'js/edxnotes/plugins/caret_navigation',
          'js/edxnotes/plugins/store_error_handler',
          'js/edxnotes/plugins/search_override'
      ], function($, _, Annotator, NotesLogger, NotesCollector) {
          var plugins = ['Auth', 'Store', 'Scroller', 'Events', 'Accessibility', 'CaretNavigation', 'Tags'],
              getOptions, setupPlugins, getAnnotator;
  
      /**
       * Returns options for the annotator.
       * @param {jQuery Element} The container element.
       * @param {String} params.endpoint The endpoint of the store.
       * @param {String} params.user User id of annotation owner.
       * @param {String} params.usageId Usage Id of the component.
       * @param {String} params.courseId Course id.
       * @param {String} params.token An authentication token.
       * @param {String} params.tokenUrl The URL to request the token from.
       * @return {Object} Options.
       **/
          getOptions = function(element, params) {
              var defaultParams = {
                      user: params.user,
                      usage_id: params.usageId,
                      course_id: params.courseId
                  },
                  prefix = params.endpoint.replace(/(.+)\/$/, '$1');
  
              return {
                  auth: {
                      token: params.token,
                      tokenUrl: params.tokenUrl
                  },
                  events: {
                      stringLimit: params.eventStringLimit
                  },
                  store: {
                      prefix: prefix,
                      annotationData: defaultParams,
                      loadFromSearch: defaultParams,
                      urls: {
                          create: '/annotations/',
                          read: '/annotations/:id/',
                          update: '/annotations/:id/',
                          destroy: '/annotations/:id/',
                          search: '/search/'
                      }
                  }
              };
          };
  
      /**
       * Setups plugins for the annotator.
       * @param {Object} annotator An instance of the annotator.
       * @param {Array} plugins A list of plugins for the annotator.
       * @param {Object} options An options for the annotator.
       **/
          setupPlugins = function(annotator, plugins, options) {
              _.each(plugins, function(plugin) {
                  var settings = options[plugin.toLowerCase()];
                  annotator.addPlugin(plugin, settings);
              }, this);
          };
  
      /**
       * Factory method that returns Annotator.js instantiates.
       * @param {DOM Element} element The container element.
       * @param {String} params.endpoint The endpoint of the store.
       * @param {String} params.user User id of annotation owner.
       * @param {String} params.usageId Usage Id of the component.
       * @param {String} params.courseId Course id.
       * @param {String} params.token An authentication token.
       * @param {String} params.tokenUrl The URL to request the token from.
       * @return {Object} An instance of Annotator.js.
       **/
          getAnnotator = function(element, params) {
              var $el = $(element),
                  options = getOptions($el, params),
                  logger = NotesLogger.getLogger(element.id, params.debug),
                  annotator;
  
              annotator = $el.annotator(options).data('annotator');
              setupPlugins(annotator, plugins, options);
              NotesCollector.storeNotesRequestData(
                  {annotator: annotator, params: params},
                  $('.edx-notes-wrapper').length
              );
              annotator.logger = logger;
              logger.log({element: element, options: options});
              return annotator;
          };
  
          return {
              factory: getAnnotator
          };
      });
  }).call(this, define || RequireJS.define);
  