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..");
15 //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';
16 var queryURL = 'http://query.yahooapis.com/v1/public/yql?q=select Symbol,Name,LastTradePriceOnly,Change,ChangeinPercent,Volume,MarketCapitalization from yahoo.finance.quotes where symbol in ('+query+')&env=store://datatables.org/alltableswithkeys';
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.");
38 strErrorMessage = "Tap the title bar to add stock tickers and update settings."
39 stockQuoteDataModel.clear();
40 quoteRefreshCompleted(false,strErrorMessage);
46 var symbolsArray = DBUtility.getAllSymbols();
47 if (symbolsArray && symbolsArray.length > 0){
49 for (i = 0; i< symbolsArray.length; i++) {
50 logUtility.logMessage("Appending "+symbolsArray[i]+ " to Query");
53 query = '"'+symbolsArray[i]+'"';
56 query = query + ',"' + symbolsArray[i]+'"';
64 function reloadNews(){
65 if (!rssURL || rssURL == "Unknown") {
66 logUtility.logMessage("Invalid RSS URL: "+rssURL);
69 logUtility.logMessage("Reloading news from "+rssURL);
70 //var queryURL = "http://finance.yahoo.com/rss/topfinstories";
71 logUtility.logMessage(rssURL);
72 var response = new XMLHttpRequest();
73 response.onreadystatechange = function() {
74 if (response.readyState == XMLHttpRequest.DONE) {
75 var success = refreshNewsModel(response);
76 if (success === true){
77 logUtility.logMessage("News Reload Completed..");
80 logUtility.logMessage("News Reload Failed..");
82 newsReloadCompleted(success,strErrorMessage);
86 response.open("GET", rssURL);
91 function refreshDataModel(response){
93 if (!response.responseXML) {
94 //This shouldn't happen
95 strErrorMessage = "Error occurred while loading stock quotes. Please contact the developer."
96 if (response.responseText)
97 logUtility.logMessage(response.responseText);
99 logUtility.logMessage("No responseXML for quotes");
103 var xmlDoc = response.responseXML.documentElement;
104 var results = xmlDoc.firstChild;
106 //Not the best code I ever wrote, but got no choice
107 //Refer to Memory leak issue with XMLListModel --> http://bugreports.qt.nokia.com/browse/QTBUG-15191
110 var quoteNodes = results.childNodes;
111 if (quoteNodes && quoteNodes.length > 0){
112 logUtility.logMessage("Clearing Data Model");
113 stockQuoteDataModel.clear();
116 for (i = 0; i < quoteNodes.length; i++) {
118 var quoteElements = quoteNodes[i].childNodes;
120 var symbol,stockName,lastTradedPrice,change,changePercentage,volume,marketCap
122 for (j = 0; j < quoteElements.length; j++){
124 switch (quoteElements[j].nodeName){
126 symbol = quoteElements[j].childNodes[0].nodeValue;
129 stockName = quoteElements[j].childNodes[0].nodeValue;
131 case 'LastTradePriceOnly':
132 lastTradedPrice = quoteElements[j].childNodes[0].nodeValue;
135 change = (quoteElements[j].childNodes[0])? quoteElements[j].childNodes[0].nodeValue:"";
137 case 'ChangeinPercent':
138 changePercentage = (quoteElements[j].childNodes[0])? quoteElements[j].childNodes[0].nodeValue:"";
141 volume = (quoteElements[j].childNodes[0])? quoteElements[j].childNodes[0].nodeValue:"";
143 case 'MarketCapitalization':
144 marketCap = (quoteElements[j].childNodes[0])? quoteElements[j].childNodes[0].nodeValue:"";
149 stockQuoteDataModel.append({"symbol":symbol,"stockName":stockName,"lastTradedPrice":lastTradedPrice,"change":change,"changePercentage":changePercentage,"volume":volume,"marketCap":marketCap});
150 //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);
151 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);
158 strErrorMessage = "Quotes could not be fetched from Yahoo! Finance. Please verify the tickers and try again later."
159 logUtility.logMessage(response.responseText);
164 strErrorMessage = "Stock quote data from Yahoo! Finance is currently not available. Please try again later."
165 logUtility.logMessage(response.responseText);
170 var queryNode = xmlDoc;
173 var queryAttributes = queryNode.attributes;
174 for (i = 0; i < queryAttributes.length; i++) {
175 if (queryAttributes[i].name == 'created') {
176 lastUpdatedTimeStamp = "Updated: "+DateLib.ISODate.format(queryAttributes[i].value);
177 logUtility.logMessage(lastUpdatedTimeStamp);
186 function refreshNewsModel(response){
188 if (!response.responseXML) {
189 //This shouldn't happen
190 strErrorMessage = "Error occurred while loading news. Please contact the developer."
191 if (response.responseText)
192 logUtility.logMessage(response.responseText);
194 logUtility.logMessage("No responseXML for news");
198 //Not the best code I ever wrote, but got no choice
199 //Refer to Memory leak issue with XMLListModel --> http://bugreports.qt.nokia.com/browse/QTBUG-15191
202 var xmlDoc = response.responseXML.documentElement;
203 //var channel = xmlDoc.firstChild; Doesn't work with some RSS providers. THANK YOU, YAHOO
208 for (i = 0; i < xmlDoc.childNodes.length; i++){
209 if (xmlDoc.childNodes[i].nodeName === 'channel') {
210 channel = xmlDoc.childNodes[i];
216 var itemNodes = channel.childNodes;
219 logUtility.logMessage("Clearing News Model");
220 newsDataModel.clear();
221 logUtility.logMessage("No. of news stories = "+itemNodes.length);
223 for (i = 0; i < itemNodes.length; i++) {
224 if (itemNodes[i].nodeName === 'item'){
225 var newsElements = itemNodes[i].childNodes;
227 var newsTitle,newsLink
228 for (j = 0; j < newsElements.length; j++){
230 switch (newsElements[j].nodeName){
232 newsTitle = newsElements[j].childNodes[0].nodeValue;
235 newsLink = newsElements[j].childNodes[0].nodeValue;
240 newsDataModel.append({"title":newsTitle,"link":newsLink});
241 //logUtility.logMessage("Title: "+newsDataModel.get(i).title+", Link: "+ newsDataModel.get(i).link);
242 //logUtility.logMessage("Title: "+newsTitle+", Link: "+ newsLink);
248 strErrorMessage = "The RSS feed did not contain any news stories. Please try again later."
249 logUtility.logMessage(response.responseText);
254 strErrorMessage = "The RSS feed did not return valid data. Please check the URL and try again later."
255 logUtility.logMessage(response.responseText);
262 function loadSettings(){
264 value = DBUtility.getSetting("UpdateFreqency");
265 if (!value || value == "0.0" || value === "" || isNaN(value)){
266 autoUpdateInterval = 0;
269 autoUpdateInterval = parseInt(value)*60*1000; //Convert minutes to milliseconds
271 value = DBUtility.getSetting("UpdateWeekdaysOnly");
272 if (!value || value == "0.0" || value === ""){
273 updateWeekDaysOnly = false;
276 updateWeekDaysOnly = true;
280 value = DBUtility.getSetting("UpdateOnSavedNetworksOnly");
281 if (!value || value == "0.0" || value === ""){
282 updateOnSavedNetworksOnly = false;
285 updateOnSavedNetworksOnly = true;
289 value = DBUtility.getSetting("RSSURL");
290 if (!value || value == "Unknown" || value === ""){
293 else if (value === 'http://finance.yahoo.com/rss/topstories'){
295 Yahoo changed their Top New rss feed from http://finance.yahoo.com/rss/topstories to http://finance.yahoo.com/rss/topfinstories.
296 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.
299 rssURL = "http://finance.yahoo.com/rss/topfinstories";
300 DBUtility.setSetting("RSSURL",rssURL);
308 function initialize(){
309 if (autoUpdateTimer.running) autoUpdateTimer.stop();
314 if (autoUpdateInterval !== 0) {
315 logUtility.logMessage("Starting Timer..");
316 autoUpdateTimer.start();