/*
-@version: 0.1
+@version: 0.5
@author: Sudheer K. <scifi1947 at gmail.com>
@license: GNU General Public License
*/
+var strErrorMessage;
+
+function reloadQuotes(){
+ var query = getQuery();
+ if (query){
+ quoteRefreshStarted();
+ logUtility.logMessage("Reloading Data..");
+ //var queryURL = 'http://query.yahooapis.com/v1/public/yql?q=select * from yahoo.finance.quotes where symbol in ("INDU","^IXIC","^GSPC","CLJ11.NYM","YHOO","AAPL","GOOG","MSFT")&env=store://datatables.org/alltableswithkeys';
+ //var queryURL = 'http://download.finance.yahoo.com/d/quotes.csv?s=INDU+^IXIC+^GSPC+CLJ11.NYM+YHOO+AAPL+GOOG+MSFT+ACT&f=snl1c1p2vj1&e=.csv';
+ var queryURL = 'http://download.finance.yahoo.com/d/quotes.csv?s='+query+'&f=snl1c1p2vj1&e=.csv';
+ logUtility.logMessage(queryURL);
+
+ var response = new XMLHttpRequest();
+ response.onreadystatechange = function() {
+ if (response.readyState === XMLHttpRequest.DONE) {
+ var success = refreshDataModel(response);
+ if (success === true){
+ logUtility.logMessage("Data Reload Completed..");
+ }
+ else{
+ logUtility.logMessage("Data Reload Failed..");
+ }
+ quoteRefreshCompleted(success,strErrorMessage);
+ }
+ }
+
+ response.open("GET", queryURL);
+ response.send();
+ }
+ else{
+ logUtility.logMessage("No stock symbols found in configuration.");
+ if (!isDesktopWidget)
+ strErrorMessage = "Tap the title bar to add stock tickers and update settings."
+ else
+ strErrorMessage = "Use the widget settings screen to add stock tickers and update configuration."
+ stockQuoteDataModel.clear();
+ quoteRefreshCompleted(false,strErrorMessage);
+ }
+}
+
function getQuery(){
var query;
var symbolsArray = DBUtility.getAllSymbols();
logUtility.logMessage("Appending "+symbolsArray[i]+ " to Query");
if (!query){
- query = '"'+symbolsArray[i]+'"';
+ query = symbolsArray[i];
}
else{
- query = query + ',"' + symbolsArray[i]+'"';
+ query = query + '+' + symbolsArray[i];
}
}
}
return query;
}
-function refreshDataModel(responseXML){
- if (!(responseXML && stockQuoteDataModel)) return;
-
- var xmlDoc = responseXML.documentElement;
- var results = xmlDoc.firstChild;
+function reloadNews(){
+ if (!rssURL || rssURL === "Unknown") {
+ logUtility.logMessage("Invalid RSS URL: "+rssURL);
+ }
+ else{
+ logUtility.logMessage("Reloading news from "+rssURL);
+ //var queryURL = "http://finance.yahoo.com/rss/topfinstories";
+ logUtility.logMessage(rssURL);
+ var response = new XMLHttpRequest();
+ response.onreadystatechange = function() {
+ if (response.readyState === XMLHttpRequest.DONE) {
+ var success = refreshNewsModel(response);
+ if (success === true){
+ logUtility.logMessage("News Reload Completed..");
+ }
+ else{
+ logUtility.logMessage("News Reload Failed..");
+ }
+ newsReloadCompleted(success,strErrorMessage);
+ }
+ }
- //Not the best code I ever wrote, but got no choice
- //Refer to Memory leak issue with XMLListModel --> http://bugreports.qt.nokia.com/browse/QTBUG-15191
+ response.open("GET", rssURL);
+ response.send();
+ }
+}
- if (results) {
- var quoteNodes = results.childNodes;
- if (quoteNodes){
+function refreshDataModel(response){
+ var status = false;
+ if (!response.responseText) {
+ strErrorMessage = "Error occurred while loading stock quotes."
+ logUtility.logMessage("No responseText for quotes");
+ return status;
+ }
+ else{
+ //snl1c1p2vj1
+ var quoteDetails = CSVUtility.csvToArray(response.responseText.trim());
+ var i = 0;
+ if (quoteDetails && quoteDetails.length > 0){
logUtility.logMessage("Clearing Data Model");
stockQuoteDataModel.clear();
- var i = 0;
- for (i = 0; i < quoteNodes.length; i++) {
-
- var quoteElements = quoteNodes[i].childNodes;
- var j = 0;
- var symbol,stockName,lastTradedPrice,change,changePercentage
-
- for (j = 0; j < quoteElements.length; j++){
-
- switch (quoteElements[j].nodeName){
- case 'Symbol':
- symbol = quoteElements[j].childNodes[0].nodeValue;
- break;
- case 'Name':
- stockName = quoteElements[j].childNodes[0].nodeValue;
- break;
- case 'LastTradePriceOnly':
- lastTradedPrice = quoteElements[j].childNodes[0].nodeValue;
- break;
- case 'Change':
- change = quoteElements[j].childNodes[0].nodeValue;
- break;
- case 'ChangeinPercent':
- changePercentage = quoteElements[j].childNodes[0].nodeValue;
- break;
- default:
- }
- }
- stockQuoteDataModel.append({"symbol":symbol,"stockName":stockName,"lastTradedPrice":lastTradedPrice,"change":change,"changePercentage":changePercentage});
- logUtility.logMessage("Symbol: "+stockQuoteDataModel.get(i).symbol+", Name: "+ stockQuoteDataModel.get(i).stockName+", LastTraded: "+stockQuoteDataModel.get(i).lastTradedPrice+", Change: "+stockQuoteDataModel.get(i).change+", ChangePercent: "+stockQuoteDataModel.get(i).changePercentage);
+ for (i = 0; i < quoteDetails.length; i++){
+
+ var symbol,stockName,lastTradedPrice,change,changePercentage,volume,marketCap;
+ symbol = quoteDetails[i][0];
+ stockName = quoteDetails[i][1];
+ lastTradedPrice = quoteDetails[i][2];
+ change = (quoteDetails[i][3] !== 'N/A')? quoteDetails[i][3]:'';
+ changePercentage = (quoteDetails[i][4] !== 'N/A')? quoteDetails[i][4]:'';
+ volume = (quoteDetails[i][5] !== 'N/A')? quoteDetails[i][5]:'';
+ marketCap = (quoteDetails[i][6] !== 'N/A')? quoteDetails[i][6]:'';
+
+ stockQuoteDataModel.append({"symbol":symbol,"stockName":stockName,"lastTradedPrice":lastTradedPrice,"change":change,"changePercentage":changePercentage,"volume":volume,"marketCap":marketCap});
+ //logUtility.logMessage("Symbol: "+stockQuoteDataModel.get(i).symbol+", Name: "+ stockQuoteDataModel.get(i).stockName+", LastTraded: "+stockQuoteDataModel.get(i).lastTradedPrice+", Change: "+stockQuoteDataModel.get(i).change+", ChangePercent: "+stockQuoteDataModel.get(i).changePercentage+", Volume: "+stockQuoteDataModel.get(i).volume+", MarketCap: "+stockQuoteDataModel.get(i).marketCap);
+ logUtility.logMessage(stockQuoteDataModel.get(i).symbol+", "+stockQuoteDataModel.get(i).lastTradedPrice+", "+stockQuoteDataModel.get(i).change+", "+stockQuoteDataModel.get(i).changePercentage+", "+stockQuoteDataModel.get(i).volume+", "+stockQuoteDataModel.get(i).marketCap);
}
- }
- }
- var queryNode = xmlDoc;
- if (queryNode) {
- var i = 0;
- var queryAttributes = queryNode.attributes;
- for (i = 0; i < queryAttributes.length; i++) {
- if (queryAttributes[i].name == 'created') {
- screen.lastUpdatedTimeStamp = "Updated: "+DateLib.ISODate.format(queryAttributes[i].value);
- logUtility.logMessage(screen.lastUpdatedTimeStamp);
- break;
+ status = true;
+ var timeNow = new Date();
+ try{
+ lastUpdatedTimeStamp = "Updated: "+DateLib.ISODate.format(timeNow);
+ logUtility.logMessage(lastUpdatedTimeStamp);
+ }
+ catch(exception){
+ logUtility.logMessage("Error occured while converting timestamp");
+ logUtility.logMessage(exception);
}
}
+ else
+ {
+ strErrorMessage = "Quotes could not be fetched from Yahoo! Finance. Please verify the tickers and try again later."
+ logUtility.logMessage(response.responseText);
+ status = false;
+ }
}
+
+ return status;
}
+function refreshNewsModel(response){
+ var status = false;
+ if (!response.responseXML) {
+ //This shouldn't happen
+ strErrorMessage = "Error occurred while loading news."
+ if (response.responseText)
+ logUtility.logMessage(response.responseText);
+ else
+ logUtility.logMessage("No responseXML for news");
+ return status;
+ }
-function reloadQuotes(){
- var query = getQuery();
- if (query){
- screen.quoteRefreshStarted();
- logUtility.logMessage("Reloading Data..");
+ //Not the best code I ever wrote, but got no choice
+ //Refer to Memory leak issue with XMLListModel --> http://bugreports.qt.nokia.com/browse/QTBUG-15191
- //var queryURL = 'http://query.yahooapis.com/v1/public/yql?q=select * from yahoo.finance.quotes where symbol in ("INDU","^IXIC","^GSPC","CLJ11.NYM","YHOO","AAPL","GOOG","MSFT")&env=store://datatables.org/alltableswithkeys';
- var queryURL = 'http://query.yahooapis.com/v1/public/yql?q=select Symbol,Name,LastTradePriceOnly,Change,ChangeinPercent from yahoo.finance.quotes where symbol in ('+query+')&env=store://datatables.org/alltableswithkeys';
- logUtility.logMessage(queryURL);
- var response = new XMLHttpRequest();
- response.onreadystatechange = function() {
- if (response.readyState == XMLHttpRequest.DONE) {
- refreshDataModel(response.responseXML);
- logUtility.logMessage("Data Reload Completed..");
- screen.quoteRefreshCompleted();
- }
+ var xmlDoc = response.responseXML.documentElement;
+ //var channel = xmlDoc.firstChild; Doesn't work with some RSS providers. THANK YOU, YAHOO
+
+ var channel;
+
+ var i = 0;
+ for (i = 0; i < xmlDoc.childNodes.length; i++){
+ if (xmlDoc.childNodes[i].nodeName === 'channel') {
+ channel = xmlDoc.childNodes[i];
+ break;
}
+ }
- response.open("GET", queryURL);
- response.send();
+ if (channel) {
+ var itemNodes = channel.childNodes;
+ if (itemNodes){
+
+ logUtility.logMessage("Clearing News Model");
+ newsDataModel.clear();
+ logUtility.logMessage("No. of news stories = "+itemNodes.length);
+
+ for (i = 0; i < itemNodes.length; i++) {
+ if (itemNodes[i].nodeName === 'item'){
+ var newsElements = itemNodes[i].childNodes;
+ var j = 0;
+ var newsTitle,newsLink
+ for (j = 0; j < newsElements.length; j++){
+
+ switch (newsElements[j].nodeName){
+ case 'title':
+ newsTitle = newsElements[j].childNodes[0].nodeValue;
+ break;
+ case 'link':
+ newsLink = newsElements[j].childNodes[0].nodeValue;
+ break;
+ default:
+ }
+ }
+ newsDataModel.append({"title":newsTitle,"link":newsLink});
+ //logUtility.logMessage("Title: "+newsDataModel.get(i).title+", Link: "+ newsDataModel.get(i).link);
+ //logUtility.logMessage("Title: "+newsTitle+", Link: "+ newsLink);
+ }
+ }
+ status = true;
+ }
+ else{
+ strErrorMessage = "The RSS feed did not contain any news stories. Please try again later."
+ logUtility.logMessage(response.responseText);
+ status = false;
+ }
}
else{
- logUtility.logMessage("No stock symbols found in configuration.");
+ strErrorMessage = "The RSS feed did not return valid data. Please check the URL and try again later."
+ logUtility.logMessage(response.responseText);
+ status = false;
}
+
+ return status;
}
function loadSettings(){
var value;
value = DBUtility.getSetting("UpdateFreqency");
- if (!value || value == "0.0" || value === ""){
+ if (!value || value == "0.0" || value === "" || isNaN(value)){
autoUpdateInterval = 0;
}
else{
updateWeekDaysOnly = true;
}
+/*
value = DBUtility.getSetting("UpdateOnSavedNetworksOnly");
if (!value || value == "0.0" || value === ""){
updateOnSavedNetworksOnly = false;
else{
updateOnSavedNetworksOnly = true;
}
+*/
+
+ value = DBUtility.getSetting("RSSURL");
+ if (!value || value == "Unknown" || value === ""){
+ //Do Nothing
+ }
+ else if (value === 'http://finance.yahoo.com/rss/topstories'){
+ /*
+ Yahoo changed their Top New rss feed from http://finance.yahoo.com/rss/topstories to http://finance.yahoo.com/rss/topfinstories.
+ Since the application has a hardcoded default rss feed, it is better to update it here. Not sure if this is the best way to deal with such changes.
+ */
+ rssURL = "http://finance.yahoo.com/rss/topfinstories";
+ DBUtility.setSetting("RSSURL",rssURL);
+ }
+ else
+ {
+ rssURL = value;
+ }
}
function initialize(){
if (autoUpdateTimer.running) autoUpdateTimer.stop();
loadSettings();
reloadQuotes();
+ reloadNews();
if (autoUpdateInterval !== 0) {
logUtility.logMessage("Starting Timer..");