123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277 |
- function AjaxThing() {
- var xmlhttprequest = null;
- if(window.XMLHttpRequest) {
- try {
- xmlhttprequest = new XMLHttpRequest();
- }
- catch (e) {
- }
- }
- else if (window.ActiveXObject) {
- try {
- xmlhttprequest = new ActiveXObject("Msxml2.XMLHTTP");
- }
- catch (e) {
- try {
- xmlhttprequest = new ActiveXObject("Microsoft.XMLHTTP");
- }
- catch (e) {
- }
- }
- }
- return xmlhttprequest;
- }
- function FeedUpdateBroker() {
- this.httpReq = null;
- this.callback = null;
- }
- FeedUpdateBroker.prototype.fetchFeed = function(feedURL,
- callback) {
-
- this.callback = callback;
-
- this.httpReq = new AjaxThing();
-
- var self = this;
- this.httpReq.overrideMimeType('text/xml');
- this.httpReq.onreadystatechange = function() { self.readyStateChanged(); };
-
- var fullURL = feedURL;
- if (fullURL.indexOf("?") == -1) {
- fullURL += "?";
- }
- else {
- fullURL += "&";
- }
- fullURL += "nocache=" + (new Date().getTime());
-
- this.httpReq.open("GET", fullURL, true);
- this.httpReq.send(null);
- };
- FeedUpdateBroker.prototype.readyStateChanged = function() {
-
- if(this.httpReq.readyState == 4) {
-
- var responseStatus = null;
- try {
- responseStatus = this.httpReq.status;
- }
- catch (noStatusException) {
- console.debug("FeedUpdateBroker.readyStateChanged: " +noStatusException);
- }
-
- this.callback.callback.call(this.callback.that,
- this.handleResponse(this.httpReq,
- responseStatus,
- this.httpReq.responseXML));
- }
- };
- FeedUpdateBroker.prototype.handleResponse = function(response,
- responseStatus,
- xmlDoc) {
- console.debug("FeedUpdateBroker.handleResponse: " + response+ " " + xmlDoc);
- if (responseStatus == 200 && xmlDoc != null) {
-
- var feedType = this.determineFeedType(xmlDoc);
-
- var node;
-
- var lastModified = null;
-
- var items = [];
- var descriptionTagName = 'description';
- var contentTagRegex = /content/;
- var feedTitle = this.determineFeedTitle(feedType, xmlDoc);
- var itemElements = xmlDoc.getElementsByTagName("item");
- var atomFeed = false;
- if(itemElements.length == 0) {
- itemElements = xmlDoc.getElementsByTagName("entry");
- descriptionTagName = 'summary';
- atomFeed = true;
- }
-
- for(var i = 0; i < itemElements.length; i++) {
-
-
-
- var title = undefined;
- var date = undefined;
- var description = undefined;
- var url = undefined;
- var content = undefined;
- node = itemElements[i].firstChild;
- while(node != null) {
-
- if(node.nodeType == Node.ELEMENT_NODE) {
- if(node.nodeName == "title") {
-
- title = this.getTextOfNode(node);
- }
- else if(node.textContent != "" &&
- (node.nodeName == "pubDate" ||
- node.nodeName == "dc:date" ||
- node.nodeName == "updated")) {
-
- date = this.getDateOfNode(node);
- if(date) {
- if(!lastModified) {
- lastModified = date;
- }
- else if(date > lastModified) {
- lastModified = date;
- }
- }
- }
- else if(node.nodeName == descriptionTagName) {
-
- description = this.getTextOfNode(node);
- }
- else if(node.nodeName.search(contentTagRegex) != -1) {
- content = this.getTextOfNode(node);
- }
- else if(node.nodeName == "link") {
-
- if(atomFeed) {
- url = node.getAttribute('href');
- }
- else {
- url = this.getTextOfNode(node);
- }
- }
- }
- node = node.nextSibling;
- }
-
- items.push({ title: title,
- date: date,
- description: description,
- content: content,
- url: url });
- }
-
- return { URL: xmlDoc.URL,
- status: "ok",
- title: feedTitle,
- lastModified: lastModified,
- items: items };
- }
- else {
-
- return { URL: xmlDoc.URL,
- status: "error" ,
- statusText: response.statusText};
- }
- };
- FeedUpdateBroker.prototype.determineFeedType = function(xmlDoc) {
- var feedType = "";
- if(xmlDoc.getElementsByTagName("rss").length > 0) {
- feedType = "rss";
- }
- else if(xmlDoc.getElementsByTagName("feed").length > 0) {
- feedType = "atom";
- }
- return feedType;
- };
- FeedUpdateBroker.prototype.determineFeedTitle = function(feedType,
- xmlDoc) {
- var feedTitle = "";
- if(feedType === "rss") {
- var titleElements = xmlDoc.getElementsByTagName("channel")[0]
- .getElementsByTagName("title");
- feedTitle = titleElements[0].textContent;
- }
- if(feedType === "atom") {
- var titleElements = xmlDoc.getElementsByTagName("feed")[0]
- .getElementsByTagName("title");
- feedTitle = titleElements[0].textContent;
- }
- return feedTitle;
- };
- FeedUpdateBroker.prototype.getDateOfNode = function(node) {
- var dateString = this.getTextOfNode(node);
- var parsedDate = new Date();
-
- var timeStamp = Date.parse(dateString);
-
- if(!isNaN(timeStamp) &&
- timeStamp > 1) {
- parsedDate.setTime(timeStamp);
- }
- else {
- parsedDate = this.parseDateFromString(dateString);
- }
- return parsedDate;
- };
- FeedUpdateBroker.prototype.parseDateFromString = function(string) {
- var parsedDate = new Date();
- var portions = string.split('T');
-
- var yymmdd = portions[0].split('-');
- var hhmmss = portions[1].split(':');
- hhmmss[2] = hhmmss[2].replace('Z', "");
- var year = parseInt(yymmdd[0]);
-
- var month = parseInt(yymmdd[1]) -1;
- var day = parseInt(yymmdd[2]);
- var hour = parseInt(hhmmss[0]);
- var minute = parseInt(hhmmss[1]);
- var second = parseInt(hhmmss[2]);
- parsedDate.setFullYear(year, month, day);
- parsedDate.setHours(hour, minute, second, 0);
- return parsedDate;
- };
- FeedUpdateBroker.prototype.getTextOfNode = function(node) {
- var buf = "";
-
- var child = node.firstChild;
- while (child != null) {
- if (child.nodeType == Node.TEXT_NODE || child.nodeType == Node.CDATA_SECTION_NODE) {
-
- if (buf != "") {
- buf += " ";
- }
- buf += child.nodeValue;
- }
- child = child.nextSibling;
- }
- return buf;
- };
|