1 (function (callback) {
  2   if (typeof define === 'function' && define.amd) {
  3     define(['core/Core'], callback);
  4   }
  5   else {
  6     callback();
  7   }
  8 }(function () {
  9 
 10 /**
 11  * The Manager acts as the controller in a Model-View-Controller framework. All
 12  * public calls should be performed on the manager object.
 13  *
 14  * @param properties A map of fields to set. Refer to the list of public fields.
 15  * @class AbstractManager
 16  */
 17 AjaxSolr.AbstractManager = AjaxSolr.Class.extend(
 18   /** @lends AjaxSolr.AbstractManager.prototype */
 19   {
 20   /**
 21    * @param {Object} [attributes]
 22    * @param {String} [attributes.solrUrl] The fully-qualified URL of the Solr
 23    *   application. You must include the trailing slash. Do not include the path
 24    *   to any Solr servlet. Defaults to "http://localhost:8983/solr/"
 25    * @param {String} [attributes.proxyUrl] If we want to proxy queries through a
 26    *   script, rather than send queries to Solr directly, set this field to the
 27    *   fully-qualified URL of the script.
 28    * @param {String} [attributes.servlet] The default Solr servlet. You may
 29    *   prepend the servlet with a core if using multiple cores. Defaults to
 30    *   "servlet".
 31    */
 32   constructor: function (attributes) {
 33     AjaxSolr.extend(this, {
 34       solrUrl: 'http://localhost:8983/solr/',
 35       proxyUrl: null,
 36       servlet: 'select',
 37       // The most recent response from Solr.
 38       response: {},
 39       // A collection of all registered widgets.
 40       widgets: {},
 41       // The parameter store for the manager and its widgets.
 42       store: null,
 43       // Whether <tt>init()</tt> has been called yet.
 44       initialized: false
 45     }, attributes);
 46   },
 47 
 48   /**
 49    * An abstract hook for child implementations.
 50    *
 51    * <p>This method should be called after the store and the widgets have been
 52    * added. It should initialize the widgets and the store, and do any other
 53    * one-time initializations, e.g., perform the first request to Solr.</p>
 54    *
 55    * <p>If no store has been set, it sets the store to the basic <tt>
 56    * AjaxSolr.ParameterStore</tt>.</p>
 57    */
 58   init: function () {
 59     this.initialized = true;
 60     if (this.store === null) {
 61       this.setStore(new AjaxSolr.ParameterStore());
 62     }
 63     this.store.load(false);
 64     for (var widgetId in this.widgets) {
 65       this.widgets[widgetId].init();
 66     }
 67     this.store.init();
 68   },
 69 
 70   /**
 71    * Set the manager's parameter store.
 72    *
 73    * @param {AjaxSolr.ParameterStore} store
 74    */
 75   setStore: function (store) { 
 76     store.manager = this;
 77     this.store = store;
 78   },
 79 
 80   /** 
 81    * Adds a widget to the manager.
 82    *
 83    * @param {AjaxSolr.AbstractWidget} widget
 84    */
 85   addWidget: function (widget) { 
 86     widget.manager = this;
 87     this.widgets[widget.id] = widget;
 88   },
 89 
 90   /** 
 91    * Stores the Solr parameters to be sent to Solr and sends a request to Solr.
 92    *
 93    * @param {Boolean} [start] The Solr start offset parameter.
 94    * @param {String} [servlet] The Solr servlet to send the request to.
 95    */
 96   doRequest: function (start, servlet) {
 97     if (this.initialized === false) {
 98       this.init();
 99     }
100     // Allow non-pagination widgets to reset the offset parameter.
101     if (start !== undefined) {
102       this.store.get('start').val(start);
103     }
104     if (servlet === undefined) {
105       servlet = this.servlet;
106     }
107 
108     this.store.save();
109 
110     for (var widgetId in this.widgets) {
111       this.widgets[widgetId].beforeRequest();
112     }
113 
114     this.executeRequest(servlet);
115   },
116 
117   /**
118    * An abstract hook for child implementations.
119    *
120    * <p>Sends the request to Solr, i.e. to <code>this.solrUrl</code> or <code>
121    * this.proxyUrl</code>, and receives Solr's response. It should pass Solr's
122    * response to <code>handleResponse()</code> for handling.</p>
123    *
124    * <p>See <tt>managers/Manager.jquery.js</tt> for a jQuery implementation.</p>
125    *
126    * @param {String} servlet The Solr servlet to send the request to.
127    * @param {String} string The query string of the request. If not set, it
128    *   should default to <code>this.store.string()</code>
129    * @throws If not defined in child implementation.
130    */
131   executeRequest: function (servlet, string) {
132     throw 'Abstract method executeRequest must be overridden in a subclass.';
133   },
134 
135   /**
136    * This method is executed after the Solr response data arrives. Allows each
137    * widget to handle Solr's response separately.
138    *
139    * @param {Object} data The Solr response.
140    */
141   handleResponse: function (data) {
142     this.response = data;
143 
144     for (var widgetId in this.widgets) {
145       this.widgets[widgetId].afterRequest();
146     }
147   },
148 
149   /**
150    * This method is executed if Solr encounters an error.
151    *
152    * @param {String} message An error message.
153    */
154   handleError: function (message) {
155     window.console && console.log && console.log(message);
156   }
157 });
158 
159 }));
160