blob: 9cd54195e1b5e8f92dcfc5ab0c450aa14653ac06 [file] [log] [blame]
/*==================================================
* 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);
}
};