diff options
Diffstat (limited to 'SemanticResultFormats/formats/Exhibit/exhibit/scripts/exhibit.js')
-rw-r--r-- | SemanticResultFormats/formats/Exhibit/exhibit/scripts/exhibit.js | 395 |
1 files changed, 395 insertions, 0 deletions
diff --git a/SemanticResultFormats/formats/Exhibit/exhibit/scripts/exhibit.js b/SemanticResultFormats/formats/Exhibit/exhibit/scripts/exhibit.js new file mode 100644 index 00000000..ef97aeae --- /dev/null +++ b/SemanticResultFormats/formats/Exhibit/exhibit/scripts/exhibit.js @@ -0,0 +1,395 @@ +/*====================================================================== + * Exhibit + * http://simile.mit.edu/wiki/Exhibit/API/Exhibit + *====================================================================== + */ + +Exhibit.create = function(database) { + return new Exhibit._Impl(database); +}; + +Exhibit.getAttribute = function(elmt, name, splitOn) { + try { + var value = elmt.getAttribute(name); + if (value == null || value.length == 0) { + value = elmt.getAttribute("ex:" + name); + if (value == null || value.length == 0) { + return null; + } + } + if (splitOn == null) { + return value; + } + var values = value.split(splitOn); + for (var i = 0; value = values[i]; i++) { + values[i] = value.trim(); + } + return values; + } catch(e) { + return null; + } +}; + +Exhibit.getRoleAttribute = function(elmt) { + var role = Exhibit.getAttribute(elmt, "role") || ""; + role = role.replace(/^exhibit-/, ""); + return role; +}; + +Exhibit.getConfigurationFromDOM = function(elmt) { + var c = Exhibit.getAttribute(elmt, "configuration"); + if (c != null && c.length > 0) { + try{ + var o = eval(c); + if (typeof o == "object") { + return o; + } + } catch (e) {} + } + return {}; +}; + +Exhibit.extractOptionsFromElement = function(elmt) { + var opts = {}; + var attrs = elmt.attributes; + for (var i in attrs) { + if (attrs.hasOwnProperty(i)) { + var name = attrs[i].nodeName; + var value = attrs[i].nodeValue; + if (name.indexOf('ex:') == 0) { + name = name.substring(3); + } + opts[name] = value; + } + } + return opts; +} + +Exhibit.getExporters = function() { + Exhibit._initializeExporters(); + return [].concat(Exhibit._exporters); +}; + +Exhibit.addExporter = function(exporter) { + Exhibit._initializeExporters(); + Exhibit._exporters.push(exporter); +}; + +Exhibit._initializeExporters = function() { + if (!("_exporters" in Exhibit)) { + Exhibit._exporters = [ + Exhibit.RdfXmlExporter, + Exhibit.SemanticWikitextExporter, + Exhibit.TSVExporter, + Exhibit.ExhibitJsonExporter, + Exhibit.FacetSelectionExporter + ]; + } +}; + +/*================================================== + * Exhibit._Impl + *================================================== + */ +Exhibit._Impl = function(database) { + this._database = database != null ? + database : + ("database" in window ? + window.database : + Exhibit.Database.create()); + + this._uiContext = Exhibit.UIContext.createRootContext({}, this); + this._collectionMap = {}; + this._componentMap= {}; + + this._historyListener = { + onBeforePerform: function(action) { if(action.lengthy) { Exhibit.UI.showBusyIndicator();} }, + onAfterPerform: function(action) { if(action.lengthy) { Exhibit.UI.hideBusyIndicator();} }, + onBeforeUndoSeveral: function() { Exhibit.UI.showBusyIndicator();}, + onAfterUndoSeveral: function() { Exhibit.UI.hideBusyIndicator();}, + onBeforeRedoSeveral: function() { Exhibit.UI.showBusyIndicator();}, + onAfterRedoSeveral: function() { Exhibit.UI.hideBusyIndicator();} + }; + SimileAjax.History.addListener(this._historyListener); +}; + +Exhibit._Impl.prototype.dispose = function() { + SimileAjax.History.removeListener(this._historyListener); + + for (var id in this._componentMap) { + try{ + this._componentMap[id].dispose(); + }catch(e) { + SimileAjax.Debug.exception(e, "Failed to dispose component"); + } + } + for (var id in this._collectionMap) { + try{ + this._collectionMap[id].dispose(); + } catch(e) { + SimileAjax.Debug.exception(e, "Failed to dispose collection"); + } + } + + this._uiContext.dispose(); + + this._componentMap = null; + this._collectionMap = null; + this._uiContext = null; + this._database = null; +}; + +Exhibit._Impl.prototype.getDatabase = function() { + return this._database; +}; + +Exhibit._Impl.prototype.getUIContext = function() { + return this._uiContext; +}; + +Exhibit._Impl.prototype.getCollection = function(id) { + var collection = this._collectionMap[id]; + if (collection == null && id == "default") { + collection = Exhibit.Collection.createAllItemsCollection(id, this._database); + this.setDefaultCollection(collection); + } + return collection; +}; + +Exhibit._Impl.prototype.getDefaultCollection = function() { + return this.getCollection("default"); +}; + +Exhibit._Impl.prototype.setCollection = function(id, c) { + if (id in this._collectionMap) { + try{ + this._collectionMap[id].dispose(); + } catch(e) { + SimileAjax.Debug.exception(e); + } + } + this._collectionMap[id] = c; +}; + +Exhibit._Impl.prototype.setDefaultCollection = function(c) { + this.setCollection("default", c); +}; + +Exhibit._Impl.prototype.getComponent = function(id) { + return this._componentMap[id]; +}; + +Exhibit._Impl.prototype.setComponent = function(id, c) { + if (id in this._componentMap) { + try{ + this._componentMap[id].dispose(); + } catch(e) { + SimileAjax.Debug.exception(e); + } + } + + this._componentMap[id] = c; +}; + +Exhibit._Impl.prototype.disposeComponent = function(id) { + if (id in this._componentMap) { + try{ + this._componentMap[id].dispose(); + } catch(e) { + SimileAjax.Debug.exception(e); + } + delete this._componentMap[id]; + } +}; + +Exhibit._Impl.prototype.configure = function(configuration) { + if ("collections" in configuration) { + for (var i = 0; i < configuration.collections.length; i++) { + var config = configuration.collections[i]; + var id = config.id; + if (id == null || id.length == 0) { + id = "default"; + } + this.setCollection(id, Exhibit.Collection.create2(id, config, this._uiContext)); + } + } + if ("components" in configuration) { + for (var i = 0; i < configuration.components.length; i++) { + var config = configuration.components[i]; + var component = Exhibit.UI.create(config, config.elmt, this._uiContext); + if (component != null) { + var id = elmt.id; + if (id == null || id.length == 0) { + id = "component" + Math.floor(Math.random() * 1000000); + } + this.setComponent(id, component); + } + } + } +}; + +/** + * Set up this Exhibit's view from its DOM configuration. + * @param {Node} root optional root node, below which configuration gets read + * (defaults to document.body, when none provided) + */ +Exhibit._Impl.prototype.configureFromDOM = function(root) { + var collectionElmts = []; + var coderElmts = []; + var coordinatorElmts = []; + var lensElmts = []; + var facetElmts = []; + var otherElmts = []; + var f = function(elmt) { + var role = Exhibit.getRoleAttribute(elmt); + if (role.length > 0) { + switch (role) { + case "collection": collectionElmts.push(elmt); break; + case "coder": coderElmts.push(elmt); break; + case "coordinator": coordinatorElmts.push(elmt); break; + case "lens": + case "submission-lens": + case "edit-lens": lensElmts.push(elmt); break; + case "facet": facetElmts.push(elmt); break; + default: + otherElmts.push(elmt); + } + } else { + var node = elmt.firstChild; + while (node != null) { + if (node.nodeType == 1) { + f(node); + } + node=node.nextSibling; + } + } + }; + f(root || document.body); + + var uiContext = this._uiContext; + for (var i = 0; i < collectionElmts.length; i++) { + var elmt = collectionElmts[i]; + var id = elmt.id; + if (id == null || id.length == 0) { + id = "default"; + } + this.setCollection(id, Exhibit.Collection.createFromDOM2(id, elmt, uiContext)); + } + + var self = this; + var processElmts = function(elmts) { + for (var i = 0; i < elmts.length; i++) { + var elmt = elmts[i]; + try { + var component = Exhibit.UI.createFromDOM(elmt, uiContext); + if (component != null) { + var id = elmt.id; + if (id == null || id.length == 0) { + id = "component" + Math.floor(Math.random() * 1000000); + } + self.setComponent(id, component); + } + } catch (e) { + SimileAjax.Debug.exception(e); + } + } + }; + processElmts(coordinatorElmts); + processElmts(coderElmts); + processElmts(lensElmts); + processElmts(facetElmts); + processElmts(otherElmts); + + this.importSettings(); + + var exporters = Exhibit.getAttribute(document.body, "exporters"); + if (exporters != null) { + exporters = exporters.split(";"); + for (var i = 0; i < exporters.length; i++) { + var expr = exporters[i]; + var exporter = null; + + try { + exporter = eval(expr); + } catch (e) {} + + if (exporter == null) { + try { exporter = eval(expr + "Exporter"); } catch (e) {} + } + + if (exporter == null) { + try { exporter = eval("Exhibit." + expr + "Exporter"); } catch (e) {} + } + + if (typeof exporter == "object") { + Exhibit.addExporter(exporter); + } + } + } + + var hash = document.location.hash; + if (hash.length > 1) { + var itemID = decodeURIComponent(hash.substr(1)); + if (this._database.containsItem(itemID)) { + this._showFocusDialogOnItem(itemID); + } + } +}; + +Exhibit._Impl.prototype._showFocusDialogOnItem = function(itemID) { + var dom = SimileAjax.DOM.createDOMFromString( + "div", + "<div class='exhibit-focusDialog-viewContainer' id='lensContainer'>" + + "</div>" + + "<div class='exhibit-focusDialog-controls'>" + + "<button id='closeButton'>" + + Exhibit.l10n.focusDialogBoxCloseButtonLabel + + "</button>" + + "</div>" + ); + dom.elmt.className = "exhibit-focusDialog exhibit-ui-protection"; + dom.close = function() { + document.body.removeChild(dom.elmt); + }; + dom.layer = SimileAjax.WindowManager.pushLayer(function() { dom.close(); }, false); + + var itemLens = this._uiContext.getLensRegistry().createLens(itemID, dom.lensContainer, this._uiContext); + + dom.elmt.style.top = (document.body.scrollTop + 100) + "px"; + document.body.appendChild(dom.elmt); + + SimileAjax.WindowManager.registerEvent( + dom.closeButton, + "click", + function(elmt, evt, target) { SimileAjax.WindowManager.popLayer(dom.layer); }, + dom.layer + ); +}; + +Exhibit._Impl.prototype.exportSettings = function() { + var facetSelections = {}, + facetSettings = ''; + for (var id in this._componentMap) { + if (typeof this._componentMap[id].exportFacetSelection !== 'undefined') { + facetSettings = this._componentMap[id].exportFacetSelection() || false; + if (facetSettings) { + facetSelections[id] = facetSettings; + } + } + } + return facetSelections; +}; + +Exhibit._Impl.prototype.importSettings = function() { + if (window.location.search.length > 0) { + searchComponents = window.location.search.substr(1, window.location.search.length-1).split('&'); + for(var x = 0; x < searchComponents.length; x++) { + var component = searchComponents[x].split('='); + var componentId = component[0]; + var componentSelection = unescape(component[1]); + if (this._componentMap[componentId] && (typeof this._componentMap[componentId].importFacetSelection !== 'undefined')) { + this._componentMap[componentId].importFacetSelection(componentSelection); + } + } + } +};
\ No newline at end of file |