3 @author: Sudheer K. <scifi1947 at gmail.com>
4 @license: GNU General Public License
9 function reloadQuotes(){
10 var query = getQuery();
12 quoteRefreshStarted();
13 logUtility.logMessage("Reloading Data..");
14 //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';
15 //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';
16 var queryURL = 'http://download.finance.yahoo.com/d/quotes.csv?s='+query+'&f=snl1c1p2vj1&e=.csv';
17 logUtility.logMessage(queryURL);
19 var response = new XMLHttpRequest();
20 response.onreadystatechange = function() {
21 if (response.readyState === XMLHttpRequest.DONE) {
22 var success = refreshDataModel(response);
23 if (success === true){
24 logUtility.logMessage("Data Reload Completed..");
27 logUtility.logMessage("Data Reload Failed..");
29 quoteRefreshCompleted(success,strErrorMessage);
33 response.open("GET", queryURL);
37 logUtility.logMessage("No stock symbols found in configuration.");
39 strErrorMessage = "Tap the title bar to add stock tickers and update settings."
41 strErrorMessage = "Use the widget settings screen to add stock tickers and update configuration."
42 stockQuoteDataModel.clear();
43 quoteRefreshCompleted(false,strErrorMessage);
49 var symbolsArray = DBUtility.getAllSymbols();
50 if (symbolsArray && symbolsArray.length > 0){
52 for (i = 0; i< symbolsArray.length; i++) {
53 logUtility.logMessage("Appending "+symbolsArray[i]+ " to Query");
56 query = symbolsArray[i];
59 query = query + '+' + symbolsArray[i];
67 function reloadNews(){
68 if (!rssURL || rssURL === "Unknown") {
69 logUtility.logMessage("Invalid RSS URL: "+rssURL);
72 logUtility.logMessage("Reloading news from "+rssURL);
73 //var queryURL = "http://finance.yahoo.com/rss/topfinstories";
74 logUtility.logMessage(rssURL);
75 var response = new XMLHttpRequest();
76 response.onreadystatechange = function() {
77 if (response.readyState === XMLHttpRequest.DONE) {
78 var success = refreshNewsModel(response);
79 if (success === true){
80 logUtility.logMessage("News Reload Completed..");
83 logUtility.logMessage("News Reload Failed..");
85 newsReloadCompleted(success,strErrorMessage);
89 response.open("GET", rssURL);
94 function refreshDataModel(response){
96 if (!response.responseText) {
97 strErrorMessage = "Error occurred while loading stock quotes."
98 logUtility.logMessage("No responseText for quotes");
103 var quoteDetails = CSVUtility.csvToArray(response.responseText.trim());
105 if (quoteDetails && quoteDetails.length > 0){
106 logUtility.logMessage("Clearing Data Model");
107 stockQuoteDataModel.clear();
109 for (i = 0; i < quoteDetails.length; i++){
111 var symbol,stockName,lastTradedPrice,change,changePercentage,volume,marketCap;
112 symbol = quoteDetails[i][0];
113 stockName = quoteDetails[i][1];
114 lastTradedPrice = quoteDetails[i][2];
115 change = quoteDetails[i][3];
116 changePercentage = quoteDetails[i][4];
117 volume = quoteDetails[i][5];
118 marketCap = quoteDetails[i][6];
120 stockQuoteDataModel.append({"symbol":symbol,"stockName":stockName,"lastTradedPrice":lastTradedPrice,"change":change,"changePercentage":changePercentage,"volume":volume,"marketCap":marketCap});
121 //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);
122 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);
126 var timeNow = new Date();
128 lastUpdatedTimeStamp = "Updated: "+DateLib.ISODate.format(timeNow);
129 logUtility.logMessage(lastUpdatedTimeStamp);
132 logUtility.logMessage("Error occured while converting timestamp");
133 logUtility.logMessage(exception);
138 strErrorMessage = "Quotes could not be fetched from Yahoo! Finance. Please verify the tickers and try again later."
139 logUtility.logMessage(response.responseText);
147 function refreshNewsModel(response){
149 if (!response.responseXML) {
150 //This shouldn't happen
151 strErrorMessage = "Error occurred while loading news."
152 if (response.responseText)
153 logUtility.logMessage(response.responseText);
155 logUtility.logMessage("No responseXML for news");
159 //Not the best code I ever wrote, but got no choice
160 //Refer to Memory leak issue with XMLListModel --> http://bugreports.qt.nokia.com/browse/QTBUG-15191
163 var xmlDoc = response.responseXML.documentElement;
164 //var channel = xmlDoc.firstChild; Doesn't work with some RSS providers. THANK YOU, YAHOO
169 for (i = 0; i < xmlDoc.childNodes.length; i++){
170 if (xmlDoc.childNodes[i].nodeName === 'channel') {
171 channel = xmlDoc.childNodes[i];
177 var itemNodes = channel.childNodes;
180 logUtility.logMessage("Clearing News Model");
181 newsDataModel.clear();
182 logUtility.logMessage("No. of news stories = "+itemNodes.length);
184 for (i = 0; i < itemNodes.length; i++) {
185 if (itemNodes[i].nodeName === 'item'){
186 var newsElements = itemNodes[i].childNodes;
188 var newsTitle,newsLink
189 for (j = 0; j < newsElements.length; j++){
191 switch (newsElements[j].nodeName){
193 newsTitle = newsElements[j].childNodes[0].nodeValue;
196 newsLink = newsElements[j].childNodes[0].nodeValue;
201 newsDataModel.append({"title":newsTitle,"link":newsLink});
202 //logUtility.logMessage("Title: "+newsDataModel.get(i).title+", Link: "+ newsDataModel.get(i).link);
203 //logUtility.logMessage("Title: "+newsTitle+", Link: "+ newsLink);
209 strErrorMessage = "The RSS feed did not contain any news stories. Please try again later."
210 logUtility.logMessage(response.responseText);
215 strErrorMessage = "The RSS feed did not return valid data. Please check the URL and try again later."
216 logUtility.logMessage(response.responseText);
223 function loadSettings(){
225 value = DBUtility.getSetting("UpdateFreqency");
226 if (!value || value == "0.0" || value === "" || isNaN(value)){
227 autoUpdateInterval = 0;
230 autoUpdateInterval = parseInt(value)*60*1000; //Convert minutes to milliseconds
232 value = DBUtility.getSetting("UpdateWeekdaysOnly");
233 if (!value || value == "0.0" || value === ""){
234 updateWeekDaysOnly = false;
237 updateWeekDaysOnly = true;
241 value = DBUtility.getSetting("UpdateOnSavedNetworksOnly");
242 if (!value || value == "0.0" || value === ""){
243 updateOnSavedNetworksOnly = false;
246 updateOnSavedNetworksOnly = true;
250 value = DBUtility.getSetting("RSSURL");
251 if (!value || value == "Unknown" || value === ""){
254 else if (value === 'http://finance.yahoo.com/rss/topstories'){
256 Yahoo changed their Top New rss feed from http://finance.yahoo.com/rss/topstories to http://finance.yahoo.com/rss/topfinstories.
257 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.
260 rssURL = "http://finance.yahoo.com/rss/topfinstories";
261 DBUtility.setSetting("RSSURL",rssURL);
269 function initialize(){
270 if (autoUpdateTimer.running) autoUpdateTimer.stop();
275 if (autoUpdateInterval !== 0) {
276 logUtility.logMessage("Starting Timer..");
277 autoUpdateTimer.start();