Release 0.3-1 (Including all changes)
[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 function getQuery(){
8     var query;
9     var symbolsArray = DBUtility.getAllSymbols();
10     if (symbolsArray && symbolsArray.length > 0){
11         var i = 0;
12         for (i = 0; i< symbolsArray.length; i++) {
13             logUtility.logMessage("Appending "+symbolsArray[i]+ " to Query");
14
15             if (!query){
16                 query = '"'+symbolsArray[i]+'"';
17             }
18             else{
19                 query = query + ',"' + symbolsArray[i]+'"';
20             }
21         }
22     }
23
24     return query;
25 }
26
27 function refreshDataModel(responseXML){
28     if (!(responseXML && stockQuoteDataModel)) return;
29
30     var xmlDoc = responseXML.documentElement;
31     var results = xmlDoc.firstChild;
32
33     //Not the best code I ever wrote, but got no choice
34     //Refer to Memory leak issue with XMLListModel --> http://bugreports.qt.nokia.com/browse/QTBUG-15191
35
36     if (results) {
37         var quoteNodes = results.childNodes;
38         if (quoteNodes){
39             logUtility.logMessage("Clearing Data Model");
40             stockQuoteDataModel.clear();
41
42             var i = 0;
43             for (i = 0; i < quoteNodes.length; i++) {
44
45                 var quoteElements = quoteNodes[i].childNodes;
46                 var j = 0;
47                 var symbol,stockName,lastTradedPrice,change,changePercentage,volume,marketCap
48
49                 for (j = 0; j < quoteElements.length; j++){
50
51                     switch (quoteElements[j].nodeName){
52                         case 'Symbol':
53                             symbol = quoteElements[j].childNodes[0].nodeValue;
54                             break;
55                         case 'Name':
56                             stockName = quoteElements[j].childNodes[0].nodeValue;
57                             break;
58                         case 'LastTradePriceOnly':
59                             lastTradedPrice = quoteElements[j].childNodes[0].nodeValue;
60                             break;
61                         case 'Change':
62                             change = (quoteElements[j].childNodes[0])? quoteElements[j].childNodes[0].nodeValue:"";
63                             break;
64                         case 'ChangeinPercent':
65                             changePercentage = (quoteElements[j].childNodes[0])? quoteElements[j].childNodes[0].nodeValue:"";
66                             break;
67                         case 'Volume':
68                             volume = (quoteElements[j].childNodes[0])? quoteElements[j].childNodes[0].nodeValue:"";
69                             break;
70                         case 'MarketCapitalization':
71                             marketCap = (quoteElements[j].childNodes[0])? quoteElements[j].childNodes[0].nodeValue:"";
72                             break;
73                         default:
74                     }
75                 }
76                 stockQuoteDataModel.append({"symbol":symbol,"stockName":stockName,"lastTradedPrice":lastTradedPrice,"change":change,"changePercentage":changePercentage,"volume":volume,"marketCap":marketCap});
77                 //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);
78                 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);
79             }
80         }
81     }
82
83     var queryNode = xmlDoc;
84     if (queryNode) {
85         i = 0;
86         var queryAttributes = queryNode.attributes;
87         for (i = 0; i < queryAttributes.length; i++) {
88             if (queryAttributes[i].name == 'created') {
89                 screen.lastUpdatedTimeStamp = "Updated: "+DateLib.ISODate.format(queryAttributes[i].value);
90                 logUtility.logMessage(screen.lastUpdatedTimeStamp);
91                 break;
92             }
93         }
94     }
95 }
96
97 function refreshNewsModel(responseXML){
98     if (!(responseXML && newsDataModel)) return;
99
100     var xmlDoc = responseXML.documentElement;
101     var channel = xmlDoc.firstChild;
102
103     //Not the best code I ever wrote, but got no choice
104     //Refer to Memory leak issue with XMLListModel --> http://bugreports.qt.nokia.com/browse/QTBUG-15191
105
106     if (channel) {
107         var itemNodes = channel.childNodes;
108         if (itemNodes){
109
110             logUtility.logMessage("Clearing News Model");
111             newsDataModel.clear();
112
113             var i = 0;
114             for (i = 0; i < itemNodes.length; i++) {
115
116                 if (itemNodes[i].nodeName === 'item'){
117                     var newsElements = itemNodes[i].childNodes;
118                     var j = 0;
119                     var newsTitle,newsLink
120                     for (j = 0; j < newsElements.length; j++){
121
122                         switch (newsElements[j].nodeName){
123                             case 'title':
124                                 newsTitle = newsElements[j].childNodes[0].nodeValue;
125                                 break;
126                             case 'link':
127                                 newsLink = newsElements[j].childNodes[0].nodeValue;
128                                 break;
129                             default:
130                         }
131                     }
132                     newsDataModel.append({"title":newsTitle,"link":newsLink});
133                     //logUtility.logMessage("Title: "+newsDataModel.get(i).title+", Link: "+ newsDataModel.get(i).link);
134                     //logUtility.logMessage("Title: "+newsTitle+", Link: "+ newsLink);
135                 }
136             }
137         }
138     }
139 }
140
141 function reloadQuotes(){
142     var query = getQuery();
143     if (query){
144         screen.quoteRefreshStarted();
145         logUtility.logMessage("Reloading Data..");
146
147         //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';
148         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';
149         logUtility.logMessage(queryURL);
150
151         var response = new XMLHttpRequest();
152         response.onreadystatechange = function() {
153             if (response.readyState == XMLHttpRequest.DONE) {
154                 refreshDataModel(response.responseXML);
155                 logUtility.logMessage("Data Reload Completed..");
156                 screen.quoteRefreshCompleted();
157             }
158         }
159
160         response.open("GET", queryURL);
161         response.send();
162     }
163     else{
164         logUtility.logMessage("No stock symbols found in configuration.");
165     }
166 }
167
168 function reloadNews(){
169     if (!rssURL || rssURL == "Unknown") {
170         logUtility.logMessage("Invalid RSS URL: "+rssURL);
171     }
172     else{
173         logUtility.logMessage("Reloading news from "+rssURL);
174         //var queryURL = "http://finance.yahoo.com/rss/topstories";
175         logUtility.logMessage(rssURL);
176         var response = new XMLHttpRequest();
177         response.onreadystatechange = function() {
178             if (response.readyState == XMLHttpRequest.DONE) {
179                 refreshNewsModel(response.responseXML);
180                 logUtility.logMessage("News Reload Completed..");
181             }
182         }
183
184         response.open("GET", rssURL);
185         response.send();
186     }
187 }
188
189
190 function loadSettings(){
191     var value;
192     value  = DBUtility.getSetting("UpdateFreqency");
193     if (!value || value == "0.0" || value === "" || isNaN(value)){
194         autoUpdateInterval = 0;
195     }
196     else{
197         autoUpdateInterval = parseInt(value)*60*1000; //Convert minutes to milliseconds
198     }
199     value  = DBUtility.getSetting("UpdateWeekdaysOnly");
200     if (!value || value == "0.0" || value === ""){
201         updateWeekDaysOnly = false;
202     }
203     else{
204         updateWeekDaysOnly = true;
205     }
206
207 /*
208     value  = DBUtility.getSetting("UpdateOnSavedNetworksOnly");
209     if (!value || value == "0.0" || value === ""){
210         updateOnSavedNetworksOnly = false;
211     }
212     else{
213         updateOnSavedNetworksOnly = true;
214     }
215 */
216
217     value  = DBUtility.getSetting("RSSURL");
218     if (!value || value == "Unknown" || value === ""){
219         //Do Nothing
220     }
221     else{
222         rssURL = value;
223     }
224 }
225
226 function initialize(){
227     if (autoUpdateTimer.running) autoUpdateTimer.stop();
228     loadSettings();
229     reloadQuotes();
230     reloadNews();
231
232     if (autoUpdateInterval !== 0) {
233         logUtility.logMessage("Starting Timer..");
234         autoUpdateTimer.start();
235     }
236 }