")
67 | .attr("class", "exhibit-bookmarkWidget-popup");
68 | this._fillPopup(popup);
69 | Exhibit.jQuery(this.getContainer()).append(popup);
70 | this._popup = popup;
71 | };
72 |
73 | /**
74 | * @public
75 | * @param {Exhibit.ControlPanel} panel
76 | */
77 | Exhibit.BookmarkWidget.prototype.reconstruct = function(panel) {
78 | this._popup = null;
79 | this._initializeUI();
80 | };
81 |
82 | /**
83 | * @param {jQuery} popup
84 | */
85 | Exhibit.BookmarkWidget.prototype._fillPopup = function(popup) {
86 | var self, img;
87 |
88 | self = this;
89 | img = Exhibit.UI.createTranslucentImage("images/bookmark-icon.png");
90 | Exhibit.jQuery(img)
91 | .addClass("exhibit-bookmarkWidget-button")
92 | .attr("title", Exhibit._("%widget.bookmark.tooltip"))
93 | .bind("click", function(evt) {
94 | self._showBookmark(img, evt);
95 | })
96 | .appendTo(popup);
97 | };
98 |
99 | /**
100 | * @param {jQuery} elmt
101 | * @param {jQuery.Event} evt
102 | */
103 | Exhibit.BookmarkWidget.prototype._showBookmark = function(elmt, evt) {
104 | var self, popupDom, el;
105 | self = this;
106 | self._controlPanel.childOpened();
107 | popupDom = Exhibit.UI.createPopupMenuDom(elmt);
108 | el = Exhibit.jQuery('
').
109 | attr("value", Exhibit.Bookmark.generateBookmark()).
110 | attr("size", 40);
111 | Exhibit.jQuery(popupDom.elmt).append(Exhibit.jQuery(el));
112 | Exhibit.jQuery(popupDom.elmt).one("closed.exhibit", function(evt) {
113 | self.dismiss();
114 | });
115 | popupDom.open(evt);
116 | Exhibit.jQuery(el).get(0).select();
117 | };
118 |
119 | /**
120 | * @returns {jQuery}
121 | */
122 | Exhibit.BookmarkWidget.prototype.getContainer = function() {
123 | return Exhibit.jQuery(this._div);
124 | };
125 |
126 | /**
127 | *
128 | */
129 | Exhibit.BookmarkWidget.prototype.dispose = function() {
130 | this._uiContext.dispose();
131 | this._uiContext = null;
132 | this._div = null;
133 | this._settings = null;
134 | };
135 |
136 | /**
137 | * @param {Exhibit.ControlPanel} panel
138 | */
139 | Exhibit.BookmarkWidget.prototype.setControlPanel = function(panel) {
140 | this._controlPanel = panel;
141 | };
142 |
143 | /**
144 | *
145 | */
146 | Exhibit.BookmarkWidget.prototype.dismiss = function() {
147 | this._controlPanel.childClosed();
148 | };
149 |
--------------------------------------------------------------------------------
/docs/js/scripts/ui/widgets/logo.js:
--------------------------------------------------------------------------------
1 | /**
2 | * @fileOverview
3 | * @author David Huynh
4 | * @author
Ryan Lee
5 | */
6 |
7 | /**
8 | * @constructor
9 | * @class
10 | * @param {Element} elmt
11 | * @param {Exhibit._Impl} exhibit
12 | */
13 | Exhibit.Logo = function(elmt, exhibit) {
14 | this._exhibit = exhibit;
15 | this._elmt = elmt;
16 | this._color = "Silver";
17 | };
18 |
19 | /**
20 | * @static
21 | * @param {Object} configuration
22 | * @param {Element} elmt
23 | * @param {Exhibit._Impl} exhibit
24 | * @returns {Exhibit.Logo}
25 | */
26 | Exhibit.Logo.create = function(configuration, elmt, exhibit) {
27 | var logo;
28 |
29 | logo = new Exhibit.Logo(elmt, exhibit);
30 |
31 | if (typeof configuration.color !== "undefined") {
32 | logo._color = configuration.color;
33 | }
34 |
35 | logo._initializeUI();
36 | return logo;
37 | };
38 |
39 | /**
40 | * @static
41 | * @param {Element} elmt
42 | * @param {Exhibit._Impl} exhibit
43 | * @returns {Exhibit.Logo}
44 | */
45 | Exhibit.Logo.createFromDOM = function(elmt, exhibit) {
46 | var logo, color;
47 | logo = new Exhibit.Logo(elmt, exhibit);
48 |
49 | color = Exhibit.getAttribute(elmt, "color");
50 | if (color !== null && color.length > 0) {
51 | logo._color = color;
52 | }
53 |
54 | logo._initializeUI();
55 | return logo;
56 | };
57 |
58 | /**
59 | *
60 | */
61 | Exhibit.Logo.prototype.dispose = function() {
62 | this._elmt = null;
63 | this._exhibit = null;
64 | };
65 |
66 | /**
67 | * @private
68 | */
69 | Exhibit.Logo.prototype._initializeUI = function() {
70 | var logoURL, img, id, a;
71 |
72 | logoURL = Exhibit.urlPrefix + "images/logos/exhibit-small-" + this._color + ".png";
73 | img = Exhibit.jQuery.simileBubble("createTranslucentImage", logoURL);
74 | id = "exhibit-logo-image";
75 | if (Exhibit.jQuery('#' + id).length === 0) {
76 | Exhibit.jQuery(img).attr("id", id);
77 | }
78 | a = Exhibit.jQuery("
")
79 | .attr("href", Exhibit.exhibitLink)
80 | .attr("title", Exhibit.exhibitLink)
81 | .attr("targe", "_blank")
82 | .append(img);
83 |
84 | Exhibit.jQuery(this._elmt).append(a);
85 | };
86 |
--------------------------------------------------------------------------------
/docs/js/scripts/ui/widgets/option-widget.js:
--------------------------------------------------------------------------------
1 | /**
2 | * @fileOverview View header option making widget
3 | * @author David Huynh
4 | * @author Ryan Lee
5 | */
6 |
7 | /**
8 | * @constructor
9 | * @class
10 | * @param {Object} configuration
11 | * @param {Element} containerElmt
12 | * @param {Exhibit.UIContext} uiContext
13 | */
14 | Exhibit.OptionWidget = function(configuration, containerElmt, uiContext) {
15 | this._label = configuration.label;
16 | this._checked = typeof configuration.checked !== "undefined" ?
17 | configuration.checked :
18 | false;
19 | this._onToggle = configuration.onToggle;
20 |
21 | this._containerElmt = containerElmt;
22 | this._uiContext = uiContext;
23 | this._initializeUI();
24 | };
25 |
26 | /**
27 | * @param {Object} configuration
28 | * @param {Element} containerElmt
29 | * @param {Exhibit.UIContext} uiContext
30 | * @returns {Exhibit.OptionWidget}
31 | */
32 | Exhibit.OptionWidget.create = function(configuration, containerElmt, uiContext) {
33 | return new Exhibit.OptionWidget(configuration, containerElmt, uiContext);
34 | };
35 |
36 | /**
37 | *
38 | */
39 | Exhibit.OptionWidget.prototype.dispose = function() {
40 | Exhibit.jQuery(this._containerElmt).empty();
41 |
42 | this._dom = null;
43 | this._containerElmt = null;
44 | this._uiContext = null;
45 | };
46 |
47 | /**
48 | * @constant
49 | */
50 | Exhibit.OptionWidget.uncheckedImageURL = Exhibit.urlPrefix + "images/option.png";
51 |
52 | /**
53 | * @constant
54 | */
55 | Exhibit.OptionWidget.checkedImageURL = Exhibit.urlPrefix + "images/option-check.png";
56 |
57 | /**
58 | * @constant
59 | */
60 | Exhibit.OptionWidget.uncheckedTemplate =
61 | "
%1$s";
62 |
63 | /**
64 | * @constant
65 | */
66 | Exhibit.OptionWidget.checkedTemplate =
67 | "
%1$s";
68 |
69 | /**
70 | *
71 | */
72 | Exhibit.OptionWidget.prototype._initializeUI = function() {
73 | this._containerElmt.className = "exhibit-optionWidget";
74 | this._dom = Exhibit.jQuery.simileDOM(
75 | "string",
76 | this._containerElmt,
77 | sprintf(
78 | Exhibit.OptionWidget.uncheckedTemplate + Exhibit.OptionWidget.checkedTemplate,
79 | this._label
80 | ),
81 | { uncheckedImage: Exhibit.jQuery.simileBubble("createTranslucentImage", Exhibit.OptionWidget.uncheckedImageURL),
82 | checkedImage: Exhibit.jQuery.simileBubble("createTranslucentImage", Exhibit.OptionWidget.checkedImageURL)
83 | }
84 | );
85 |
86 | if (this._checked) {
87 | Exhibit.jQuery(this._dom.checkedSpan).show();
88 | } else {
89 | Exhibit.jQuery(this._dom.uncheckedSpan).show();
90 | }
91 |
92 | Exhibit.jQuery(this._containerElmt).bind("click", this._onToggle);
93 | };
94 |
95 | /**
96 | * @returns {Boolean}
97 | */
98 | Exhibit.OptionWidget.prototype.getChecked = function() {
99 | return this._checked;
100 | };
101 |
102 | /**
103 | * @param {Boolean} checked
104 | */
105 | Exhibit.OptionWidget.prototype.setChecked = function(checked) {
106 | if (checked !== this._checked) {
107 | this._checked = checked;
108 | if (checked) {
109 | Exhibit.jQuery(this._dom.checkedSpan).show();
110 | Exhibit.jQuery(this._dom.uncheckedSpan).hide();
111 | } else {
112 | Exhibit.jQuery(this._dom.checkedSpan).hide();
113 | Exhibit.jQuery(this._dom.uncheckedSpan).show();
114 | }
115 | }
116 | };
117 |
118 | /**
119 | *
120 | */
121 | Exhibit.OptionWidget.prototype.toggle = function() {
122 | this.setChecked(!this._checked);
123 | };
124 |
--------------------------------------------------------------------------------
/docs/js/scripts/ui/widgets/reset-history-widget.js:
--------------------------------------------------------------------------------
1 | /**
2 | * @fileOverview Development widget to assist with resetting history, which
3 | * can get in an odd state if the Exhibit is being designed.
4 | * @author
Ryan Lee
5 | */
6 |
7 | /**
8 | * @constructor
9 | * @class
10 | * @param {Element} containerElmt
11 | * @param {Exhibit.UIContext} uiContext
12 | */
13 | Exhibit.ResetHistoryWidget = function(containerElmt, uiContext) {
14 | this._containerElmt = containerElmt;
15 | this._uiContext = uiContext;
16 | this._settings = {};
17 | };
18 |
19 | /**
20 | * @static
21 | * @param {Object} configuration
22 | * @param {Element} elmt
23 | * @param {Exhibit.UIContext} uiContext
24 | * @returns {Exhibit.ResetHistoryWidget}
25 | */
26 | Exhibit.ResetHistoryWidget.create = function(configuration, elmt, uiContext) {
27 | var widget = new Exhibit.ResetHistoryWidget(
28 | elmt,
29 | Exhibit.UIContext.create(configuration, uiContext)
30 | );
31 | Exhibit.ResetHistoryWidget._configure(widget, configuration);
32 | widget._initializeUI();
33 | return widget;
34 | };
35 |
36 | /**
37 | * @static
38 | * @param {Element} configElmt
39 | * @param {Element} containerElmt
40 | * @param {Exhibit.UIContext} uiContext
41 | * @returns {Exhibit.ResetHistoryWidget}
42 | */
43 | Exhibit.ResetHistoryWidget.createFromDOM = function(configElmt, containerElmt, uiContext) {
44 | var configuration, widget;
45 | configuration = Exhibit.getConfigurationFromDOM(configElmt);
46 | widget = new Exhibit.ResetHistoryWidget(
47 | (typeof containerElmt !== "undefined" && containerElmt !== null) ?
48 | containerElmt : configElmt,
49 | Exhibit.UIContext.createFromDOM(configElmt, uiContext)
50 | );
51 | Exhibit.ResetHistoryWidget._configure(widget, configuration);
52 | widget._initializeUI();
53 | return widget;
54 | };
55 |
56 | /**
57 | * @static
58 | * @private
59 | * @param {Exhibit.ResetHistoryWidget} widget
60 | * @param {Object} configuration
61 | */
62 | Exhibit.ResetHistoryWidget._configure = function(widget, configuration) {
63 | };
64 |
65 | /**
66 | * Sets the history to its initial, empty state and reloads the page.
67 | * @static
68 | */
69 | Exhibit.ResetHistoryWidget.resetHistory = function() {
70 | Exhibit.History.eraseState();
71 | window.location.reload();
72 | };
73 |
74 | /**
75 | *
76 | */
77 | Exhibit.ResetHistoryWidget.prototype._initializeUI = function() {
78 | var img;
79 |
80 | img = Exhibit.UI.createTranslucentImage("images/reset-history-icon.png");
81 | Exhibit.jQuery(img)
82 | .addClass("exhibit-resetHistoryWidget-button")
83 | .attr("title", "Click to clear state and refresh window")
84 | .bind("click", function(evt) {
85 | Exhibit.ResetHistoryWidget.resetHistory();
86 | });
87 | Exhibit.jQuery(this._containerElmt).append(img);
88 | };
89 |
90 | /**
91 | * @public
92 | * @param {Exhibit.ControlPanel} panel
93 | */
94 | Exhibit.ResetHistoryWidget.prototype.reconstruct = function(panel) {
95 | this._initializeUI();
96 | };
97 |
98 | /**
99 | *
100 | */
101 | Exhibit.ResetHistoryWidget.prototype.dispose = function() {
102 | this._uiContext.dispose();
103 | this._uiContext = null;
104 | this._div = null;
105 | this._settings = null;
106 | };
107 |
--------------------------------------------------------------------------------
/docs/js/scripts/ui/widgets/resizable-div-widget.js:
--------------------------------------------------------------------------------
1 | /**
2 | * @fileOverview Resizable element widget
3 | * @author David Huynh
4 | * @author
Ryan Lee
5 | */
6 |
7 | /**
8 | * @param {Object} configuration
9 | * @param {Element} elmt
10 | * @param {Exhibit.UIContext} uiContext
11 | */
12 | Exhibit.ResizableDivWidget = function(configuration, elmt, uiContext) {
13 | this._div = elmt;
14 | this._configuration = configuration;
15 | if (typeof configuration.minHeight === "undefined") {
16 | configuration.minHeight = 10; // pixels
17 | }
18 | this._dragging = false;
19 | this._height = null;
20 | this._origin = null;
21 | this._ondrag = null;
22 |
23 | this._initializeUI();
24 | };
25 |
26 | /**
27 | * @param {Object} configuration
28 | * @param {Element} elmt
29 | * @param {Exhibit.UIContext} uiContext
30 | * @returns {Exhibit.ResizableDivWidget}
31 | */
32 | Exhibit.ResizableDivWidget.create = function(configuration, elmt, uiContext) {
33 | return new Exhibit.ResizableDivWidget(configuration, elmt, uiContext);
34 | };
35 |
36 | /**
37 | *
38 | */
39 | Exhibit.ResizableDivWidget.prototype.dispose = function() {
40 | Exhibit.jQuery(this._div).empty();
41 | this._contentDiv = null;
42 | this._resizerDiv = null;
43 | this._div = null;
44 | };
45 |
46 | /**
47 | * @returns {Element}
48 | */
49 | Exhibit.ResizableDivWidget.prototype.getContentDiv = function() {
50 | return this._contentDiv;
51 | };
52 |
53 | /**
54 | *
55 | */
56 | Exhibit.ResizableDivWidget.prototype._initializeUI = function() {
57 | var self = this;
58 |
59 | Exhibit.jQuery(this._div).html(
60 | "
" +
61 | '
' +
62 | Exhibit.UI.createTranslucentImageHTML("images/down-arrow.png") +
63 | "
");
64 |
65 | this._contentDiv = Exhibit.jQuery(this._div).children().get(0);
66 | this._resizerDiv = Exhibit.jQuery(this._div).children().get(1);
67 |
68 | Exhibit.jQuery(this._resizerDiv).on("mousedown", function(evt) {
69 | self._dragging = true;
70 | self._height = Exhibit.jQuery(self._contentDiv).height();
71 | self._origin = { "x": evt.pageX, "y": evt.pageY };
72 |
73 | self._ondrag = function(evt2) {
74 | var height = self._height + evt2.pageY - self._origin.y;
75 | Exhibit.jQuery(self._contentDiv).height(Math.max(
76 | height,
77 | self._configuration.minHeight
78 | ));
79 | return false; //stop propagation
80 | };
81 | Exhibit.jQuery(document).on("mousemove", self._ondrag);
82 |
83 | self._dragdone = function(evt) {
84 | self._dragging = false;
85 | Exhibit.jQuery(document).off("mousemove", self._ondrag);
86 | if (typeof self._configuration.onResize === "function") {
87 | self._configuration.onResize();
88 | }
89 | };
90 | Exhibit.jQuery("body").one("mouseup", self._dragdone);
91 | return false;
92 | });
93 | };
94 |
--------------------------------------------------------------------------------
/docs/js/scripts/util/bookmark.js:
--------------------------------------------------------------------------------
1 | /**
2 | * @fileOverview Methods for generating and interpreting session state
3 | * bookmarks.
4 | * @author
Ryan Lee
5 | */
6 |
7 | /**
8 | * @namespace Bookmarking the current state of a browsing session.
9 | */
10 | Exhibit.Bookmark = {
11 | /**
12 | * Whether the History system should load the bookmarked state.
13 | *
14 | * @private
15 | */
16 | _shouldRun: undefined,
17 |
18 | /**
19 | * The bookmark state read in by the bookmarking system.
20 | */
21 | state: {},
22 |
23 | /**
24 | * Whether a bookmark was used at the start or not.
25 | */
26 | run: undefined
27 | };
28 |
29 | /**
30 | * Generate a string that can be used as the hash portion of a URI
31 | * to be used for bookmarking the current state of an Exhibit browsing
32 | * session.
33 | *
34 | * @static
35 | * @param state {Object} An JSON serializable object fully describing
36 | * the current state.
37 | * @returns {String} The Base64-encoded string representing a JSON
38 | * serialized object.
39 | * @depends JSON
40 | * @depends Base64
41 | */
42 | Exhibit.Bookmark.generateBookmarkHash = function(state) {
43 | if (typeof state === "undefined" ||
44 | state === null ||
45 | typeof state.data === "undefined" ||
46 | state.data === null ||
47 | typeof state.data.state === "undefined" ||
48 | state.data.state === null) {
49 | return "";
50 | }
51 | return Base64.encode(JSON.stringify(state));
52 | };
53 |
54 | /**
55 | * Turn a bookmark hash into a representation of state.
56 | *
57 | * @static
58 | * @param hash {String} A Base64-encoded string representing a JSON
59 | * serialized object.
60 | * @returns {Object} The deserialized object represented by the hash.
61 | * @depends JSON
62 | * @depends Base64
63 | */
64 | Exhibit.Bookmark.interpretBookmarkHash = function(hash) {
65 | if (typeof hash === "undefined" || hash === null || hash === "") {
66 | return null;
67 | } else {
68 | return JSON.parse(Base64.decode(hash));
69 | }
70 | };
71 |
72 | /**
73 | * Given the current page state from Exhibit.History, make a bookmark URI.
74 | *
75 | * @static
76 | * @returns {String} The bookmark URI
77 | * @depends Exhibit.History
78 | */
79 | Exhibit.Bookmark.generateBookmark = function() {
80 | var hash;
81 | hash = Exhibit.Bookmark.generateBookmarkHash(Exhibit.History.getState());
82 | return document.location.href + ((hash === "") ? "": "#" + hash);
83 | };
84 |
85 | /**
86 | * Change the state of the page given an interpreted bookmark hash.
87 | *
88 | * @static
89 | * @param state {Object} The interpreted bookmark hash as the state
90 | * object History.js uses.
91 | * @depends Exhibit.History
92 | */
93 | Exhibit.Bookmark.implementBookmark = function(state) {
94 | if (typeof state !== "undefined" && state !== null) {
95 | Exhibit.History.replaceState(state.data, state.title, state.url);
96 | Exhibit.Bookmark.run = true;
97 | }
98 | };
99 |
100 | /**
101 | * Answer whether the bookmark system should run or not on the hash
102 | * (if there is a hash) in the current URL.
103 | *
104 | * @returns {Boolean}
105 | */
106 | Exhibit.Bookmark.runBookmark = function() {
107 | return Exhibit.Bookmark._shouldRun;
108 | };
109 |
110 | /**
111 | * When run, examine this page's URI for a hash and try to interpret and
112 | * implement it.
113 | *
114 | * @static
115 | */
116 | Exhibit.Bookmark.init = function() {
117 | var hash, state;
118 | hash = document.location.hash;
119 | if (hash.length > 0) {
120 | try {
121 | state = Exhibit.Bookmark.interpretBookmarkHash(hash.substr(1));
122 | if (typeof state === "object" &&
123 | typeof state["data"] !== "undefined" &&
124 | typeof state["title"] !== "undefined" &&
125 | typeof state["url"] !== "undefined") {
126 | Exhibit.Bookmark.state = state;
127 | Exhibit.Bookmark._shouldRun = true;
128 | } else {
129 | Exhibit.Bookmark._shouldRun = false;
130 | }
131 | } catch (ex) {
132 | Exhibit.Bookmark._shouldRun = false;
133 | } finally {
134 | Exhibit.Bookmark.run = false;
135 | }
136 | }
137 | };
138 |
--------------------------------------------------------------------------------
/docs/js/scripts/util/coders.js:
--------------------------------------------------------------------------------
1 | /**
2 | * @fileOverview Default colors for color coders.
3 | * @author David Huynh
4 | * @author
Ryan Lee
5 | */
6 |
7 | /**
8 | * @namespace
9 | */
10 | Exhibit.Coders = {
11 | /**
12 | * @constant
13 | */
14 | "mixedCaseColor": "#fff",
15 |
16 | /**
17 | * @constant
18 | */
19 | "othersCaseColor": "#aaa",
20 |
21 | /**
22 | * @constant
23 | */
24 | "missingCaseColor": "#888"
25 | };
26 |
--------------------------------------------------------------------------------
/docs/js/scripts/util/persistence.js:
--------------------------------------------------------------------------------
1 | /**
2 | * @fileOverview Support methods surrounding generating a URL for an item
3 | * in the database.
4 | * @author David Huynh
5 | * @author
Ryan Lee
6 | */
7 |
8 | /**
9 | * @namespace Contains support methods for generating persistent URLs for
10 | * items in an Exhibit database.
11 | */
12 | Exhibit.Persistence = {
13 | /**
14 | * Cached URL without query portion.
15 | */
16 | "_urlWithoutQuery": null,
17 |
18 | /**
19 | * Cached URL without query and hash portions.
20 | */
21 | "_urlWithoutQueryAndHash": null
22 | };
23 |
24 | /**
25 | * Given a relative or absolute URL, determine the fragment of the
26 | * corresponding absolute URL up to its last '/' character (relative URLs
27 | * are resolved relative to the document location).
28 | *
29 | * @param {String} url Starting URL to derive a base URL from.
30 | * @returns {String} The base URL.
31 | */
32 | Exhibit.Persistence.getBaseURL = function(url) {
33 | // HACK: for some unknown reason Safari keeps throwing
34 | // TypeError: no default value
35 | // when this function is called from the RDFa importer. So I put a try catch here.
36 | var url2, i;
37 | try {
38 | url = Exhibit.Persistence.resolveURL(url);
39 | i = url.indexOf("#");
40 | if (i >= 0) {
41 | url = url.substr(0, i);
42 | }
43 | i = url.lastIndexOf("/");
44 | if (i < 0) {
45 | return "";
46 | } else {
47 | return url.substr(0, i + 1);
48 | }
49 | } catch (e) {
50 | return url;
51 | }
52 | };
53 |
54 | /**
55 | * Given a relative or absolute URL, return the absolute URL (resolving
56 | * relative to the document location).
57 | *
58 | * @param {String} url The orignal URL to resolve.
59 | * @returns {String} The resolved URL.
60 | */
61 | (function () {
62 | var a = document.createElement('a');
63 |
64 | Exhibit.Persistence.resolveURL = function (url) {
65 | a.href = url;
66 | return a.href; //browser magic converts to absolute
67 | };
68 | })();
69 |
70 | /**
71 | * Return the current document location without the query and hash portions
72 | * of the URL.
73 | *
74 | * @returns {String} The document's location without query and hash portions.
75 | */
76 | Exhibit.Persistence.getURLWithoutQueryAndHash = function() {
77 | return document.location.origin + document.location.pathname;
78 | };
79 |
80 | /**
81 | * Return a URL to one item in this Exhibit, encoding it as a hash relative to
82 | * the URL without query and hash.
83 | *
84 | * @param {String} itemID The item's database identifier.
85 | * @returns {String} A URL to Exhibit highlighting the item.
86 | */
87 | Exhibit.Persistence.getItemLink = function(itemID) {
88 | return Exhibit.Persistence.resolveURL("#" + encodeURIComponent(itemID));
89 | };
90 |
--------------------------------------------------------------------------------
/docs/js/scripts/util/units.js:
--------------------------------------------------------------------------------
1 | /**
2 | * @author David Huynh
3 | * @author
Ryan Lee
4 | * @fileOverview
5 | */
6 |
7 | /**
8 | * @namespace Utility functions for working with built-in Date objects.
9 | */
10 | Exhibit.NativeDateUnit = {};
11 |
12 | /**
13 | * Return right now as a Date object.
14 | *
15 | * @static
16 | * @returns {Date} Right now.
17 | */
18 | Exhibit.NativeDateUnit.makeDefaultValue = function() {
19 | return new Date();
20 | };
21 |
22 | /**
23 | * Make a new Date object with the same value as the argument.
24 | *
25 | * @static
26 | * @param {Date} v Original Date object.
27 | * @returns {Date} New Date object with the same value, not identical.
28 | */
29 | Exhibit.NativeDateUnit.cloneValue = function(v) {
30 | return new Date(v.getTime());
31 | };
32 |
33 | /**
34 | * Based on a format, return a function that can take a string and parse
35 | * the format into a Date object. Currently recognizes ISO-8601 as a
36 | * format; all others are treated as Gregorian.
37 | *
38 | * @requires Exhibit.DateTime
39 | * @see Exhibit.DateTime.parseIso8601DateTime
40 | * @see Exhibit.DateTime.parseGregorianDateTime
41 | * @static
42 | * @param {String} format Name of the date format, commonly ISO-8601.
43 | * @returns {Function} A function that takes a string in the given format
44 | * and returns a Date object.
45 | */
46 | Exhibit.NativeDateUnit.getParser = function(format) {
47 | if (typeof format === "string") {
48 | format = format.toLowerCase();
49 | }
50 | return (format === "iso8601" || format === "iso 8601") ?
51 | Exhibit.DateTime.parseIso8601DateTime :
52 | Exhibit.DateTime.parseGregorianDateTime;
53 | };
54 |
55 | /**
56 | * Returns the object if a Date or parses using native (Gregorian) date
57 | * parsing if a String.
58 | *
59 | * @static
60 | * @param {Date|String} o The object to return or parse.
61 | * @returns {Date} The parsed string or original object.
62 | */
63 | Exhibit.NativeDateUnit.parseFromObject = function(o) {
64 | return Exhibit.DateTime.parseGregorianDateTime(o);
65 | };
66 |
67 | /**
68 | * Converts a Date object to its numeric representation in seconds since epoch.
69 | *
70 | * @static
71 | * @param {Date} v The Date object to convert.
72 | * @returns {Number} The date value in seconds since epoch.
73 | */
74 | Exhibit.NativeDateUnit.toNumber = function(v) {
75 | return v.getTime();
76 | };
77 |
78 | /**
79 | * Converts seconds since epoch into a Date object.
80 | *
81 | * @static
82 | * @param {Number} n Seconds since epoch.
83 | * @returns {Date} The corresponding Date object.
84 | */
85 | Exhibit.NativeDateUnit.fromNumber = function(n) {
86 | return new Date(n);
87 | };
88 |
89 | /**
90 | * Compares two Date objects. If the values of the two are the same, returns
91 | * 0. If v1 is earlier than v2, the return value is negative. If v1 is
92 | * later than v2, the return value is positive. Also compares anything that
93 | * can be converted to a Number, assuming the number is measured since epoch.
94 | *
95 | * @static
96 | * @param {Date|String|Number} v1 First Date object or raw time value to
97 | compare.
98 | * @param {Date|String|Number} v2 Second Date object or raw time value to
99 | compare.
100 | * @returns {Number} Integer with negative, zero, or positive value depending
101 | * on relative date values.
102 | */
103 | Exhibit.NativeDateUnit.compare = function(v1, v2) {
104 | var n1, n2;
105 | if (typeof v1 === "object") {
106 | n1 = v1.getTime();
107 | } else {
108 | n1 = Number(v1);
109 | }
110 | if (typeof v2 === "object") {
111 | n2 = v2.getTime();
112 | } else {
113 | n2 = Number(v2);
114 | }
115 |
116 | return n1 - n2;
117 | };
118 |
119 | /**
120 | * Returns the earlier object of the two passed in as arguments.
121 | *
122 | * @static
123 | * @param {Date} v1 The first Date object to compare.
124 | * @param {Date} v2 The second Date object to compare.
125 | * @returns {Date} The earlier of the two arguments.
126 | */
127 | Exhibit.NativeDateUnit.earlier = function(v1, v2) {
128 | return Exhibit.NativeDateUnit.compare(v1, v2) < 0 ? v1 : v2;
129 | };
130 |
131 | /**
132 | * Returns the later object of the two passed in as arguments.
133 | *
134 | * @static
135 | * @param {Date} v1 The first Date object to compare.
136 | * @param {Date} v2 The second Date object to compare.
137 | * @returns {Date} The later of the two arguments.
138 | */
139 | Exhibit.NativeDateUnit.later = function(v1, v2) {
140 | return Exhibit.NativeDateUnit.compare(v1, v2) > 0 ? v1 : v2;
141 | };
142 |
143 | /**
144 | * Make a new Date object by adding a number of seconds to the original.
145 | *
146 | * @static
147 | * @param {Date} v The Date object to modify.
148 | * @param {Number} n The number of seconds, positive or negative, to add
149 | * to the Date object.
150 | * @returns {Date} A new Date object with the seconds added.
151 | */
152 | Exhibit.NativeDateUnit.change = function(v, n) {
153 | return new Date(v.getTime() + n);
154 | };
155 |
--------------------------------------------------------------------------------
/docs/js/scripts/util/util.js:
--------------------------------------------------------------------------------
1 | /**
2 | * @author David Huynh
3 | * @author
Ryan Lee
4 | * @fileOverview Base for Exhibit utilities and native datatype modifications.
5 | */
6 |
7 | /**
8 | * @namespace For Exhibit utility classes and methods.
9 | */
10 | Exhibit.Util = {};
11 |
12 | /**
13 | * Round a number n to the nearest multiple of precision (any positive value),
14 | * such as 5000, 0.1 (one decimal), 1e-12 (twelve decimals), or 1024 (if you'd
15 | * want "to the nearest kilobyte" -- so round(66000, 1024) == "65536"). You are
16 | * also guaranteed to get the precision you ask for, so round(0, 0.1) == "0.0".
17 | *
18 | * @static
19 | * @param {Number} n Original number.
20 | * @param {Number} [precision] Rounding bucket, by default 1.
21 | * @returns {String} Rounded number into the nearest bucket at the bucket's
22 | * precision, in a form readable by users.
23 | */
24 | Exhibit.Util.round = function(n, precision) {
25 | var lg;
26 | precision = precision || 1;
27 | lg = Math.floor( Math.log(precision) / Math.log(10) );
28 | n = (Math.round(n / precision) * precision).toString();
29 | if (lg >= 0) {
30 | return parseInt(n, 10).toString();
31 | }
32 |
33 | lg = -lg;
34 | return parseFloat(n).toFixed(lg);
35 | };
36 |
37 | /**
38 | * Modify the native String type.
39 | */
40 | (function() {
41 | if (typeof String.prototype.trim === "undefined") {
42 | /**
43 | * Removes leading and trailing spaces.
44 | *
45 | * @returns {String} Trimmed string.
46 | */
47 | String.prototype.trim = function() {
48 | return this.replace(/^\s+|\s+$/g, '');
49 | };
50 | }
51 |
52 | if (typeof String.prototype.startsWith === "undefined") {
53 | /**
54 | * Test if a string begins with a prefix.
55 | *
56 | * @param {String} prefix Prefix to check.
57 | * @returns {Boolean} True if string starts with prefix, false if not.
58 | */
59 | String.prototype.startsWith = function(prefix) {
60 | return this.length >= prefix.length && this.substr(0, prefix.length) === prefix;
61 | };
62 | }
63 |
64 | if (typeof String.prototype.endsWith === "undefined") {
65 | /**
66 | * Test if a string ends with a suffix.
67 | *
68 | * @param {String} suffix Suffix to check.
69 | * @returns {Boolean} True if string ends with suffix, false if not.
70 | */
71 | String.prototype.endsWith = function(suffix) {
72 | return this.length >= suffix.length && this.substr(this.length - suffix.length) === suffix;
73 | };
74 | }
75 | }());
76 |
--------------------------------------------------------------------------------
/docs/js/styles/browse-panel.css:
--------------------------------------------------------------------------------
1 | /*==================================================
2 | * Browse Panel styles
3 | *==================================================
4 | */
5 | div.exhibit-browsePanel {
6 | }
7 |
8 | div.exhibit-browsePanel-notConfigureMessage {
9 | border: 1px solid #604800;
10 | padding: 1em;
11 | background: #FFFFE0;
12 | text-align: center;
13 | }
14 |
15 | div.exhibit-browsePanel-logoContainer {
16 | text-align: center;
17 | margin: 1em;
18 | clear: both;
19 | }
20 |
21 |
--------------------------------------------------------------------------------
/docs/js/styles/control-panel.css:
--------------------------------------------------------------------------------
1 | .exhibit-controlPanel {
2 | text-align: right;
3 | }
4 |
--------------------------------------------------------------------------------
/docs/js/styles/exhibit.css:
--------------------------------------------------------------------------------
1 | /*==================================================
2 | * Exhibit styles
3 | *
4 | * Note that almost all CSS code is in themes.
5 | *==================================================
6 | */
7 | .exhibit-ui-protection div {
8 | margin: 0;
9 | padding: 0;
10 | }
11 | .exhibit-ui-protection table {
12 | font-size: 100%;
13 | }
14 | .exhibit-ui-protection tr {
15 | vertical-align: top;
16 | }
17 | a img {
18 | border: none;
19 | }
20 |
21 | a.exhibit-action,
22 | a.exhibit-action:link,
23 | a.exhibit-action:active,
24 | a.exhibit-action:visited {
25 | text-decoration: none;
26 | border-bottom: 1px dotted;
27 | cursor: pointer;
28 | }
29 | a.exhibit-action:hover {
30 | border-bottom: 1px solid;
31 | cursor: pointer;
32 | }
33 |
34 | a.exhibit-action-disabled,
35 | a.exhibit-action-disabled:link,
36 | a.exhibit-action-disabled:active,
37 | a.exhibit-action-disabled:visited {
38 | text-decoration: none;
39 | border-bottom: 1px dotted;
40 | cursor: pointer;
41 | opacity: 0.5;
42 | }
43 | a.exhibit-action-disabled:hover {
44 | border-bottom: 1px solid;
45 | cursor: pointer;
46 | }
47 |
48 | a.exhibit-item,
49 | a.exhibit-item:link,
50 | a.exhibit-item:active,
51 | a.exhibit-item:visited {
52 | text-decoration: none;
53 | border-bottom: 1px dotted red;
54 | cursor: pointer;
55 | }
56 | a.exhibit-item:hover {
57 | border-bottom: 1px solid;
58 | cursor: pointer;
59 | }
60 |
61 | span.exhibit-value {
62 | }
63 |
64 | /*
65 | * Menu Popup
66 | */
67 | div.exhibit-menu-popup {
68 | position: absolute;
69 | width: 15em;
70 | z-index: 1000;
71 | background: #FFFFE0;
72 | border: 1px solid #aaa;
73 | }
74 |
75 | a.exhibit-menu-item {
76 | text-decoration: none;
77 | }
78 |
79 | a.exhibit-menu-item > div {
80 | padding: 2px 2px 2px 20px;
81 | text-indent: -18px;
82 | }
83 |
84 | a:hover.exhibit-menu-item > div {
85 | background: #DFDFC8;
86 | }
87 |
88 | a.exhibit-menu-item div img {
89 | vertical-align: middle;
90 | margin-right: 2px;
91 | }
92 |
93 | div.exhibit-menu-section {
94 | padding: 2px;
95 | font-weight: bold;
96 | }
97 |
98 | /*
99 | * Copy Button and Dialog Box
100 | */
101 | button.exhibit-copyButton, button.exhibit-button {
102 | border: 1px dashed;
103 | cursor: pointer;
104 | margin: 2px;
105 | }
106 | button:hover.exhibit-copyButton, button.exhibit-button:hover {
107 | background: white;
108 | border: 1px dashed blue;
109 | color: blue;
110 | cursor: pointer;
111 | }
112 |
113 | div.exhibit-copyDialog {
114 | position: absolute;
115 | z-index: 1000;
116 | background: #B2E8FF;
117 | border: 1px solid #aaa;
118 | padding: 2em;
119 | left: 25%;
120 | right: 25%;
121 | }
122 |
123 | div.exhibit-copyDialog textarea {
124 | width: 100%;
125 | font-size: 90%;
126 | color: #888;
127 | }
128 |
129 | div.exhibit-copyDialog button {
130 | float: right;
131 | }
132 |
133 | /*
134 | * Focus Dialog Box
135 | */
136 | div.exhibit-focusDialog {
137 | position: absolute;
138 | z-index: 1000;
139 | background: #B2E8FF;
140 | border: 1px solid #aaa;
141 | padding: 2em;
142 | left: 25%;
143 | right: 25%;
144 | }
145 |
146 | div.exhibit-focusDialog-lensContainer {
147 | }
148 |
149 | div.exhibit-focusDialog-controls {
150 | margin: 1em;
151 | text-align: center;
152 | }
153 |
154 | /*
155 | * Busy indicator
156 | */
157 | .exhibit-busyIndicator {
158 | position: fixed;
159 | left: 35%;
160 | top: 35%;
161 | min-width: 25%;
162 | z-index: 1000;
163 | padding: 3ex;
164 | border: 2px solid gray;
165 | border-radius: 3ex;
166 | background: white;
167 | background: rgba(255,255,255,.85);
168 | }
169 | .exhibit-busyIndicator-content {
170 | font-size: 120%;
171 | font-weight: bold;
172 | text-align: center;
173 | }
174 | .exhibit-busyIndicator-content img {
175 | vertical-align: middle;
176 | }
177 |
--------------------------------------------------------------------------------
/docs/js/styles/lens.css:
--------------------------------------------------------------------------------
1 | div.exhibit-lens {
2 | border: 1px solid #aaa;
3 | margin-bottom: 1em;
4 | }
5 |
6 | div.exhibit-lens-title {
7 | font-weight: bold;
8 | background: #eee;
9 | padding: 2px;
10 | }
11 |
12 | .exhibit-lens-copyButton {
13 | float: right;
14 | }
15 |
16 | div.exhibit-lens-body {
17 | padding: 0.3em;
18 | }
19 |
20 | table.exhibit-lens-properties {
21 | }
22 |
23 | tr.exhibit-lens-property {
24 | }
25 |
26 | td.exhibit-lens-property-name {
27 | color: #888;
28 | }
29 |
30 | td.exhibit-lens-property-values {
31 | }
32 |
33 |
--------------------------------------------------------------------------------
/docs/js/styles/theme-sandy-stone-beach-ocean-diver.css:
--------------------------------------------------------------------------------
1 | /*
2 | From Kuler, http://kuler.adobe.com/
3 |
4 | #e6e2af
5 | #a7a37e
6 | #efecca
7 | #046380
8 | #002f2f
9 | */
10 |
11 | div.timegrid-tab {
12 | background-color: #efecca;
13 | }
14 |
15 | div.timegrid-tab-active {
16 | background-color: #a7a37e;
17 | font-weight: bold;
18 | }
19 |
20 | div.timegrid-tab a {
21 | text-decoration: none;
22 | }
23 |
24 | div.timegrid-view {
25 | background: #a7a37e;
26 | border: 1px solid #a7a37e;
27 | }
28 |
29 | div.timegrid-grid-window {
30 | border: none;
31 | background: white;
32 | }
33 |
34 | div.timegrid-xlabels-window {
35 | border-left: 1px solid #a7a37e;
36 | border-right: 1px solid #a7a37e;
37 | border-bottom: 1px solid #a7a37e;
38 | }
39 | div.timegrid-ylabels-window {
40 | border-top: 1px solid #a7a37e;
41 | border-bottom: 1px solid #a7a37e;
42 | border-right: 1px solid #a7a37e;
43 | }
44 |
45 | div.timegrid-hline, div.timegrid-vline {
46 | background: #e6e2af;
47 | }
48 |
49 | div.timegrid-xlabels-window, div.timegrid-ylabels-window {
50 | background: #efecca;
51 | }
52 |
53 | div.timegrid-label {
54 | color: #046380;
55 | }
56 |
57 | .timegrid-xlabels div.timegrid-label {
58 | border-left: 1px solid #e6e2af;
59 | }
60 |
61 | .timegrid-ylabels div.timegrid-label {
62 | border-top: 1px solid #e6e2af;
63 | }
64 |
65 | div.timegrid-event {
66 | background-color: #e6e2af;
67 | color: #046380;
68 | }
69 |
70 | /* Monthly View */
71 | div.timegrid-month-cell {
72 | color: #046380;
73 | padding: 0px;
74 | }
75 |
76 | ul.timegrid-event-list {
77 | list-style-position: inside;
78 | padding: .5em;
79 | }
80 |
--------------------------------------------------------------------------------
/docs/js/styles/timegrid.css:
--------------------------------------------------------------------------------
1 | div.week-default {
2 | font-family: Helvetica, Arial, sans-serif;
3 | font-size: 9pt;
4 | overflow: hidden;
5 | }
6 |
7 | div.week-default * {
8 | margin: 0;
9 | padding: 0;
10 | }
11 |
12 | div.week-default ul, div.week-default li {
13 | font-size: 9pt;
14 | }
15 |
16 | div.timegrid-iterator {
17 | float: left;
18 | font-weight: bold;
19 | height: 1.5em;
20 | }
21 |
22 | .timegrid-iterator-prev, .timegrid-iterator-next {
23 | margin: .5em;
24 | }
25 |
26 | .timegrid-iterator img {
27 | border: none;
28 | }
29 |
30 | div.timegrid-tab {
31 | padding-left: 1em;
32 | padding-right: 1em;
33 | margin: 0px;
34 | float: right;
35 | background-color: #bbb;
36 | }
37 |
38 | div.timegrid-tab-active {
39 | font-weight: bold;
40 | }
41 |
42 | div.timegrid-view {
43 | position: absolute;
44 | top: 1.5em;
45 | bottom: 0px;
46 | width: 100%;
47 | left: 0px;
48 | border: 1px white solid;
49 | }
50 |
51 | div.timegrid-grid-window {
52 | position: absolute;
53 | overflow: scroll;
54 | border: 1px inset black;
55 | }
56 |
57 | table.timegrid-gridlines, .timegrid-hline, .timegrid-vline {
58 | border: 1px solid #e6e2af;
59 | }
60 |
61 | div.timegrid-events {
62 | position: relative;
63 | z-index: 2;
64 | }
65 |
66 | div.timegrid-gridlines {
67 | position: relative;
68 | z-index: 1;
69 | }
70 |
71 | div.timegrid-xlabels {
72 | position: absolute;
73 | left: 0px;
74 | }
75 |
76 | .timegrid-xlabels div.timegrid-label {
77 | top: 0px;
78 | bottom: 0px;
79 | text-align: center;
80 | padding: 3px;
81 | }
82 |
83 | div.timegrid-ylabels {
84 | position: absolute;
85 | }
86 |
87 | .timegrid-ylabels div.timegrid-label {
88 | left: 0px;
89 | right: 0px;
90 | text-align: right;
91 | padding: 3px;
92 | }
93 |
94 | div.timegrid-xlabels-window {
95 | position: absolute;
96 | overflow: hidden;
97 | text-align: center;
98 | }
99 |
100 | div.timegrid-ylabels-window {
101 | position: absolute;
102 | overflow: hidden;
103 | }
104 |
105 | div.timegrid-label {
106 | position: absolute;
107 | padding: 2px;
108 | color: #aaa;
109 | }
110 |
111 | /* Weekly View */
112 | div.timegrid-event {
113 | position: absolute;
114 | width: 100px;
115 | background-color: #aaf;
116 | padding: 0;
117 | overflow: hidden;
118 | z-index: 5;
119 | }
120 |
121 | .timegrid-week-highlight {
122 | position: absolute;
123 | background-color: #eee;
124 | }
125 |
126 | .timegrid-event div {
127 | padding: 2px;
128 | }
129 |
130 | /* Monthly View */
131 | div.timegrid-month-cell {
132 | position: absolute;
133 | padding: 0;
134 | overflow: hidden;
135 | }
136 |
137 | div.timegrid-month-cell-not-current {
138 | background-color: #F8F8F8;
139 | }
140 |
141 | div.timegrid-month-cell-now {
142 | background-color: #ccc;
143 | }
144 |
145 | ul.timegrid-event-list {
146 | list-style-position: inside;
147 | padding-left: .5em;
148 | }
149 |
150 | div.timegrid-month-label {
151 | position: absolute;
152 | text-align: center;
153 | width: 100%;
154 | z-index: 1;
155 | }
156 |
157 | div.timegrid-month-label span {
158 | display: block;
159 | font-size: 12em;
160 | font-weight: bold;
161 | color: #F0F0F0;
162 | }
163 |
164 | span.timegrid-month-date-label {
165 | position: absolute;
166 | right: 5px;
167 | top: 5px;
168 | color: #000;
169 | }
170 |
171 | /* Message */
172 | .timegrid-message-container {
173 | position: absolute;
174 | top: 30%;
175 | left: 35%;
176 | right: 35%;
177 | z-index: 1000;
178 | display: none;
179 | }
180 | .timegrid-message {
181 | font-size: 120%;
182 | font-weight: bold;
183 | text-align: center;
184 | }
185 |
--------------------------------------------------------------------------------
/docs/js/styles/util/views.css:
--------------------------------------------------------------------------------
1 | /*==================================================
2 | * Common styles for views
3 | *==================================================
4 | */
5 | div.exhibit-views-unplottableMessage {
6 | padding: 1em;
7 | text-align: center;
8 | }
9 | .exhibit-views-unplottableCount {
10 | font-weight: bold;
11 | }
12 | .exhibit-views-totalCount {
13 | }
14 |
15 | div.exhibit-views-bubbleWithItems {
16 | }
17 |
18 | div.exhibit-collectionView {
19 | }
20 |
21 | div.exhibit-collectionView-header {
22 | }
23 | span.exhibit-collectionView-header-count {
24 | font-size: 200%;
25 | }
26 | span.exhibit-collectionView-header-types {
27 | padding-left: 0.5em;
28 | }
29 | span.exhibit-collectionView-header-details {
30 | padding-left: 0.5em;
31 | color: #888;
32 | }
33 | div.exhibit-collectionView-header-sortControls {
34 | text-align: center;
35 | margin: 1em 0;
36 | }
37 | .exhibit-collectionView-header-groupControls {
38 | cursor: pointer;
39 | }
40 | .exhibit-collectionView-header-duplicateControls {
41 | cursor: pointer;
42 | }
43 |
44 | div.exhibit-collectionView-body {
45 | }
46 |
47 | div.exhibit-collectionView-group {
48 | }
49 |
50 | span.exhibit-collectionView-group-count {
51 | }
52 |
53 | div.exhibit-collectionView-group-content {
54 | margin-left: 1em;
55 | }
56 |
57 | div.exhibit-collectionView-group h1 {
58 | font-size: 150%;
59 | margin: 1em 0;
60 | }
61 |
62 | div.exhibit-collectionView-group h2 {
63 | font-size: 120%;
64 | margin: 0.5em 0;
65 | }
66 |
67 | .exhibit-collectionView-group h3 {
68 | }
69 |
70 | div.exhibit-collectionView-footer {
71 | clear: both;
72 | text-align: center;
73 | margin: 2em 0;
74 | }
75 |
76 | div.exhibit-collectionView-pagingControls {
77 | margin: 1em 0;
78 | text-align: center;
79 | }
80 |
81 | .exhibit-collectionView-pagingControls-currentPage {
82 | padding: 0px 0.5em;
83 | font-weight: bold;
84 | }
85 |
86 | .exhibit-collectionView-pagingControls-page {
87 | padding: 0px 0.5em;
88 | }
89 |
90 | ul.exhibit-collectionView-pagingControls {
91 | clear: both;
92 | margin: 2em 0;
93 | text-align: center;
94 | }
95 |
96 | ul.exhibit-collectionView-pagingControls li {
97 | list-style-type: none;
98 | display: inline;
99 | }
100 |
101 | ul.exhibit-collectionView-pagingControls li a {
102 | border: 1px solid #90C2E1;
103 | background: #DFEDF7;
104 | padding: 2px 5px;
105 | text-decoration: none;
106 | }
107 |
--------------------------------------------------------------------------------
/docs/js/styles/views/tabular-view.css:
--------------------------------------------------------------------------------
1 | table.exhibit-tabularView-body {
2 | width: 100%;
3 | }
4 |
5 | .exhibit-tabularView-columnHeader {
6 | cursor: pointer;
7 | white-space: pre;
8 | }
9 |
10 | .exhibit-tabularView-columnHeader-sorted {
11 | cursor: pointer;
12 | white-space: pre;
13 | }
14 |
15 | div.exhibit-tabularView-pagingControls {
16 | margin: 1em 0;
17 | text-align: center;
18 | }
19 |
20 | .exhibit-tabularView-pagingControls-currentPage {
21 | padding: 0px 0.5em;
22 | font-weight: bold;
23 | }
24 |
25 | .exhibit-tabularView-pagingControls-page {
26 | padding: 0px 0.5em;
27 | }
28 |
--------------------------------------------------------------------------------
/docs/js/styles/views/thumbnail-view.css:
--------------------------------------------------------------------------------
1 | div.exhibit-thumbnailView-group {
2 | clear: both;
3 | }
4 |
5 | div.exhibit-thumbnailView-body {
6 | }
7 |
8 | div.exhibit-thumbnailView-itemContainer {
9 | float: left;
10 | display: inline;
11 | }
12 |
--------------------------------------------------------------------------------
/docs/js/styles/views/tile-view.css:
--------------------------------------------------------------------------------
1 | table.exhibit-tileView-body {
2 | width: 100%;
3 | }
4 |
5 | .exhibit-tileView-body > tbody > tr > td:first-child {
6 | width: 3em;
7 | text-align: right;
8 | color: #aaa
9 | }
10 |
11 | td.exhibit-tileView-itemIndex {
12 | }
--------------------------------------------------------------------------------
/docs/js/styles/views/view-panel.css:
--------------------------------------------------------------------------------
1 | /*==================================================
2 | * View Panel styles
3 | *==================================================
4 | */
5 | div.exhibit-viewPanel {
6 | }
7 |
8 | div.exhibit-viewPanel-viewSelection {
9 | text-align: center;
10 | }
11 |
12 | span.exhibit-viewPanel-viewSelection-view {
13 | text-transform: uppercase;
14 | cursor: pointer;
15 | }
16 |
17 | span.exhibit-viewPanel-viewSelection-selectedView {
18 | text-transform: uppercase;
19 | font-weight: bold;
20 | border-bottom: 3px solid red;
21 | }
22 |
23 | div.exhibit-viewPanel-viewContainer {
24 | }
25 |
26 |
--------------------------------------------------------------------------------
/docs/js/styles/widgets/bookmark-widget.css:
--------------------------------------------------------------------------------
1 | div.exhibit-bookmarkWidget-popup {
2 | display: inline;
3 | text-align: right;
4 | }
5 |
6 | img.exhibit-bookmarkWidget-button {
7 | cursor: pointer;
8 | margin: 0px 1px;
9 | }
10 |
--------------------------------------------------------------------------------
/docs/js/styles/widgets/collection-summary-widget.css:
--------------------------------------------------------------------------------
1 | /*==================================================
2 | * Collection Summary Widget styles
3 | *==================================================
4 | */
5 | div.exhibit-collectionSummaryWidget {
6 | }
7 | span.exhibit-collectionSummaryWidget-count {
8 | font-size: 200%;
9 | }
10 | span.exhibit-collectionSummaryWidget-results {
11 | }
12 |
--------------------------------------------------------------------------------
/docs/js/styles/widgets/legend-widget.css:
--------------------------------------------------------------------------------
1 | div.exhibit-legendWidget {
2 | margin: 1em 0;
3 | text-align: center;
4 | line-height: 2em;
5 | }
6 | span.exhibit-legendWidget-entry {
7 | white-space: nowrap;
8 | }
9 | span.exhibit-legendWidget-entry-title {
10 | font-weight: bold;
11 | }
12 | span.exhibit-legendWidget-entry-swatch {
13 | border: 1px solid #888;
14 | padding: 0px 3px;
15 | }
16 |
--------------------------------------------------------------------------------
/docs/js/styles/widgets/option-widget.css:
--------------------------------------------------------------------------------
1 | .exhibit-optionWidget {
2 | cursor: pointer;
3 | }
4 |
5 | .exhibit-optionWidget img {
6 | vertical-align: middle;
7 | }
8 |
--------------------------------------------------------------------------------
/docs/js/styles/widgets/reset-history-widget.css:
--------------------------------------------------------------------------------
1 | .exhibit-resetHistoryWidget-button {
2 | cursor: pointer;
3 | }
--------------------------------------------------------------------------------
/docs/js/styles/widgets/resizable-div-widget.css:
--------------------------------------------------------------------------------
1 | /*==================================================
2 | * Resizable Div Widget styles
3 | *==================================================
4 | */
5 | div.exhibit-resizableDivWidget-resizer {
6 | text-align: center;
7 | cursor: s-resize;
8 | height: 15px;
9 | clear: both;
10 | }
11 |
--------------------------------------------------------------------------------
/docs/js/styles/widgets/toolbox-widget.css:
--------------------------------------------------------------------------------
1 | div.exhibit-toolboxWidget-popup {
2 | text-align: right;
3 | z-index: 1000;
4 | }
5 |
6 | img.exhibit-toolboxWidget-button {
7 | cursor: pointer;
8 | margin: 0px 1px;
9 | }
--------------------------------------------------------------------------------
/docs/mapa.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lmorillas/python_events/8a5f3fec8498de7cab69c35a2d9554acfe1b78ea/docs/mapa.png
--------------------------------------------------------------------------------
/docs/sitemap.xml:
--------------------------------------------------------------------------------
1 |
https://lmorillas.github.io/python_events/daily1
2 |
--------------------------------------------------------------------------------
/geocache.dat:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lmorillas/python_events/8a5f3fec8498de7cab69c35a2d9554acfe1b78ea/geocache.dat
--------------------------------------------------------------------------------
/requirements.txt:
--------------------------------------------------------------------------------
1 | asn1crypto==0.24.0
2 | backcall==0.1.0
3 | cachetools==2.1.0
4 | cffi==1.12.3
5 | cryptography==2.6.1
6 | decorator==4.3.0
7 | geographiclib==1.49
8 | geopy==1.14.0
9 | google-api-python-client==1.7.3
10 | google-auth==1.5.0
11 | google-auth-httplib2==0.0.3
12 | httplib2==0.11.3
13 | idna==2.7
14 | ipython==6.4.0
15 | ipython-genutils==0.2.0
16 | jedi==0.12.0
17 | oauth2client==1.5.2
18 | parso==0.2.1
19 | pexpect==4.6.0
20 | pickleshare==0.7.4
21 | pkg-resources==0.0.0
22 | prompt-toolkit==1.0.15
23 | ptyprocess==0.5.2
24 | pyasn1==0.4.3
25 | pyasn1-modules==0.2.1
26 | pycparser==2.19
27 | pycrypto==2.6.1
28 | Pygments==2.2.0
29 | pyOpenSSL==19.0.0
30 | pytz==2018.4
31 | rsa==3.4.2
32 | simplegeneric==0.8.1
33 | simplejson==3.16.0
34 | six==1.12.0
35 | traitlets==4.3.2
36 | uritemplate==3.0.0
37 | wcwidth==0.1.7
38 |
--------------------------------------------------------------------------------