/// <reference path="~/scripts/jquery.js" />
/// <reference path="~/scripts/ww.jquery.js" />
$(document).ready(function() {
    __statusbar = new StatusBar({ afterTimeoutText: "Ready" });    
    LoadQuotes();   
});

function GetStockQuote()
{       
    var symbol = $("#txtSymbol").val();            
    if (!symbol)
    {
        showStatus("Please provide a symbol value.",5000);
        return;
    }    
    showStockProgress();
    
    Proxy.callMethod("GetStockQuote",[symbol],
        function (result)
        {             
            if (!result)
            {
                showStatus("Invalid Stock Symbol");
                return;
            }
            showStockProgress(true);
            
            $("#StockName").text( result.company + " (" + result.symbol + ")" ) ;
            $("#LastPrice").text(result.lastprice.formatNumber("n"));
            $("#OpenPrice").text(result.openprice.formatNumber("n"));
            $("#QuoteTime").text(result.lastquotetimestring); 
            $("#NetChange").text(result.netchange.toFixed(2));
            $("#PeRatio").text(result.peratio.toFixed(2));
            $("#DivYield").text(result.dividendyield.toFixed(2));   
            
            // *** if hidden make visible
            var sr = $("#divStockQuoteResult")                           
                           .slideDown("slow", 
                               function(){                               
                                    var singleChart = new FusionCharts("images/FCF_MSLine.swf", "ChartId", "290", "165");
                                    singleChart.setDataURL("StockClient.wcsx?SingleQuoteSymbols=" + symbol);
                                    singleChart.render("divSingleHistoryChart");
                               });
 
        },
        OnPageError,false);  // *** Bare message
}

// Var that tracks Edit State - if non-0 we're editing
var editPk = 0;

// *** Display the Window 
function ShowStockEditWindow(stockItemElement)
{
    // *** Make it visible
    var win = $("#StockEditWindow")
                .shadow()
                .closable()
                .show()
                .draggable({ handle: $("#StockEditWindow .gridheader"), forceAbsolute: true });                

    
    var txtSymbol = $("#txtPortfolioSymbol");
    var txtQty = $("#txtPortfolioQty");

    if(stockItemElement)        
    {            
        // *** Grab the Item Template
        var jItem = $(stockItemElement);

        // *** Grab Pk from Id of the item template
        editPk = parseInt(jItem[0].id.replace("_STOCK",""));

        // *** Pick up values from the selected template item - a little parsing
        var symbol = jItem.find(".itemstockname").text();                    
        symbol = symbol.substr(0,symbol.indexOf("-")-1);
        txtSymbol.val(symbol);            
        txtQty.val( jItem.find("#tdLastQty").text() );                                   

        // *** Adjust the text of the dialog                
        $("#btnAddStock").val( "Update");
        win.find(".gridheader").text("Update Portfolio Item");        
    }            
    else
    {
        editPk = 0;   // No item editing 
                
        // *** Clear out
        txtSymbol.val("");
        txtQty.val("");        
        
        // *** Adjust the text of the dialog                
        $("#btnAddStock").val("Add");
        $(win).find(".gridheader").text("Add new Portfolio Item");        
    }
    txtSymbol[0].focus();
}
function LoadQuotes() {
    
    showProgress();

    Proxy.callMethod("GetPortfolioItems",
         [],
         function(message) {
             showProgress(true);
             $("#lstPortfolioContainer").empty();

             if (!message)
                 return;

             if (message.errormessage)
                 showStatus(message.errormessage, 4000);

             if (message.listresult) {

                 //                 // Parse template with stock rows as array input
                 //                 var html = parseTemplate($("#ItemTemplate").html(), 
                 //                                         { stocks: message.listresult.Rows });
                 //                 $(html).fadeIn("slow")
                 //                        .appendTo("#lstPortfolioContainer");

                 // *** Result is returned from cursor as array of rows
                 $.each(message.listresult.Rows, function(i) {
                     var item = this;   // this is the iterated item!

                     var html = parseTemplate($("#ItemTemplate").html(), { stock: item });

                     var newEl = $(html)
                                      .fadeIn("slow");

                     // *** Append item to the list view container
                     newEl.click(function() { ShowStockEditWindow(newEl); })
                          .appendTo("#lstPortfolioContainer");
                 });
             }

             // *** Update totals    
             $("#spanPortfolioTotal").text(message.totalvalue.formatNumber("c"));
             $("#divPortfolioCount").text(message.totalitems.formatNumber("f0") + " items");
         },
         OnPageError);
}
// *** Add Portfolio Item button click
function UpdatePortfolioQuote()
{    
    var symbol = $("#txtPortfolioSymbol").val();    
    var qty = $("#txtPortfolioQty").val();

    // *** editPk is set when the window is brought up 
    
    if (symbol=="")
    { showStatus("Please enter a symbol.",3000); return; }
    if (qty == "")
    { showStatus("Please enter a quantity.",3000); return; }            
    
    showProgress();
    
    if (editPk == 0)
        Proxy.callMethod("AddPortfolioItem",
                 [symbol,qty * 1],
                 UpdateQuote_Callback,OnPageError);
    else
        Proxy.callMethod("UpdatePortfolioItem",
                 [ editPk, symbol,qty * 1 ],
                 UpdateQuote_Callback,OnPageError);    
}

// *** Callback for add operation adds or redisplays
// *** the item in the list
function UpdateQuote_Callback(portfolioMessage)
{
    showProgress(true);
    
    if (portfolioMessage == null)
    {
        showStatus("Unable to update portfolio item.",5000);
        return;
    }    
            
    // Grab single portfolio item from message
    var item = portfolioMessage.singleitem;  

    // merg template embedded into page with in #ItemTemplate <script> tag
    var html = parseTemplate($("#ItemTemplate").html(), { stock: item } );

    newEl = $(html).attr("id", item.pk + "_STOCK")
                   .addClass("pulse")
                   .effect("bounce", { distance: 15, times: 4 }, 500, 
                           function() { $(this).removeClass("pulse"); })                   
                   .fadeIn("slow");
    
    
    if (!newEl)
    {
       showStatus("Error accessing portfolio item...",5000);
       return;
    }
    
    // *** Update totals    
    $("#spanPortfolioTotal").text( portfolioMessage.totalvalue.formatNumber("c") );
    $("#divPortfolioCount").text( portfolioMessage.totalitems.formatNumber("f0") + " items");
               
    if (editPk == 0)  // Add operation
    {
        newEl.click(function() { ShowStockEditWindow(this) });
        newEl.appendTo("#lstPortfolioContainer");
        $("#lstPortfolioContainer")[0].scrollTop = 999999;
    }
    else
    {        
        var el =  $("#lstPortfolioContainer #" + item.pk + "_STOCK");
        el.replaceWith( newEl);
    }

    $("#StockEditWindow").hide();
    editPk = 0;    
}

function DeleteQuote(item,ev)    
{           
    var Pk = item.id.replace("_STOCK","");                
    
    ev.cancelBubble = true;
    
    Proxy.callMethod("DeletePortfolioItem",
            [Pk * 1],
            function(portfolioMessage) {                                       
                // *** Update totals
               $("#spanPortfolioTotal").text( portfolioMessage.totalvalue.formatNumber("c") );
               $("#divPortfolioCount").text( portfolioMessage.totalitems.formatNumber("f0") + " items");
               $(item).fadeOut(function() { $(this).remove()} );   // jquery remove from dom
            },        
            OnPageError);
}   
function ShowHistoryGraph(event)
{
    event.cancelBubble = true;
 
    var jImg = $("#divHistoryChart");
    
    showProgress();
    
    Proxy.callMethod("GetPortfolioItems",[],
                function(portfolioMessage)
                {                             
                
                    var items = portfolioMessage.listresult.Rows;
                    var stocks = [];
                    for(var x=0; x < items.length; x++)                    
                    {
                        stocks.push(items[x].symbol);
                    }                                        
                    var url = GetStockGraphUrl(stocks);
                    jImg.fadeOut("normal");
                    

                    var histChart = new FusionCharts("images/FCF_MSLine.swf", "ChartId2", "620", "450");
                    histChart.setDataURL(url);
                    histChart.render("divHistoryChart");
                    
                    jImg.fadeIn("slow");
                    showProgress(true);                        
                },
                OnPageError);        
}
function SymbolLookup(symbol,target)
{    
    // create a dedicated instance
    var proxy = Proxy_GetCallback();
    proxy.callMethod("GetStockQuote",[symbol],
        function(result) 
        {                            
            var text = "n/a";
            if (result && result.lastprice != 0.00)
               text = result.company + " (" + result.lastprice.toFixed(2) + ")";
                
            $("#" + target).text(text);
        },
        OnPageError);
}
function GetStockGraphUrl(stocks)
{         
	var stockParm = "";
    for(var x=0; x < stocks.length; x++)
        stockParm +=  stocks[x] + ',';

    stockParm = stockParm.replace(/,$/,""); // trim ,    
            
    var url = String.format("stockclient.wcsx?SingleQuoteSymbols=" +  encodeURIComponent(stockParm) + "&t=1&x=2");                    
    return url;
}
function OnPageError(error) 
{
    showProgress(true);
    showStockProgress(true);

    showStatus(error.message,5000);
}
function showStatus(message,timeout)
{        
    if (!message)
       message="Ready"
                
    var jCtl = jQuery("#divStatusBar").text(message).addClass("statusbarhighlight");
    if (timeout)
       setTimeout(function() { jCtl.removeClass("statusbarhighlight").text("Ready"); },timeout);
}
function showProgress(hide)
{
    if (hide)
        $("#divProgress").hide();
    else
        $("#divProgress").show();        
}
function showStockProgress(hide)
{ 
    if (hide)
        $("#imgStockProgress").hide();
    else
        $("#imgStockProgress").show();        
}

function getText(el)
{
    if (!el) return "";
    if (el.innerText != "undefined") return el.innerText;
    return el.textContent;
}
function setText(el,text)
{        
    if(!el)
        return;
    if (el.innerText != "undefined") el.innerText = text;
    el.textContent = text;        
}

