+// Before the team can be used for searching and related operations,
+// its pz2 object must be created by calling team.makePz2().
+//
+mkws.makeTeam = function($, teamName) {
+ var that = {};
+ var m_teamName = teamName;
+ var m_submitted = false;
+ var m_query; // initially undefined
+ var m_sortOrder; // will be set below
+ var m_perpage; // will be set below
+ var m_filterSet = filterSet(that);
+ var m_totalRecordCount = 0;
+ var m_currentPage = 1;
+ var m_currentRecordId = '';
+ var m_currentRecordData = null;
+ var m_logTime = {
+ // Timestamps for logging
+ "start": $.now(),
+ "last": $.now()
+ };
+ var m_paz; // will be initialised below
+ var m_templateText = {}; // widgets can register templates to be compiled
+ var m_template = {}; // compiled templates, from any source
+ var m_widgets = {}; // Maps widget-type to array of widget objects
+ var m_gotRecords = false;
+
+ var config = mkws.objectInheritingFrom(mkws.config);
+ that.config = config;
+
+ that.toString = function() { return '[Team ' + teamName + ']'; };
+
+ // Accessor methods for individual widgets: readers
+ that.name = function() { return m_teamName; };
+ that.submitted = function() { return m_submitted; };
+ that.sortOrder = function() { return m_sortOrder; };
+ that.perpage = function() { return m_perpage; };
+ that.query = function() { return m_query; };
+ that.totalRecordCount = function() { return m_totalRecordCount; };
+ that.currentPage = function() { return m_currentPage; };
+ that.currentRecordId = function() { return m_currentRecordId; };
+ that.currentRecordData = function() { return m_currentRecordData; };
+ that.filters = function() { return m_filterSet; };
+ that.gotRecords = function() { return m_gotRecords; };
+
+ // Accessor methods for individual widgets: writers
+ that.set_sortOrder = function(val) { m_sortOrder = val };
+ that.set_perpage = function(val) { m_perpage = val };
+
+
+ // The following PubSub code is modified from the jQuery manual:
+ // http://api.jquery.com/jQuery.Callbacks/
+ //
+ // Use as:
+ // team.queue("eventName").subscribe(function(param1, param2 ...) { ... });
+ // team.queue("eventName").publish(arg1, arg2, ...);
+ //
+ var m_queues = {};
+ function queue(id) {
+ if (!m_queues[id]) {
+ var callbacks = $.Callbacks();
+ m_queues[id] = {
+ publish: callbacks.fire,
+ subscribe: callbacks.add,
+ unsubscribe: callbacks.remove
+ };
+ }
+ return m_queues[id];
+ };
+ that.queue = queue;
+
+
+ function _log(fn, s) {
+ var now = $.now();
+ var timestamp = (((now - m_logTime.start)/1000).toFixed(3) + " (+" +
+ ((now - m_logTime.last)/1000).toFixed(3) + ") ");
+ m_logTime.last = now;
+ fn.call(mkws.log, m_teamName + ": " + timestamp + s);
+ that.queue("log").publish(m_teamName, timestamp, s);
+ }
+
+ that.trace = function(x) { _log(mkws.trace, x) };
+ that.debug = function(x) { _log(mkws.debug, x) };
+ that.info = function(x) { _log(mkws.info, x) };
+ that.warn = function(x) { _log(mkws.warn, x) };
+ that.error = function(x) { _log(mkws.error, x) };
+ that.fatal = function(x) { _log(mkws.fatal, x) };
+
+ that.info("making new widget team");
+
+ m_sortOrder = config.sort_default;
+ m_perpage = config.perpage_default;
+
+ // pz2.js event handlers:
+ function onInit() {
+ that.info("init");
+ m_paz.stat();
+ m_paz.bytarget();
+ }
+
+ function onBytarget(data) {
+ that.info("bytarget");
+ queue("targets").publish(data);
+ }
+
+ function onStat(data) {
+ queue("stat").publish(data);
+ var hitcount = parseInt(data.hits[0], 10);
+ if (!m_gotRecords && hitcount > 0) {
+ m_gotRecords = true;
+ queue("firstrecords").publish(hitcount);
+ }
+ if (parseInt(data.activeclients[0], 10) === 0) {
+ that.info("complete");
+ queue("complete").publish(hitcount);
+ }
+ }
+
+ function onTerm(data) {
+ that.info("term");
+ queue("facets").publish(data);
+ }
+
+ function onShow(data, teamName) {
+ that.info("show");
+ m_totalRecordCount = data.merged;
+ that.info("found " + m_totalRecordCount + " records");
+ queue("pager").publish(data);
+ queue("records").publish(data);
+ }
+
+ function onRecord(data, args, teamName) {
+ that.info("record");
+ // FIXME: record is async!!
+ clearTimeout(m_paz.recordTimer);
+ queue("record").publish(data);
+ var detRecordDiv = findnode(recordDetailsId(data.recid[0]));
+ if (detRecordDiv.length) {
+ // in case on_show was faster to redraw element
+ return;
+ }
+ m_currentRecordData = data;
+ var recordDiv = findnode('.' + recordElementId(m_currentRecordData.recid[0]));
+ var html = renderDetails(m_currentRecordData);
+ $(recordDiv).append(html);
+ }
+
+
+ // create a parameters array and pass it to the pz2's constructor
+ // then register the form submit event with the pz2.search function
+ // autoInit is set to true on default
+ that.makePz2 = function() {
+ that.debug("m_queues=" + $.toJSON(m_queues));
+ var params = {
+ "windowid": teamName,
+ "pazpar2path": mkws.pazpar2_url(),
+ "usesessions" : config.use_service_proxy ? false : true,
+ "showtime": 500, //each timer (show, stat, term, bytarget) can be specified this way
+ "termlist": config.facets.join(',')