| /*================================================== |
| * Default Event Source |
| *================================================== |
| */ |
| |
| |
| Timeline.DefaultEventSource = function(eventIndex) { |
| this._events = (eventIndex instanceof Object) ? eventIndex : new Timeline.EventIndex(); |
| this._listeners = []; |
| }; |
| |
| Timeline.DefaultEventSource.prototype.addListener = function(listener) { |
| this._listeners.push(listener); |
| }; |
| |
| Timeline.DefaultEventSource.prototype.removeListener = function(listener) { |
| for (var i = 0; i < this._listeners.length; i++) { |
| if (this._listeners[i] == listener) { |
| this._listeners.splice(i, 1); |
| break; |
| } |
| } |
| }; |
| |
| Timeline.DefaultEventSource.prototype.loadXML = function(xml, url) { |
| var base = this._getBaseURL(url); |
| |
| var wikiURL = xml.documentElement.getAttribute("wiki-url"); |
| var wikiSection = xml.documentElement.getAttribute("wiki-section"); |
| |
| var dateTimeFormat = xml.documentElement.getAttribute("date-time-format"); |
| var parseDateTimeFunction = this._events.getUnit().getParser(dateTimeFormat); |
| |
| var node = xml.documentElement.firstChild; |
| var added = false; |
| while (node != null) { |
| if (node.nodeType == 1) { |
| var description = ""; |
| if (node.firstChild != null && node.firstChild.nodeType == 3) { |
| description = node.firstChild.nodeValue; |
| } |
| var evt = new Timeline.DefaultEventSource.Event( |
| parseDateTimeFunction(node.getAttribute("start")), |
| parseDateTimeFunction(node.getAttribute("end")), |
| parseDateTimeFunction(node.getAttribute("latestStart")), |
| parseDateTimeFunction(node.getAttribute("earliestEnd")), |
| node.getAttribute("isDuration") != "true", |
| node.getAttribute("title"), |
| description, |
| this._resolveRelativeURL(node.getAttribute("image"), base), |
| this._resolveRelativeURL(node.getAttribute("link"), base), |
| this._resolveRelativeURL(node.getAttribute("icon"), base), |
| node.getAttribute("color"), |
| node.getAttribute("textColor") |
| ); |
| evt._node = node; |
| evt.getProperty = function(name) { |
| return this._node.getAttribute(name); |
| }; |
| evt.setWikiInfo(wikiURL, wikiSection); |
| |
| this._events.add(evt); |
| |
| added = true; |
| } |
| node = node.nextSibling; |
| } |
| |
| if (added) { |
| this._fire("onAddMany", []); |
| } |
| }; |
| |
| |
| Timeline.DefaultEventSource.prototype.loadJSON = function(data, url) { |
| var base = this._getBaseURL(url); |
| var added = false; |
| if (data && data.events){ |
| var wikiURL = ("wikiURL" in data) ? data.wikiURL : null; |
| var wikiSection = ("wikiSection" in data) ? data.wikiSection : null; |
| |
| var dateTimeFormat = ("dateTimeFormat" in data) ? data.dateTimeFormat : null; |
| var parseDateTimeFunction = this._events.getUnit().getParser(dateTimeFormat); |
| |
| for (var i=0; i < data.events.length; i++){ |
| var event = data.events[i]; |
| var evt = new Timeline.DefaultEventSource.Event( |
| parseDateTimeFunction(event.start), |
| parseDateTimeFunction(event.end), |
| parseDateTimeFunction(event.latestStart), |
| parseDateTimeFunction(event.earliestEnd), |
| event.isDuration || false, |
| event.title, |
| event.description, |
| this._resolveRelativeURL(event.image, base), |
| this._resolveRelativeURL(event.link, base), |
| this._resolveRelativeURL(event.icon, base), |
| event.color, |
| event.textColor |
| ); |
| evt._obj = event; |
| evt.getProperty = function(name) { |
| return this._obj[name]; |
| }; |
| evt.setWikiInfo(wikiURL, wikiSection); |
| |
| this._events.add(evt); |
| added = true; |
| } |
| } |
| |
| if (added) { |
| this._fire("onAddMany", []); |
| } |
| }; |
| |
| /* |
| * Contributed by Morten Frederiksen, http://www.wasab.dk/morten/ |
| */ |
| Timeline.DefaultEventSource.prototype.loadSPARQL = function(xml, url) { |
| var base = this._getBaseURL(url); |
| |
| var dateTimeFormat = 'iso8601'; |
| var parseDateTimeFunction = this._events.getUnit().getParser(dateTimeFormat); |
| |
| if (xml == null) { |
| return; |
| } |
| |
| /* |
| * Find <results> tag |
| */ |
| var node = xml.documentElement.firstChild; |
| while (node != null && (node.nodeType != 1 || node.nodeName != 'results')) { |
| node = node.nextSibling; |
| } |
| |
| var wikiURL = null; |
| var wikiSection = null; |
| if (node != null) { |
| wikiURL = node.getAttribute("wiki-url"); |
| wikiSection = node.getAttribute("wiki-section"); |
| |
| node = node.firstChild; |
| } |
| |
| var added = false; |
| while (node != null) { |
| if (node.nodeType == 1) { |
| var bindings = { }; |
| var binding = node.firstChild; |
| while (binding != null) { |
| if (binding.nodeType == 1 && |
| binding.firstChild != null && |
| binding.firstChild.nodeType == 1 && |
| binding.firstChild.firstChild != null && |
| binding.firstChild.firstChild.nodeType == 3) { |
| bindings[binding.getAttribute('name')] = binding.firstChild.firstChild.nodeValue; |
| } |
| binding = binding.nextSibling; |
| } |
| |
| if (bindings["start"] == null && bindings["date"] != null) { |
| bindings["start"] = bindings["date"]; |
| } |
| |
| var evt = new Timeline.DefaultEventSource.Event( |
| parseDateTimeFunction(bindings["start"]), |
| parseDateTimeFunction(bindings["end"]), |
| parseDateTimeFunction(bindings["latestStart"]), |
| parseDateTimeFunction(bindings["earliestEnd"]), |
| bindings["isDuration"] != "true", |
| bindings["title"], |
| bindings["description"], |
| this._resolveRelativeURL(bindings["image"], base), |
| this._resolveRelativeURL(bindings["link"], base), |
| this._resolveRelativeURL(bindings["icon"], base), |
| bindings["color"], |
| bindings["textColor"] |
| ); |
| evt._bindings = bindings; |
| evt.getProperty = function(name) { |
| return this._bindings[name]; |
| }; |
| evt.setWikiInfo(wikiURL, wikiSection); |
| |
| this._events.add(evt); |
| added = true; |
| } |
| node = node.nextSibling; |
| } |
| |
| if (added) { |
| this._fire("onAddMany", []); |
| } |
| }; |
| |
| Timeline.DefaultEventSource.prototype.add = function(evt) { |
| this._events.add(evt); |
| this._fire("onAddOne", [evt]); |
| }; |
| |
| Timeline.DefaultEventSource.prototype.addMany = function(events) { |
| for (var i = 0; i < events.length; i++) { |
| this._events.add(events[i]); |
| } |
| this._fire("onAddMany", []); |
| }; |
| |
| Timeline.DefaultEventSource.prototype.clear = function() { |
| this._events.removeAll(); |
| this._fire("onClear", []); |
| }; |
| |
| Timeline.DefaultEventSource.prototype.getEventIterator = function(startDate, endDate) { |
| return this._events.getIterator(startDate, endDate); |
| }; |
| |
| Timeline.DefaultEventSource.prototype.getAllEventIterator = function() { |
| return this._events.getAllIterator(); |
| }; |
| |
| Timeline.DefaultEventSource.prototype.getCount = function() { |
| return this._events.getCount(); |
| }; |
| |
| Timeline.DefaultEventSource.prototype.getEarliestDate = function() { |
| return this._events.getEarliestDate(); |
| }; |
| |
| Timeline.DefaultEventSource.prototype.getLatestDate = function() { |
| return this._events.getLatestDate(); |
| }; |
| |
| Timeline.DefaultEventSource.prototype._fire = function(handlerName, args) { |
| for (var i = 0; i < this._listeners.length; i++) { |
| var listener = this._listeners[i]; |
| if (handlerName in listener) { |
| try { |
| listener[handlerName].apply(listener, args); |
| } catch (e) { |
| Timeline.Debug.exception(e); |
| } |
| } |
| } |
| }; |
| |
| Timeline.DefaultEventSource.prototype._getBaseURL = function(url) { |
| if (url.indexOf("://") < 0) { |
| var url2 = this._getBaseURL(document.location.href); |
| if (url.substr(0,1) == "/") { |
| url = url2.substr(0, url2.indexOf("/", url2.indexOf("://") + 3)) + url; |
| } else { |
| url = url2 + url; |
| } |
| } |
| |
| var i = url.lastIndexOf("/"); |
| if (i < 0) { |
| return ""; |
| } else { |
| return url.substr(0, i+1); |
| } |
| }; |
| |
| Timeline.DefaultEventSource.prototype._resolveRelativeURL = function(url, base) { |
| if (url == null || url == "") { |
| return url; |
| } else if (url.indexOf("://") > 0) { |
| return url; |
| } else if (url.substr(0,1) == "/") { |
| return base.substr(0, base.indexOf("/", base.indexOf("://") + 3)) + url; |
| } else { |
| return base + url; |
| } |
| }; |
| |
| |
| Timeline.DefaultEventSource.Event = function( |
| start, end, latestStart, earliestEnd, instant, |
| text, description, image, link, |
| icon, color, textColor) { |
| |
| this._id = "e" + Math.floor(Math.random() * 1000000); |
| |
| this._instant = instant || (end == null); |
| |
| this._start = start; |
| this._end = (end != null) ? end : start; |
| |
| this._latestStart = (latestStart != null) ? latestStart : (instant ? this._end : this._start); |
| this._earliestEnd = (earliestEnd != null) ? earliestEnd : (instant ? this._start : this._end); |
| |
| this._text = Timeline.HTML.deEntify(text); |
| this._description = Timeline.HTML.deEntify(description); |
| this._image = (image != null && image != "") ? image : null; |
| this._link = (link != null && link != "") ? link : null; |
| |
| this._icon = (icon != null && icon != "") ? icon : null; |
| this._color = (color != null && color != "") ? color : null; |
| this._textColor = (textColor != null && textColor != "") ? textColor : null; |
| |
| this._wikiURL = null; |
| this._wikiSection = null; |
| }; |
| |
| Timeline.DefaultEventSource.Event.prototype = { |
| getID: function() { return this._id; }, |
| |
| isInstant: function() { return this._instant; }, |
| isImprecise: function() { return this._start != this._latestStart || this._end != this._earliestEnd; }, |
| |
| getStart: function() { return this._start; }, |
| getEnd: function() { return this._end; }, |
| getLatestStart: function() { return this._latestStart; }, |
| getEarliestEnd: function() { return this._earliestEnd; }, |
| |
| getText: function() { return this._text; }, |
| getDescription: function() { return this._description; }, |
| getImage: function() { return this._image; }, |
| getLink: function() { return this._link; }, |
| |
| getIcon: function() { return this._icon; }, |
| getColor: function() { return this._color; }, |
| getTextColor: function() { return this._textColor; }, |
| |
| getProperty: function(name) { return null; }, |
| |
| getWikiURL: function() { return this._wikiURL; }, |
| getWikiSection: function() { return this._wikiSection; }, |
| setWikiInfo: function(wikiURL, wikiSection) { |
| this._wikiURL = wikiURL; |
| this._wikiSection = wikiSection; |
| }, |
| |
| fillDescription: function(elmt) { |
| elmt.innerHTML = this._description; |
| }, |
| fillWikiInfo: function(elmt) { |
| if (this._wikiURL != null && this._wikiSection != null) { |
| var wikiID = this.getProperty("wikiID"); |
| if (wikiID == null || wikiID.length == 0) { |
| wikiID = this.getText(); |
| } |
| wikiID = wikiID.replace(/\s/g, "_"); |
| |
| var url = this._wikiURL + this._wikiSection.replace(/\s/g, "_") + "/" + wikiID; |
| var a = document.createElement("a"); |
| a.href = url; |
| a.target = "new"; |
| a.innerHTML = Timeline.strings[Timeline.Platform.clientLocale].wikiLinkLabel; |
| |
| elmt.appendChild(document.createTextNode("[")); |
| elmt.appendChild(a); |
| elmt.appendChild(document.createTextNode("]")); |
| } else { |
| elmt.style.display = "none"; |
| } |
| }, |
| fillTime: function(elmt, labeller) { |
| if (this._instant) { |
| if (this.isImprecise()) { |
| elmt.appendChild(elmt.ownerDocument.createTextNode(labeller.labelPrecise(this._start))); |
| elmt.appendChild(elmt.ownerDocument.createElement("br")); |
| elmt.appendChild(elmt.ownerDocument.createTextNode(labeller.labelPrecise(this._end))); |
| } else { |
| elmt.appendChild(elmt.ownerDocument.createTextNode(labeller.labelPrecise(this._start))); |
| } |
| } else { |
| if (this.isImprecise()) { |
| elmt.appendChild(elmt.ownerDocument.createTextNode( |
| labeller.labelPrecise(this._start) + " ~ " + labeller.labelPrecise(this._latestStart))); |
| elmt.appendChild(elmt.ownerDocument.createElement("br")); |
| elmt.appendChild(elmt.ownerDocument.createTextNode( |
| labeller.labelPrecise(this._earliestEnd) + " ~ " + labeller.labelPrecise(this._end))); |
| } else { |
| elmt.appendChild(elmt.ownerDocument.createTextNode(labeller.labelPrecise(this._start))); |
| elmt.appendChild(elmt.ownerDocument.createElement("br")); |
| elmt.appendChild(elmt.ownerDocument.createTextNode(labeller.labelPrecise(this._end))); |
| } |
| } |
| }, |
| fillInfoBubble: function(elmt, theme, labeller) { |
| var doc = elmt.ownerDocument; |
| |
| var title = this.getText(); |
| var link = this.getLink(); |
| var image = this.getImage(); |
| |
| if (image != null) { |
| var img = doc.createElement("img"); |
| img.src = image; |
| |
| theme.event.bubble.imageStyler(img); |
| elmt.appendChild(img); |
| } |
| |
| var divTitle = doc.createElement("div"); |
| var textTitle = doc.createTextNode(title); |
| if (link != null) { |
| var a = doc.createElement("a"); |
| a.href = link; |
| a.appendChild(textTitle); |
| divTitle.appendChild(a); |
| } else { |
| divTitle.appendChild(textTitle); |
| } |
| theme.event.bubble.titleStyler(divTitle); |
| elmt.appendChild(divTitle); |
| |
| var divBody = doc.createElement("div"); |
| this.fillDescription(divBody); |
| theme.event.bubble.bodyStyler(divBody); |
| elmt.appendChild(divBody); |
| |
| var divTime = doc.createElement("div"); |
| this.fillTime(divTime, labeller); |
| theme.event.bubble.timeStyler(divTime); |
| elmt.appendChild(divTime); |
| |
| var divWiki = doc.createElement("div"); |
| this.fillWikiInfo(divWiki); |
| theme.event.bubble.wikiStyler(divWiki); |
| elmt.appendChild(divWiki); |
| } |
| }; |