Harmattan porting experiments ongoing
[marketstoday] / src / qml / Library / js / CoreLogic.js
1 /*
2 @version: 0.2
3 @author: Sudheer K. <scifi1947 at gmail.com>
4 @license: GNU General Public License
5 */
6
7 var strErrorMessage;
8
9 function reloadQuotes(){
10     var query = getQuery();
11     if (query){
12         quoteRefreshStarted();
13         logUtility.logMessage("Reloading Data..");
14
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);
18
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..");
25                 }
26                 else{
27                     logUtility.logMessage("Data Reload Failed..");
28                 }
29                 quoteRefreshCompleted(success,strErrorMessage);
30             }
31         }
32
33         response.open("GET", queryURL);
34         response.send();
35     }
36     else{
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);
41     }
42 }
43
44 function getQuery(){
45     var query;
46     var symbolsArray = DBUtility.getAllSymbols();
47     if (symbolsArray && symbolsArray.length > 0){
48         var i = 0;
49         for (i = 0; i< symbolsArray.length; i++) {
50             logUtility.logMessage("Appending "+symbolsArray[i]+ " to Query");
51
52             if (!query){
53                 query = '"'+symbolsArray[i]+'"';
54             }
55             else{
56                 query = query + ',"' + symbolsArray[i]+'"';
57             }
58         }
59     }
60
61     return query;
62 }
63
64 function reloadNews(){
65     if (!rssURL || rssURL == "Unknown") {
66         logUtility.logMessage("Invalid RSS URL: "+rssURL);
67     }
68     else{
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..");
78                 }
79                 else{
80                     logUtility.logMessage("News Reload Failed..");
81                 }
82                 newsReloadCompleted(success,strErrorMessage);
83             }
84         }
85
86         response.open("GET", rssURL);
87         response.send();
88     }
89 }
90
91 function refreshDataModel(response){
92     var status = false;   
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);
98         else
99             logUtility.logMessage("No responseXML for quotes");
100         return status;
101     }
102
103     var xmlDoc = response.responseXML.documentElement;
104     var results = xmlDoc.firstChild;
105
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
108
109     if (results) {
110         var quoteNodes = results.childNodes;
111         if (quoteNodes && quoteNodes.length > 0){
112             logUtility.logMessage("Clearing Data Model");
113             stockQuoteDataModel.clear();
114
115             var i = 0;
116             for (i = 0; i < quoteNodes.length; i++) {
117
118                 var quoteElements = quoteNodes[i].childNodes;
119                 var j = 0;
120                 var symbol,stockName,lastTradedPrice,change,changePercentage,volume,marketCap
121
122                 for (j = 0; j < quoteElements.length; j++){
123
124                     switch (quoteElements[j].nodeName){
125                         case 'Symbol':
126                             symbol = quoteElements[j].childNodes[0].nodeValue;
127                             break;
128                         case 'Name':
129                             stockName = quoteElements[j].childNodes[0].nodeValue;
130                             break;
131                         case 'LastTradePriceOnly':
132                             lastTradedPrice = quoteElements[j].childNodes[0].nodeValue;
133                             break;
134                         case 'Change':
135                             change = (quoteElements[j].childNodes[0])? quoteElements[j].childNodes[0].nodeValue:"";
136                             break;
137                         case 'ChangeinPercent':
138                             changePercentage = (quoteElements[j].childNodes[0])? quoteElements[j].childNodes[0].nodeValue:"";
139                             break;
140                         case 'Volume':
141                             volume = (quoteElements[j].childNodes[0])? quoteElements[j].childNodes[0].nodeValue:"";
142                             break;
143                         case 'MarketCapitalization':
144                             marketCap = (quoteElements[j].childNodes[0])? quoteElements[j].childNodes[0].nodeValue:"";
145                             break;
146                         default:
147                     }
148                 }
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);
152             }
153
154             status = true;
155         }
156         else
157         {
158             strErrorMessage = "Quotes could not be fetched from Yahoo! Finance. Please verify the tickers and try again later."
159             logUtility.logMessage(response.responseText);
160             status = false;
161         }
162     }
163     else{
164         strErrorMessage = "Stock quote data from Yahoo! Finance is currently not available. Please try again later."
165         logUtility.logMessage(response.responseText);
166         status = false;
167     }
168
169
170     var queryNode = xmlDoc;
171     if (queryNode) {
172         i = 0;
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);
178                 break;
179             }
180         }
181     }
182
183     return status;
184 }
185
186 function refreshNewsModel(response){
187     var status = false;
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);
193         else
194             logUtility.logMessage("No responseXML for news");
195         return status;
196     }
197
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
200
201
202     var xmlDoc = response.responseXML.documentElement;
203     //var channel = xmlDoc.firstChild; Doesn't work with some RSS providers. THANK YOU, YAHOO
204
205     var channel;
206
207     var i = 0;
208     for (i = 0; i < xmlDoc.childNodes.length; i++){
209         if (xmlDoc.childNodes[i].nodeName === 'channel') {
210             channel = xmlDoc.childNodes[i];
211             break;
212         }
213     }
214
215     if (channel) {
216         var itemNodes = channel.childNodes;
217         if (itemNodes){
218
219             logUtility.logMessage("Clearing News Model");
220             newsDataModel.clear();
221             logUtility.logMessage("No. of news stories = "+itemNodes.length);
222
223             for (i = 0; i < itemNodes.length; i++) {
224                 if (itemNodes[i].nodeName === 'item'){
225                     var newsElements = itemNodes[i].childNodes;
226                     var j = 0;
227                     var newsTitle,newsLink
228                     for (j = 0; j < newsElements.length; j++){
229
230                         switch (newsElements[j].nodeName){
231                             case 'title':
232                                 newsTitle = newsElements[j].childNodes[0].nodeValue;
233                                 break;
234                             case 'link':
235                                 newsLink = newsElements[j].childNodes[0].nodeValue;
236                                 break;
237                             default:
238                         }
239                     }
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);
243                 }
244             }
245             status = true;
246         }
247         else{
248             strErrorMessage = "The RSS feed did not contain any news stories. Please try again later."
249             logUtility.logMessage(response.responseText);
250             status = false;
251         }
252     }
253     else{
254         strErrorMessage = "The RSS feed did not return valid data. Please check the URL and try again later."
255         logUtility.logMessage(response.responseText);
256         status = false;
257     }
258
259     return status;
260 }
261
262 function loadSettings(){
263     var value;
264     value  = DBUtility.getSetting("UpdateFreqency");
265     if (!value || value == "0.0" || value === "" || isNaN(value)){
266         autoUpdateInterval = 0;
267     }
268     else{
269         autoUpdateInterval = parseInt(value)*60*1000; //Convert minutes to milliseconds
270     }
271     value  = DBUtility.getSetting("UpdateWeekdaysOnly");
272     if (!value || value == "0.0" || value === ""){
273         updateWeekDaysOnly = false;
274     }
275     else{
276         updateWeekDaysOnly = true;
277     }
278
279 /*
280     value  = DBUtility.getSetting("UpdateOnSavedNetworksOnly");
281     if (!value || value == "0.0" || value === ""){
282         updateOnSavedNetworksOnly = false;
283     }
284     else{
285         updateOnSavedNetworksOnly = true;
286     }
287 */
288
289     value  = DBUtility.getSetting("RSSURL");
290     if (!value || value == "Unknown" || value === ""){
291         //Do Nothing
292     }
293     else if (value === 'http://finance.yahoo.com/rss/topstories'){
294         /*
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.
297          */
298
299             rssURL = "http://finance.yahoo.com/rss/topfinstories";
300             DBUtility.setSetting("RSSURL",rssURL);
301     }
302     else
303     {
304         rssURL = value;
305     }
306 }
307
308 function initialize(){
309     if (autoUpdateTimer.running) autoUpdateTimer.stop();
310     loadSettings();
311     reloadQuotes();
312     reloadNews();
313
314     if (autoUpdateInterval !== 0) {
315         logUtility.logMessage("Starting Timer..");
316         autoUpdateTimer.start();
317     }
318 }