Harmattan font changes completed
[marketstoday] / src / qml / Library / js / CoreLogic.js
index 3fde6d5..f6dd8e1 100644 (file)
@@ -1,9 +1,49 @@
 /*
-@version: 0.1
+@version: 0.5
 @author: Sudheer K. <scifi1947 at gmail.com>
 @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://download.finance.yahoo.com/d/quotes.csv?s=INDU+^IXIC+^GSPC+CLJ11.NYM+YHOO+AAPL+GOOG+MSFT+ACT&f=snl1c1p2vj1&e=.csv';
+        var queryURL = 'http://download.finance.yahoo.com/d/quotes.csv?s='+query+'&f=snl1c1p2vj1&e=.csv';
+        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.");
+        if (!isDesktopWidget)
+            strErrorMessage = "Tap the title bar to add stock tickers and update settings."
+        else
+            strErrorMessage = "Use the widget settings screen to add stock tickers and update configuration."
+        stockQuoteDataModel.clear();
+        quoteRefreshCompleted(false,strErrorMessage);
+    }
+}
+
 function getQuery(){
     var query;
     var symbolsArray = DBUtility.getAllSymbols();
@@ -13,10 +53,10 @@ function getQuery(){
             logUtility.logMessage("Appending "+symbolsArray[i]+ " to Query");
 
             if (!query){
-                query = '"'+symbolsArray[i]+'"';
+                query = symbolsArray[i];
             }
             else{
-                query = query + ',"' + symbolsArray[i]+'"';
+                query = query + '+' + symbolsArray[i];
             }
         }
     }
@@ -24,101 +64,166 @@ function getQuery(){
     return query;
 }
 
-function refreshDataModel(responseXML){
-    if (!(responseXML && stockQuoteDataModel)) return;
-
-    var xmlDoc = responseXML.documentElement;
-    var results = xmlDoc.firstChild;
+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);
+            }
+        }
 
-    //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
+        response.open("GET", rssURL);
+        response.send();
+    }
+}
 
-    if (results) {
-        var quoteNodes = results.childNodes;
-        if (quoteNodes){
+function refreshDataModel(response){
+    var status = false;   
+    if (!response.responseText) {
+        strErrorMessage = "Error occurred while loading stock quotes."
+        logUtility.logMessage("No responseText for quotes");
+        return status;
+    }
+    else{
+        //snl1c1p2vj1
+        var quoteDetails = CSVUtility.csvToArray(response.responseText.trim());
+        var i = 0;
+        if (quoteDetails && quoteDetails.length > 0){
             logUtility.logMessage("Clearing Data Model");
             stockQuoteDataModel.clear();
 
-            var i = 0;
-            for (i = 0; i < quoteNodes.length; i++) {
-
-                var quoteElements = quoteNodes[i].childNodes;
-                var j = 0;
-                var symbol,stockName,lastTradedPrice,change,changePercentage
-
-                for (j = 0; j < quoteElements.length; j++){
-
-                    switch (quoteElements[j].nodeName){
-                        case 'Symbol':
-                            symbol = quoteElements[j].childNodes[0].nodeValue;
-                            break;
-                        case 'Name':
-                            stockName = quoteElements[j].childNodes[0].nodeValue;
-                            break;
-                        case 'LastTradePriceOnly':
-                            lastTradedPrice = quoteElements[j].childNodes[0].nodeValue;
-                            break;
-                        case 'Change':
-                            change = quoteElements[j].childNodes[0].nodeValue;
-                            break;
-                        case 'ChangeinPercent':
-                            changePercentage = quoteElements[j].childNodes[0].nodeValue;
-                            break;
-                        default:
-                    }
-                }
-                stockQuoteDataModel.append({"symbol":symbol,"stockName":stockName,"lastTradedPrice":lastTradedPrice,"change":change,"changePercentage":changePercentage});
-                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);
+            for (i = 0; i < quoteDetails.length; i++){
+
+                var symbol,stockName,lastTradedPrice,change,changePercentage,volume,marketCap;
+                symbol = quoteDetails[i][0];
+                stockName = quoteDetails[i][1];
+                lastTradedPrice = quoteDetails[i][2];
+                change = (quoteDetails[i][3] !== 'N/A')? quoteDetails[i][3]:'';
+                changePercentage = (quoteDetails[i][4] !== 'N/A')? quoteDetails[i][4]:'';
+                volume = (quoteDetails[i][5] !== 'N/A')? quoteDetails[i][5]:'';
+                marketCap = (quoteDetails[i][6] !== 'N/A')? quoteDetails[i][6]:'';
+
+                stockQuoteDataModel.append({"symbol":symbol,"stockName":stockName,"lastTradedPrice":lastTradedPrice,"change":change,"changePercentage":changePercentage,"volume":volume,"marketCap":marketCap});
+                //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);
             }
-        }
-    }
 
-    var queryNode = xmlDoc;
-    if (queryNode) {
-        var i = 0;
-        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);
-                break;
+            status = true;
+            var timeNow = new Date();
+            try{
+                lastUpdatedTimeStamp = "Updated: "+DateLib.ISODate.format(timeNow);
+                logUtility.logMessage(lastUpdatedTimeStamp);
+            }
+            catch(exception){
+                logUtility.logMessage("Error occured while converting timestamp");
+                logUtility.logMessage(exception);
             }
         }
+        else
+        {
+            strErrorMessage = "Quotes could not be fetched from Yahoo! Finance. Please verify the tickers and try again later."
+            logUtility.logMessage(response.responseText);
+            status = false;
+        }
     }
+
+    return status;
 }
 
+function refreshNewsModel(response){
+    var status = false;
+    if (!response.responseXML) {
+        //This shouldn't happen
+        strErrorMessage = "Error occurred while loading news."
+        if (response.responseText)
+            logUtility.logMessage(response.responseText);
+        else
+            logUtility.logMessage("No responseXML for news");
+        return status;
+    }
 
-function reloadQuotes(){
-    var query = getQuery();
-    if (query){
-        screen.quoteRefreshStarted();
-        logUtility.logMessage("Reloading Data..");
+    //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 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 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();
-            }
+    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;
         }
+    }
 
-        response.open("GET", queryURL);
-        response.send();
+    if (channel) {
+        var itemNodes = channel.childNodes;
+        if (itemNodes){
+
+            logUtility.logMessage("Clearing News Model");
+            newsDataModel.clear();
+            logUtility.logMessage("No. of news stories = "+itemNodes.length);
+
+            for (i = 0; i < itemNodes.length; i++) {
+                if (itemNodes[i].nodeName === 'item'){
+                    var newsElements = itemNodes[i].childNodes;
+                    var j = 0;
+                    var newsTitle,newsLink
+                    for (j = 0; j < newsElements.length; j++){
+
+                        switch (newsElements[j].nodeName){
+                            case 'title':
+                                newsTitle = newsElements[j].childNodes[0].nodeValue;
+                                break;
+                            case 'link':
+                                newsLink = newsElements[j].childNodes[0].nodeValue;
+                                break;
+                            default:
+                        }
+                    }
+                    newsDataModel.append({"title":newsTitle,"link":newsLink});
+                    //logUtility.logMessage("Title: "+newsDataModel.get(i).title+", Link: "+ newsDataModel.get(i).link);
+                    //logUtility.logMessage("Title: "+newsTitle+", Link: "+ newsLink);
+                }
+            }
+            status = true;
+        }
+        else{
+            strErrorMessage = "The RSS feed did not contain any news stories. Please try again later."
+            logUtility.logMessage(response.responseText);
+            status = false;
+        }
     }
     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;
     }
+
+    return status;
 }
 
 function loadSettings(){
     var value;
     value  = DBUtility.getSetting("UpdateFreqency");
-    if (!value || value == "0.0" || value === ""){
+    if (!value || value == "0.0" || value === "" || isNaN(value)){
         autoUpdateInterval = 0;
     }
     else{
@@ -132,6 +237,7 @@ function loadSettings(){
         updateWeekDaysOnly = true;
     }
 
+/*
     value  = DBUtility.getSetting("UpdateOnSavedNetworksOnly");
     if (!value || value == "0.0" || value === ""){
         updateOnSavedNetworksOnly = false;
@@ -139,13 +245,32 @@ function loadSettings(){
     else{
         updateOnSavedNetworksOnly = true;
     }
+*/
+
+    value  = DBUtility.getSetting("RSSURL");
+    if (!value || value == "Unknown" || value === ""){
+        //Do Nothing
+    }
+    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;
+    }
 }
 
 function initialize(){
     if (autoUpdateTimer.running) autoUpdateTimer.stop();
     loadSettings();
     reloadQuotes();
+    reloadNews();
 
     if (autoUpdateInterval !== 0) {
         logUtility.logMessage("Starting Timer..");