Harmattan porting experiments ongoing
[marketstoday] / src / qml / Library / js / CoreLogic.js
index e39d016..11341e2 100644 (file)
@@ -4,6 +4,43 @@
 @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://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';
+        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.");
+        strErrorMessage = "Tap the title bar to add stock tickers and update settings."
+        stockQuoteDataModel.clear();
+        quoteRefreshCompleted(false,strErrorMessage);
+    }
+}
+
 function getQuery(){
     var query;
     var symbolsArray = DBUtility.getAllSymbols();
@@ -24,10 +61,46 @@ function getQuery(){
     return query;
 }
 
-function refreshDataModel(responseXML){
-    if (!(responseXML && stockQuoteDataModel)) return;
+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);
+            }
+        }
 
-    var xmlDoc = responseXML.documentElement;
+        response.open("GET", rssURL);
+        response.send();
+    }
+}
+
+function refreshDataModel(response){
+    var status = false;   
+    if (!response.responseXML) {
+        //This shouldn't happen
+        strErrorMessage = "Error occurred while loading stock quotes. Please contact the developer."
+        if (response.responseText)
+            logUtility.logMessage(response.responseText);
+        else
+            logUtility.logMessage("No responseXML for quotes");
+        return status;
+    }
+
+    var xmlDoc = response.responseXML.documentElement;
     var results = xmlDoc.firstChild;
 
     //Not the best code I ever wrote, but got no choice
@@ -35,7 +108,7 @@ function refreshDataModel(responseXML){
 
     if (results) {
         var quoteNodes = results.childNodes;
-        if (quoteNodes){
+        if (quoteNodes && quoteNodes.length > 0){
             logUtility.logMessage("Clearing Data Model");
             stockQuoteDataModel.clear();
 
@@ -77,8 +150,22 @@ function refreshDataModel(responseXML){
                 //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);
             }
+
+            status = true;
+        }
+        else
+        {
+            strErrorMessage = "Quotes could not be fetched from Yahoo! Finance. Please verify the tickers and try again later."
+            logUtility.logMessage(response.responseText);
+            status = false;
         }
     }
+    else{
+        strErrorMessage = "Stock quote data from Yahoo! Finance is currently not available. Please try again later."
+        logUtility.logMessage(response.responseText);
+        status = false;
+    }
+
 
     var queryNode = xmlDoc;
     if (queryNode) {
@@ -86,33 +173,54 @@ function refreshDataModel(responseXML){
         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);
+                lastUpdatedTimeStamp = "Updated: "+DateLib.ISODate.format(queryAttributes[i].value);
+                logUtility.logMessage(lastUpdatedTimeStamp);
                 break;
             }
         }
     }
-}
 
-function refreshNewsModel(responseXML){
-    if (!(responseXML && newsDataModel)) return;
+    return status;
+}
 
-    var xmlDoc = responseXML.documentElement;
-    var channel = xmlDoc.firstChild;
+function refreshNewsModel(response){
+    var status = false;
+    if (!response.responseXML) {
+        //This shouldn't happen
+        strErrorMessage = "Error occurred while loading news. Please contact the developer."
+        if (response.responseText)
+            logUtility.logMessage(response.responseText);
+        else
+            logUtility.logMessage("No responseXML for news");
+        return status;
+    }
 
     //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 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;
+        }
+    }
+
     if (channel) {
         var itemNodes = channel.childNodes;
         if (itemNodes){
 
             logUtility.logMessage("Clearing News Model");
             newsDataModel.clear();
+            logUtility.logMessage("No. of news stories = "+itemNodes.length);
 
-            var i = 0;
             for (i = 0; i < itemNodes.length; i++) {
-
                 if (itemNodes[i].nodeName === 'item'){
                     var newsElements = itemNodes[i].childNodes;
                     var j = 0;
@@ -134,59 +242,23 @@ function refreshNewsModel(responseXML){
                     //logUtility.logMessage("Title: "+newsTitle+", Link: "+ newsLink);
                 }
             }
+            status = true;
         }
-    }
-}
-
-function reloadQuotes(){
-    var query = getQuery();
-    if (query){
-        screen.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://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';
-        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();
-            }
+        else{
+            strErrorMessage = "The RSS feed did not contain any news stories. Please try again later."
+            logUtility.logMessage(response.responseText);
+            status = false;
         }
-
-        response.open("GET", queryURL);
-        response.send();
     }
     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;
     }
-}
 
-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/topstories";
-        logUtility.logMessage(rssURL);
-        var response = new XMLHttpRequest();
-        response.onreadystatechange = function() {
-            if (response.readyState == XMLHttpRequest.DONE) {
-                refreshNewsModel(response.responseXML);
-                logUtility.logMessage("News Reload Completed..");
-            }
-        }
-
-        response.open("GET", rssURL);
-        response.send();
-    }
+    return status;
 }
 
-
 function loadSettings(){
     var value;
     value  = DBUtility.getSetting("UpdateFreqency");
@@ -218,7 +290,17 @@ function loadSettings(){
     if (!value || value == "Unknown" || value === ""){
         //Do Nothing
     }
-    else{
+    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;
     }
 }