home *** CD-ROM | disk | FTP | other *** search
/ Freelog 117 / FreelogNo117-OctobreNovembre2013.iso / Theme / 8GadgetPack / 8GadgetPackSetup.msi / currency.js_5 < prev    next >
Text (UTF-16)  |  2012-05-19  |  67KB  |  1,096 lines

  1. ////////////////////////////////////////////////////////////////////////////////
  2. //
  3. // THIS CODE IS NOT APPROVED FOR USE IN/ON ANY OTHER UI ELEMENT OR PRODUCT COMPONENT.
  4. // Copyright (c) 2009 Microsoft Corporation. All rights reserved.
  5. //
  6. ////////////////////////////////////////////////////////////////////////////////
  7. var g_oService;
  8. var g_oCurr = new Array(4);
  9. var g_oTimer = null;
  10. var g_StartValue = 1;
  11. var g_sRowCount = 1;
  12. var g_sRowHeight = 54;
  13. var g_sBodyHeight;
  14. var g_sMenuHeight;
  15. var g_sFullName = true;
  16. var g_dataFromService;
  17. var g_isStaleData = false;
  18. var g_ageStampText = "";
  19. var spinner;
  20.     
  21. ////////////////////////////////////////////////////////////////////////////////
  22. //
  23. // Load gadget's main function
  24. //
  25. ////////////////////////////////////////////////////////////////////////////////
  26. function loadMain()
  27. {
  28.     // Set initial values needed for dynamic re-sizing of menu and rows
  29.     g_sBodyHeight = parseInt(document.body.currentStyle.height);
  30.     
  31.  
  32.     // Check if gadget is new or reloaded with sidebar
  33.     if (readSetting('rowCount'))
  34.     {
  35.         g_sRowCount = readSetting('rowCount');
  36.     }
  37.     else
  38.     {
  39.         saveSetting('rowCount', g_sRowCount);
  40.     }
  41.     spinner = new getSpinner('messageSpinner');
  42.     localizeUI();
  43.  
  44.     SetUIState('loading');
  45.     
  46.     g_oService = new CurrencyService()
  47.     g_oService.OnDataReady = DataReady;
  48.     
  49.     // If we are actually running in the gadget platform
  50.     // wire up all the events.
  51.     if (gGadgetMode)
  52.     {        
  53.         System.Gadget.onDock = DockGadget;
  54.         System.Gadget.onUndock = UndockGadget;
  55.         
  56.         if (System.Gadget.docked)
  57.         {
  58.             DockGadget();
  59.         }
  60.         else
  61.         {
  62.             UndockGadget();
  63.         }
  64.     }
  65.     else
  66.     {
  67.         UndockGadget();
  68.     }
  69.     
  70.     // Attaching events to the toolbar buttons
  71.     addButton.attachEvent("onmouseover", function(){addButton.style.backgroundImage = 'url(../images/add_over.png)';});
  72.     addButton.attachEvent("onclick", function(){addButton.style.backgroundImage = 'url(../images/add_down.png)'; addRow();});
  73.     addButton.attachEvent("onmouseout", function(){addButton.style.backgroundImage = 'url(../images/add_up.png)';});
  74.     addButton.attachEvent("onfocus", function(){addButton.style.backgroundImage = 'url(../images/add_down.png)';});
  75.     addButton.attachEvent("onblur", function(){addButton.style.backgroundImage = 'url(../images/add_up.png)';});
  76.     addButton.title = L_localizedStrings_Text['Add']
  77.     
  78.     g_StartValue = g_StartValue.toLocaleString();    
  79.     g_oCurr[0].oTextBox.value = g_StartValue; 
  80.     g_oService.GetCurrencies(); 
  81.     
  82.     if (System.Gadget.docked)
  83.     {
  84.         document.getElementById('curr0input').style.display = 'block';
  85.         document.getElementById('curr1input').style.display = 'block';
  86.     }
  87.     
  88.     
  89. }
  90. ////////////////////////////////////////////////////////////////////////////////
  91. //
  92. // Localize all data
  93. //
  94. ////////////////////////////////////////////////////////////////////////////////
  95. function localizeUI()
  96. {
  97.     for (var i = 0; i < g_oCurr.length; i++)
  98.     {
  99.         g_oCurr[i] = new CurrencyBox('curr' + i, getLocalizedString('GettingExchangeRate'), '0');
  100.         // reverse reference in array
  101.         g_oCurr[i].oTextBox.setAttribute('arrayIdx', i);
  102.         g_oCurr[i].oTextBox.onkeyup = OnAmountChange;
  103.     }
  104.     
  105.     var oDataLink = document.getElementById('dataLink');
  106.     oDataLink.innerHTML = getLocalizedString('DataProviders');
  107.     oDataLink.href = getLocalizedString('MSNMoneyURL');
  108. }
  109. ////////////////////////////////////////////////////////////////////////////////
  110. //
  111. // Creates a currency row for each id in g_oCurr array
  112. //
  113. ////////////////////////////////////////////////////////////////////////////////
  114. function CurrencyBox(oControl, sCaption, sValue)
  115. {
  116.     // Self reference
  117.     var me = this;
  118.     
  119.     // Private data members
  120.     var m_oCaption = '';
  121.     var m_sCaption = sCaption;
  122.     var m_oControl = oControl;
  123.     var oDeleteButton;
  124.     var oCurrOnline;
  125.     var oValueDiv;
  126.     var oTextBoxBack;
  127.     var sCurrCount = oControl.replace('curr', '');
  128.     var tableCurr;
  129.     var oTableCaption;
  130.     var oTD = new Array();
  131.     var oTDCaption = new Array();
  132.     var oCaptionA;
  133.     var oCurrencyImage;
  134.     
  135.     // Public Properties
  136.     this.oTextBox = null;
  137.     this.oTag = null;
  138.     
  139.     // Get currency div
  140.     m_oControl = document.getElementById(oControl);
  141.     
  142.     // Private methods
  143.     function Initialize()
  144.     {
  145.         // Create table        
  146.         tableCurr = document.createElement('<table cellpadding="0" cellspacing="0" border="0"></table>');
  147.         var tbCurr = document.createElement('tbody');
  148.         var trCurr = document.createElement('tr');
  149.         tableCurr.appendChild(tbCurr);
  150.         tbCurr.appendChild(trCurr);
  151.         for (j=0;j<3;j++)
  152.         {
  153.             oTD[j] = document.createElement('td'); 
  154.             oTD[j].setAttribute("id", m_oControl.id + "TD" + j);
  155.             trCurr.appendChild(oTD[j]);            
  156.         } 
  157.         
  158.         // Create table for Caption and left-right borders    
  159.         oTableCaption = document.createElement('<table cellpadding="0" cellspacing="0" border="0"></table>');
  160.         var oTBCaption = document.createElement('tbody');
  161.         var oTRCaption = document.createElement('tr');
  162.         oTableCaption.appendChild(oTBCaption);
  163.         oTBCaption.appendChild(oTRCaption);
  164.         for (j=0;j<3;j++)
  165.         {
  166.             oTDCaption[j] = document.createElement('td'); 
  167.             oTDCaption[j].setAttribute("id", m_oControl.id + "TDCaption" + j);
  168.             oTRCaption.appendChild(oTDCaption[j]);            
  169.         }            
  170.         
  171.         // Create container for text/textbox
  172.         oValueDiv = document.createElement('div');
  173.         oValueDiv.id = m_oControl.id + 'value';
  174.         
  175.         // Create currency text
  176.         var oLabel = document.createElement('label');
  177.         oLabel.id = m_oControl.id + 'label';
  178.         m_oCaption = document.createElement('div');
  179.         m_oCaption.id = m_oControl.id + 'caption';
  180.         
  181.         if(document.dir == 'rtl')
  182.         {
  183.             m_oCaption.onmouseover = function() {oTDCaption[0].style.backgroundImage = 'url(../images/combo-hover-right.png)';
  184.             oTDCaption[1].style.backgroundImage = 'url(../images/combo-hover-middle.png)';
  185.             oTDCaption[2].style.backgroundImage = 'url(../images/combo-hover-left.png)';};
  186.         }
  187.         else
  188.         {
  189.             m_oCaption.onmouseover = function() {oTDCaption[0].style.backgroundImage = 'url(../images/combo-hover-left.png)';
  190.             oTDCaption[1].style.backgroundImage = 'url(../images/combo-hover-middle.png)';
  191.             oTDCaption[2].style.backgroundImage = 'url(../images/combo-hover-right.png)';};
  192.         }
  193.             
  194.         m_oCaption.onmouseout = function() {oTDCaption[0].style.backgroundImage = '';
  195.                                             oTDCaption[1].style.backgroundImage = '';
  196.                                             oTDCaption[2].style.backgroundImage = '';};
  197.         
  198.         oLabel.appendChild(m_oCaption);
  199.         
  200.         //Create Caption A HREF and triangle image
  201.         oCaptionA = document.createElement('a');
  202.         oCaptionA.id = 'captionA';
  203.         oCaptionA.href = "javascript:void;";
  204.         if ( g_isStaleData )
  205.         {
  206.             oCaptionA.title = getLocalizedString('ServiceNotAvailable');
  207.         }
  208.         else
  209.         {
  210.             oCaptionA.title = m_sCaption;
  211.         }
  212.         oCaptionA.innerHTML = m_sCaption;        
  213.         oCurrencyImage = document.createElement('img');
  214.         oCurrencyImage.id = "currencyImage";
  215.                 oCurrencyImage.src = 'images/triangle.png';
  216.         oCurrencyImage.border = '0';
  217.         
  218.         oCaptionA.onclick = function() {showCurrencyList(oControl);};
  219.         oCaptionA.appendChild(oCurrencyImage);
  220.         m_oCaption.appendChild(oCaptionA);
  221.         
  222.         
  223.         
  224.         
  225.         
  226.         
  227.         
  228.         
  229.         // Create button for online currency
  230.         oCurrOnline = document.createElement('div');
  231.         oCurrOnline.id = m_oControl.id + 'OnlineButton';
  232.         oCurrOnlineA = document.createElement('a');
  233.         oCurrOnlineA.id = m_oControl.id + 'OnlineButtonA';
  234.         oCurrOnlineA.target = '_blank';
  235.  
  236.         if ( g_isStaleData )
  237.         {
  238.             oCurrOnlineA.title = getLocalizedString('ServiceNotAvailable');
  239.         }
  240.         else
  241.         {
  242.             oCurrOnlineA.title = L_localizedStrings_Text['Graph'];
  243.         }
  244.  
  245.         oCurrOnlineAImg = document.createElement('img');
  246.         oCurrOnlineAImg.border = '0';
  247.         oCurrOnlineAImg.src = '../images/graph_up.png';
  248.         oCurrOnlineAImg.onmousedown = function() {this.src = '../images/graph_down.png';};
  249.         oCurrOnlineAImg.onmouseover = function() {this.src = '../images/graph_over.png';};
  250.         oCurrOnlineAImg.onmouseout = function() {this.src = '../images/graph_up.png';}; 
  251.         
  252.         oCurrOnlineA.appendChild(oCurrOnlineAImg);
  253.         oCurrOnline.appendChild(oCurrOnlineA);
  254.         
  255.         // Create delete button
  256.         oDeleteButtonA = document.createElement('a');
  257.         oDeleteButtonA.setAttribute("href","javascript:void;");
  258.         oDeleteButtonA.setAttribute("title",L_localizedStrings_Text['Remove']);
  259.         oDeleteButtonA.style.backgroundImage = 'url(../images/delete_up.png)';
  260.         oDeleteButton = document.createElement('div');
  261.         oDeleteButton.id = m_oControl.id + 'DeleteButton';            
  262.         oDeleteButton.style.backgroundImage = 'url(../images/delete_up.png)';
  263.         oDeleteButtonA.onclick = function() {oDeleteButton.style.backgroundImage = 'url(../images/delete_down.png)'; deleteRow(oControl);};
  264.         oDeleteButton.onmouseover = function() {this.style.backgroundImage = 'url(../images/delete_over.png)';};
  265.         oDeleteButton.onmouseout = function() {this.style.backgroundImage = 'url(../images/delete_up.png)';}; 
  266.         oDeleteButtonA.onfocus = function() {if(m_oControl.id.replace('curr', '') !='0' && g_sRowCount > 1){oDeleteButton.style.backgroundImage = 'url(../images/delete_over.png)';oDeleteButton.style.display = 'block';} };
  267.         oDeleteButtonA.onblur = function() {oDeleteButton.style.backgroundImage = 'url(../images/delete_up.png)'; oDeleteButton.style.display = 'none'; };
  268.         oDeleteButtonA.appendChild(oDeleteButton);
  269.         
  270.         // Create the textbox
  271.         me.oTextBox = document.createElement('input');
  272.         me.oTextBox.id = oLabel.htmlFor = m_oControl.id + 'input';
  273.         me.oTextBox.type = 'text';
  274.         me.oTextBox.maxLength = 20;
  275.         me.oTextBox.value = sValue;
  276.             
  277.         // Create the textbox background
  278.         oTextBoxBack = document.createElement('div');
  279.         oTextBoxBack.id = m_oControl.id + 'InputBack';        
  280.         
  281.         oValueDiv.appendChild(tableCurr);
  282.         oValueDiv.appendChild(me.oTextBox);
  283.         oValueDiv.appendChild(oTextBoxBack);
  284.         
  285.         // Add everything in and make it accessible
  286.         m_oControl.appendChild(oValueDiv);
  287.         
  288.         tableCurr.style.height = '21px';
  289.         oTableCaption.style.height = '21px';
  290.         tableCurr.style.position = 'absolute';
  291.         
  292.         oTD[0].style.width = '16px';
  293.         oTDCaption[0].style.width = '3px';
  294.         oTDCaption[2].style.width = '3px';
  295.         oTD[2].style.width = '16px';        
  296.         oTD[0].appendChild(oCurrOnline);
  297.         oTD[1].appendChild(oTableCaption);
  298.         oTDCaption[1].appendChild(oLabel);
  299.         oTD[2].appendChild(oDeleteButtonA);        
  300.         
  301.         me.setCaption(m_sCaption);
  302.     }
  303.     
  304.     this.setCaption = function(sCaption)
  305.     {
  306.         if ( g_isStaleData )
  307.         {
  308.             oCaptionA.title = getLocalizedString('ServiceNotAvailable');
  309.         }
  310.         else
  311.         {
  312.             oCaptionA.title = sCaption;
  313.         }
  314.  
  315.         oCaptionA.innerHTML = sCaption + oCurrencyImage.outerHTML;
  316.         
  317.         
  318.     }
  319.  
  320.     // Set styles depending on docked or undocked
  321.     this.changeMode = function(sMode)
  322.     {
  323.         if (sMode == 'docked')
  324.         {
  325.             oTD[0].style.display = 'none';
  326.             oTD[2].style.display = 'none';
  327.             tableCurr.style.width = '43px';            
  328.             tableCurr.style.left = '9px';
  329.             tableCurr.style.right = '9px';
  330.             tableCurr.style.top = '9px';    
  331.             
  332.             var sCurr = readSetting(oControl) || L_localizedStrings_Text['default'+sCurrCount];
  333.             this.setCaption(sCurr);
  334.             curr1.style.top = '27px';
  335.             tableCurr.className = 'tableFont';
  336.             oTableCaption.className = 'tableCaption';
  337.             m_oControl.className = 'dockedCurrencyContainer';
  338.             m_oCaption.className = 'dockedCurrencyTitle';
  339.             if(document.dir == 'rtl')
  340.             {
  341.                 me.oTextBox.className = 'dockedCurrencyValueRtl';
  342.                 oTextBoxBack.className = 'dockedCurrencyValueBackRtl';
  343.             }
  344.             else
  345.             {
  346.                 me.oTextBox.className = 'dockedCurrencyValue';
  347.                 oTextBoxBack.className = 'dockedCurrencyValueBack';
  348.             }
  349.             oValueDiv.className = 'dockedCurrencyDiv';
  350.             oCurrOnline.className = 'dockedCurrencyOnlineButton';
  351.             oDeleteButton.className = 'dockedCurrencyDeleteButton';
  352.             currencyList.className = 'dockedCurrencyList';
  353.             document.getElementById('currencySelect').className = 'dockedCurrencySelect';
  354.             document.getElementById('currencySelect').size = 4;
  355.             document.getElementById('bottomTable').style.display = 'none';
  356.             m_oControl.onmouseover = '';
  357.             m_oControl.onmouseout = '';
  358.             oValueDiv.onmouseover = '';
  359.             oValueDiv.onmouseout = '';
  360.             g_sFullName = false;
  361.         }
  362.         // undocked
  363.         else
  364.         {
  365.             oTD[0].style.display = 'block';
  366.             oTD[2].style.display = 'block';
  367.             tableCurr.style.width = '212px';
  368.             tableCurr.style.left = '3px';
  369.             tableCurr.style.right = '3px';
  370.             tableCurr.style.top = '';
  371.             
  372.             var sCurr = readSetting(oControl) || L_localizedStrings_Text['default'+sCurrCount];
  373.             this.setCaption(getLocalizedString(sCurr));
  374.             curr1.style.top = g_sRowHeight;
  375.             oDeleteButton.style.display = 'none';
  376.             tableCurr.className = 'tableFont';
  377.             oTableCaption.className = 'tableCaption';
  378.             m_oControl.className = 'currencyContainer';
  379.             m_oCaption.className = 'currencyTitle';
  380.             me.oTextBox.className = 'currencyValue';
  381.             me.oTextBox.style.display = '';
  382.             oTextBoxBack.className = 'currencyValueBack';
  383.             oValueDiv.className = 'currencyDiv';
  384.             oCurrOnline.className = 'currencyOnlineButton';
  385.             oDeleteButton.className = 'currencyDeleteButton';
  386.             currencyList.className = 'undockedCurrencyList';
  387.             document.getElementById('currencySelect').className = 'undockedCurrencySelect';
  388.             document.getElementById('currencySelect').size = 4 + (g_sRowCount * 4);
  389.             m_oControl.onmouseover = function() {showDelete(oControl)};
  390.             m_oControl.onmouseout = function() {hideDelete(oControl)};
  391.             oValueDiv.onmouseover = function() {this.style.background = 'url(../images/row_over.png) no-repeat';};
  392.             oValueDiv.onmouseout = function() {this.style.background = '';};
  393.             g_sFullName = true; 
  394.         }
  395.     }    
  396.  
  397.     // Constructor
  398.     Initialize();
  399. }
  400.  
  401. function setBackground(path)
  402. {
  403.     // if you switch backgrounds on the fly, you must set the style size to zero
  404.     // so it dynamically refreshes
  405.     currencybackground.style.width = 0;
  406.     currencybackground.style.height = 0;
  407.     currencybackground.src = path;
  408. }
  409.  
  410. ////////////////////////////////////////////////////////////////////////////////
  411. //
  412. // Add currency row
  413. //
  414. ////////////////////////////////////////////////////////////////////////////////
  415. function addRow()
  416. {
  417.     if (g_sRowCount < 3)
  418.     {
  419.         g_sRowCount++;
  420.         document.getElementById('curr'+g_sRowCount).style.display = 'block';
  421.         document.body.style.height = parseInt(document.body.style.height) + g_sRowHeight; 
  422.         setBackground("url(images/base-undocked-"+(g_sRowCount+1)+".png)");
  423.         saveSetting('rowCount', g_sRowCount);
  424.         document.getElementById('currencySelect').size += 4;
  425.         if ( g_oService.IsAvailable )
  426.         {
  427.             loadSettings();
  428.         }
  429.     }    
  430.     
  431.     // "Deactivate" add link if max rows reached
  432.     if (g_sRowCount >= (g_oCurr.length - 1))
  433.     {
  434.         addButton.style.display = 'none';
  435.     }
  436. }
  437. ////////////////////////////////////////////////////////////////////////////////
  438. //
  439. // Remove currency row
  440. //
  441. ////////////////////////////////////////////////////////////////////////////////
  442. function deleteRow(sControlId)
  443. {
  444.     var sOptionCount = sControlId.replace('curr', '');
  445.     // Must not delete if only 2 rows
  446.     if(sOptionCount ==0 || g_sRowCount < 2)
  447.     {
  448.         return false;
  449.     }
  450.     
  451.     sOptionCount *= 1;
  452.  
  453.     document.getElementById('curr'+g_sRowCount).style.display = 'none';
  454.     document.getElementById(sControlId+'DeleteButton').style.display = 'none';
  455.     document.body.style.height = parseInt(document.body.style.height) - g_sRowHeight;
  456.     
  457.     currencybackground.style.width = 0;
  458.     currencybackground.style.height = 0;
  459.     currencybackground.src = "url(images/base-undocked-"+(g_sRowCount)+".png)";
  460.         
  461.     for (i = sOptionCount; i < g_sRowCount; i++)
  462.     {
  463.         saveSetting('curr'+i, readSetting('curr'+(i+1)));
  464.         saveSetting('curr'+(i+1), L_localizedStrings_Text['default'+(i+1)]);
  465.     }
  466.         
  467.     g_sRowCount--;
  468.     
  469.     // "Activate" add link if it was greyed out
  470.     if (g_sRowCount <= (g_oCurr.length - 2))
  471.     {
  472.         addButton.style.display = 'block';
  473.     }
  474.     saveSetting('rowCount', g_sRowCount);
  475.     document.getElementById('currencySelect').size -= 4;
  476.     if ( g_oService.IsAvailable )
  477.     {
  478.         loadSettings();
  479.     }
  480. }
  481. ////////////////////////////////////////////////////////////////////////////////
  482. //
  483. // Show row deletion button
  484. //
  485. ////////////////////////////////////////////////////////////////////////////////
  486. function showDelete(sControlId)
  487. {
  488.     if (sControlId != 'curr0' && g_sRowCount > 1)
  489.     {
  490.         document.getElementById(sControlId + 'DeleteButton').style.display = 'block';
  491.     }
  492. }
  493. ////////////////////////////////////////////////////////////////////////////////
  494. //
  495. // Hide row deletion button
  496. //
  497. ////////////////////////////////////////////////////////////////////////////////
  498. function hideDelete(sControlId)
  499. {
  500.     document.getElementById(sControlId + 'DeleteButton').style.display = 'none';
  501. }
  502.  
  503. ////////////////////////////////////////////////////////////////////////////////
  504. //
  505. // Show Currency List
  506. //
  507. ////////////////////////////////////////////////////////////////////////////////
  508. function showCurrencyList(sControlId)
  509. {
  510.  
  511.     var currencyList = new Array();
  512.     var oSelect = document.getElementById('CurrencySelect');
  513.     
  514.     // Clear list
  515.     oSelect.innerHTML = "";
  516.     
  517.     oSelect.onkeypress = function() {if(event.keyCode == 13){optionsDown(CurrencySelect.options[CurrencySelect.selectedIndex].id);}};
  518.     
  519.     // Set up function for creating currencyList object
  520.     function createCurrency(currSymbol, currText, currTextForSorting)
  521.     {
  522.         this.currSymbol = currSymbol;
  523.         this.currText = currText;
  524.         this.currTextForSorting = currTextForSorting;
  525.     }
  526.     
  527.     // Set up sort function
  528.     function currencySort(x, y)
  529.     {
  530.         var xTemp = x.currText;
  531.         var yTemp = y.currText;
  532.             
  533.         if (xTemp > yTemp)
  534.         {
  535.             return 1;
  536.         }
  537.         else if (xTemp < yTemp)
  538.         {
  539.             return -1;
  540.         }
  541.         else
  542.         {
  543.             return 0;
  544.         }
  545.     }
  546.     
  547.     // Iterate through symbol list returned from currency service and create currencyList
  548.     for (x in g_oService.hsCurrencies)
  549.     {
  550.         var currency = g_oService.hsCurrencies[x];
  551.         currencyList.push(new createCurrency(currency.Symbol, getLocalizedString(currency.Symbol), currency.NameForSorting));
  552.     }
  553.     
  554.     // Sort currency list
  555.     currencyList.sort(currencySort);
  556.     
  557.     // Iterate through sorted list and create options
  558.     for (var i = 0; i < currencyList.length; i++)
  559.     {
  560.         var oEachOption = document.createElement('option');
  561.         oEachOption.id = sControlId + "-" + currencyList[i].currSymbol;
  562.         oEachOption.innerText = currencyList[i].currText;
  563.         oSelect.appendChild(oEachOption);        
  564.     }
  565.     
  566.     //Selecting the current currency
  567.     document.getElementById(sControlId + '-' + g_oCurr[sControlId.replace('curr', '')].oTag.Symbol).selected = true;
  568.     
  569.     // Display the Currency List
  570.     var d = document.getElementById('currencyList');
  571.     d.style.display = 'block';
  572.     CurrencySelect.focus();
  573. }
  574. ////////////////////////////////////////////////////////////////////////////////
  575. //
  576. // Close menu when option is selected
  577. //
  578. ////////////////////////////////////////////////////////////////////////////////
  579. function optionsDown(sOptionID)
  580. {
  581.     saveOptions(sOptionID);
  582.     if ( g_oService.IsAvailable )
  583.     {
  584.         loadSettings();
  585.     }
  586.     currencyList.style.display = 'none';
  587. }
  588. ////////////////////////////////////////////////////////////////////////////////
  589. //
  590. // Save newly selected option
  591. //
  592. ////////////////////////////////////////////////////////////////////////////////
  593. function saveOptions(sOptionID)
  594. {
  595.     var oOptionID = sOptionID.split('-');
  596.     saveSetting(oOptionID[0], oOptionID[1]);    
  597.     g_oCurr[oOptionID[0].replace('curr', '')].oTextBox.focus();
  598. }
  599. ////////////////////////////////////////////////////////////////////////////////
  600. //
  601. // Data for gadget in docked state
  602. //
  603. ////////////////////////////////////////////////////////////////////////////////
  604. function DockGadget()
  605. {
  606.     var oBody = document.body.style;
  607.     oBody.width = '130px';
  608.     oBody.height = '83px';
  609.     
  610.     currencybackground.style.width = 0;
  611.     currencybackground.style.height = 0;
  612.     currencybackground.src = "url(images/base-docked.png)";
  613.         
  614.     for (var i = g_sRowCount; i > 1; i--)
  615.     {
  616.         document.getElementById('curr'+i).style.display = 'none';
  617.     }
  618.     
  619.     for (var i=0; i < g_oCurr.length; i++)
  620.     {
  621.         g_oCurr[i].changeMode('docked');
  622.     }
  623.     
  624.     container.className = 'dockedUIBoundary';
  625.     message.className = 'dockedMessage';
  626.     
  627.     if(document.dir == 'rtl')
  628.     {
  629.         ageStampText.className = 'ageStampTextDockedModeRtl';
  630.         ageStampTextTd.className = 'ageStampTextUndockedModeRtl'
  631.     }
  632.     else
  633.     {
  634.         ageStampText.className = 'ageStampTextDockedMode';
  635.         ageStampTextTd.className = 'ageStampTextUndockedMode'
  636.     }
  637.     document.getElementById('ageStampText').innerText = g_ageStampText;
  638.     document.getElementById('ageStampText').style.visibility = "hidden";
  639.     document.getElementById('ageStampTextTd').innerText = g_ageStampText;
  640.     document.getElementById('ageStampTextTd').style.visibility = "hidden";
  641.     
  642.     if (g_oService.IsAvailable)
  643.     {
  644.         if(g_isStaleData)
  645.         {
  646.             document.getElementById('ageStampText').style.visibility = "visible";
  647.         }
  648.         updateValues(g_oCurr[0].oTextBox, false);
  649.     }
  650.     bottomTable.style.display = 'none';
  651.     addButton.style.display = 'none';
  652. }
  653. ////////////////////////////////////////////////////////////////////////////////
  654. //
  655. // Data for gadget in undocked state
  656. //
  657. ////////////////////////////////////////////////////////////////////////////////
  658. function UndockGadget()
  659. {
  660.     var oBody = document.body.style;
  661.     oBody.width = '254px';
  662.     oBody.height = (g_sBodyHeight - g_sRowHeight) + (g_sRowCount * g_sRowHeight);
  663.     
  664.     currencybackground.style.width = 0;
  665.     currencybackground.style.height = 0;
  666.     currencybackground.src = "url(images/base-undocked-"+(g_sRowCount+1)+".png)";
  667.     
  668.     for (var i = g_sRowCount; i > 1; i--)
  669.     {
  670.         document.getElementById('curr'+i).style.display = 'block';
  671.     }
  672.     
  673.     for (var i=0; i < g_oCurr.length; i++)
  674.     {
  675.         g_oCurr[i].changeMode('undocked');
  676.     }
  677.     
  678.     container.className = 'UIBoundary';
  679.     dataLink.className = 'dataProviderLink';
  680.     message.className = 'message';
  681.     
  682.     if(document.dir == 'rtl')
  683.     {
  684.         ageStampText.className = 'ageStampTextDockedModeRtl';
  685.         ageStampTextTd.className = 'ageStampTextUndockedModeRtl'
  686.     }
  687.     else
  688.     {
  689.         ageStampText.className = 'ageStampTextDockedMode';
  690.         ageStampTextTd.className = 'ageStampTextUndockedMode'
  691.     }
  692.     document.getElementById('ageStampText').innerText = g_ageStampText;
  693.     document.getElementById('ageStampText').style.visibility = "hidden";
  694.     document.getElementById('ageStampTextTd').innerText = g_ageStampText;
  695.     document.getElementById('ageStampTextTd').style.visibility = "hidden";
  696.     
  697.     if (g_oService.IsAvailable)
  698.     {
  699.         if(g_isStaleData)
  700.         {
  701.             document.getElementById('ageStampTextTd').style.visibility = "visible";
  702.         }
  703.         updateValues(g_oCurr[0].oTextBox, false);
  704.         bottomTable.style.display = 'block';
  705.         if(g_sRowCount<3)
  706.         {
  707.             addButton.style.display = 'block';
  708.         }
  709.         
  710.     }
  711.     
  712.     
  713. }
  714.  
  715. ////////////////////////////////////////////////////////////////////////////////
  716. //
  717. // Fire update function on keyup
  718. //
  719. ////////////////////////////////////////////////////////////////////////////////
  720. function OnAmountChange()
  721. {
  722.     var sourceTextBox = event.srcElement;
  723.  
  724.     updateValues(sourceTextBox, true);
  725. }
  726. ////////////////////////////////////////////////////////////////////////////////
  727. //
  728. // Update currency field values
  729. //
  730. ////////////////////////////////////////////////////////////////////////////////
  731. function updateValues(sourceTextBox,bSkipCurrent)
  732. {    
  733.     if (g_oService.IsAvailable)
  734.     {
  735.         // Get the currency object that goes with this text box
  736.         var sourceCurrency = g_oCurr[sourceTextBox.getAttribute('arrayIdx')];
  737.         
  738.         var oCurrency;
  739.         
  740.         for (var i=0; i < g_oCurr.length; i++)
  741.         {
  742.             oCurrency = g_oCurr[i];
  743.             
  744.             // skip the box where the text changed.
  745.             if(bSkipCurrent)
  746.             {
  747.                 if (sourceTextBox != oCurrency.oTextBox)
  748.                 {
  749.                     try
  750.                     {
  751.                         oCurrency.oTextBox.value = g_oService.Convert(sourceTextBox.value, sourceCurrency.oTag.Symbol, oCurrency.oTag.Symbol);
  752.                     }
  753.                     catch(objError)
  754.                     {
  755.                         oCurrency.oTextBox.value = getLocalizedString('Error');
  756.                     }
  757.                 }
  758.             }
  759.             else
  760.             {
  761.                 try
  762.                 {
  763.                     oCurrency.oTextBox.value = g_oService.Convert(sourceTextBox.value, sourceCurrency.oTag.Symbol, oCurrency.oTag.Symbol);
  764.                 }
  765.                 catch(objError)
  766.                 {
  767.                     oCurrency.oTextBox.value = getLocalizedString('Error');
  768.                 }
  769.             }
  770.             
  771.         }
  772.     }
  773. }
  774. ////////////////////////////////////////////////////////////////////////////////
  775. //
  776. // Set UI state
  777. //
  778. ////////////////////////////////////////////////////////////////////////////////
  779. function SetUIState(sState)
  780. {
  781.     function ShowMessage(sMessage)
  782.     {
  783.         showOrHide('container', false);
  784.         showOrHide('message', true);        
  785.         
  786.     }
  787.     document.getElementById('bottomTable').style.display = 'none';
  788.     
  789.     document.getElementById('ageStampText').innerText = g_ageStampText;
  790.     document.getElementById('ageStampText').style.visibility = "hidden";
  791.     document.getElementById('ageStampTextTd').innerText = g_ageStampText;
  792.     document.getElementById('ageStampTextTd').style.visibility = "hidden";
  793.     
  794.     spinner.stop();
  795.     switch(sState)
  796.     {
  797.         
  798.         case 'loading':
  799.             
  800.             spinner.show();
  801.             spinner.start();
  802.             document.getElementById('messageSpinner').style.display = 'inline';
  803.             document.getElementById('messageIcon').style.display = 'none';
  804.             ShowMessage(getLocalizedString('WaitText'));
  805.             document.getElementById('messageText').innerHTML = getLocalizedString('WaitText');
  806.             break;
  807.             
  808.         case 'error':
  809.             
  810.             document.getElementById('messageIcon').style.display = 'inline';
  811.             document.getElementById('messageSpinner').style.display = 'none';
  812.             ShowMessage(getLocalizedString('ServiceNotAvailable'));
  813.             if(document.dir == 'rtl')
  814.             {
  815.                 document.getElementById('messageText').innerHTML = getLocalizedString('ServiceNotAvailable');
  816.                 document.getElementById('messageText').style.textAlign = 'right';
  817.             }
  818.             else
  819.             {
  820.                 document.getElementById('messageText').innerHTML = getLocalizedString('ServiceNotAvailable');
  821.                 document.getElementById('messageText').style.textAlign = 'left';
  822.             }
  823.             break;
  824.             
  825.         case 'ready':
  826.             showOrHide('container', true);
  827.             showOrHide('message', false);
  828.             if (!System.Gadget.docked)
  829.             {
  830.                 document.getElementById('bottomTable').style.display = 'block';
  831.             }            
  832.             break;
  833.             
  834.         case 'cached':
  835.             showOrHide('container', true);
  836.             showOrHide('message', false);
  837.             if (!System.Gadget.docked)
  838.             {
  839.                 document.getElementById('bottomTable').style.display = 'block';
  840.                 document.getElementById('ageStampTextTd').style.visibility = "visible";
  841.             }            
  842.             else
  843.             {
  844.                 document.getElementById('ageStampText').style.visibility = "visible";
  845.             }
  846.             break;
  847.     }
  848. }
  849. ////////////////////////////////////////////////////////////////////////////////
  850. //
  851. // Check for availability of data
  852. //
  853. ////////////////////////////////////////////////////////////////////////////////
  854. function DataReady(data)
  855. {
  856.     var milliSecondsToNextQuery;
  857.     
  858.     g_dataFromService = data;
  859.     g_isStaleData = false;
  860.     g_ageStampText = "";
  861.     
  862.     if (g_oTimer != null)
  863.         clearTimeout(g_oTimer);
  864.  
  865.     if ((data != null) && g_oService.IsAvailable && (data.Count > 0) && ((data.RetCode == 200) || (data.RetCode == 1507)))
  866.     {
  867.         if (data.RetCode == 200)
  868.         {
  869.             var serviceRefreshInterval;
  870.             
  871.             gTimeStampLastRefreshAvailable = true;
  872.             gTimeStampLastRefresh = data.Timestamp;
  873.  
  874.             SetUIState('ready');
  875.             loadSettings();
  876.             
  877.             serviceRefreshInterval = g_oService.RefreshInterval();
  878.             if (serviceRefreshInterval != -1)
  879.             {
  880.                 // Update the UI after refresh interval
  881.                 milliSecondsToNextQuery = 1000 * 60 * serviceRefreshInterval;
  882.             }
  883.             else
  884.             {
  885.                 // Update the UI in 1 minute
  886.                 milliSecondsToNextQuery = 1000 * 60;
  887.             }
  888.         }
  889.         else
  890.         {
  891.             g_isStaleData = true;
  892.             g_ageStampText = calculateAgeStampText(calculateAge(data.Timestamp));
  893.             SetUIState('cached');
  894.             loadSettings();
  895.             // Update the UI in 1 minute
  896.             milliSecondsToNextQuery = 1000 * 60;
  897.         }
  898.     }
  899.     else
  900.     {
  901.         SetUIState('error');
  902.         // Try again in 1 minute
  903.         milliSecondsToNextQuery = 1000 * 60;
  904.     }
  905.     
  906.     g_oTimer = setTimeout('g_oService.GetCurrencies()', milliSecondsToNextQuery);
  907. }
  908. ////////////////////////////////////////////////////////////////////////////////
  909. //
  910. // Load currency symbols for each currency row
  911. //
  912. ////////////////////////////////////////////////////////////////////////////////
  913. function loadSettings()
  914. {
  915.     
  916.     for (i = 0; i < g_oCurr.length; i++)
  917.     {
  918.         var sCurr = readSetting('curr'+i) || L_localizedStrings_Text['default'+i];
  919.         saveSetting('curr'+i, sCurr);
  920.         
  921.         g_oCurr[i].oTag = g_oService.hsCurrencies[sCurr];
  922.         
  923.         //Get first available if list of currency is not complete
  924.         if(g_oCurr[i].oTag == undefined)
  925.         {
  926.             sCurr = g_dataFromService.Item(0).Symbol;
  927.             g_oCurr[i].oTag = g_oService.hsCurrencies[sCurr];            
  928.         }            
  929.         
  930.         if (g_sFullName){
  931.             g_oCurr[i].setCaption(g_oService.hsCurrencies[sCurr].Name);
  932.         } else {
  933.             g_oCurr[i].setCaption(g_oCurr[i].oTag.Symbol);
  934.         }
  935.         
  936.         var sURLLocale = '';
  937.         if (g_oCurr[i].oTag.Symbol != 'USD')
  938.         {
  939.             sURLLocale = g_oCurr[i].oTag.Symbol;
  940.         }
  941.         document.getElementById('curr'+i+'OnlineButtonA').href = getLocalizedString('CurrencyLink')+sURLLocale+'USD';
  942.         
  943.     }
  944.     
  945.     updateValues(g_oCurr[0].oTextBox, false);
  946. }
  947. ////////////////////////////////////////////////////////////////////////////////
  948. //
  949. // Handle ESCAPE and ENTER keydown
  950. //
  951. ////////////////////////////////////////////////////////////////////////////////
  952. function OnKeyDownHandler()
  953. {
  954.     if(event.keyCode == 27)//ESCAPE key
  955.     {
  956.         document.getElementById('currencyList').style.display = 'none';        
  957.     }    
  958. }
  959.  
  960. ////////////////////////////////////////////////////////////////////////////////
  961. //
  962. // Spinner Animation
  963. //
  964. ////////////////////////////////////////////////////////////////////////////////
  965. function getSpinner( spinnerDivID ) 
  966. {
  967.  var self = this;
  968.  this.id = spinnerDivID;
  969.  this.parentDiv = document.getElementById( self.id );
  970.  this.fps = 1000/30; 
  971.  with (this.parentDiv.style) {
  972.     fontSize=0;
  973.     posWidth=16;
  974.     posHeight=16;
  975.     backgroundImage = 'url("images/activity16v.png")';
  976.     backgroundPositionY = 0;
  977.  }
  978.  this.hide = function() { self.parentDiv.style.display='none'; }
  979.  this.show = function() { self.parentDiv.style.display='block'; }
  980.  this.stop = function() { clearInterval( self.animationInterval ); }
  981.  this.start = function() {
  982.     clearInterval( self.animationInterval );
  983.     this.animationInterval = setInterval( 'animate(' + self.id + ')', 30 );
  984.  }
  985.  
  986. function animate(spinnerDiv) 
  987. {
  988.     spinnerDiv.style.backgroundPositionY=parseInt(spinnerDiv.style.backgroundPositionY)-16; 
  989. }
  990.  
  991. ////////////////////////////////////////////////////////////////////////////////
  992. //
  993. // Handle RightClick
  994. //
  995. ////////////////////////////////////////////////////////////////////////////////
  996. function OnRightClickHandler()
  997. {
  998.     if(event.srcElement.tagName != 'INPUT')
  999.     {
  1000.         if(event.button > 1)
  1001.         {
  1002.         var selectedText = document.getElementById('curr0input').createTextRange();
  1003.         selectedText.moveStart('character', document.getElementById('curr0input').value.length);            
  1004.         selectedText.select();
  1005.         event.srcElement.focus();        
  1006.         }
  1007.     }
  1008.     return true;
  1009. }
  1010.  
  1011. function calculateAge ( timestamp )
  1012. {
  1013.  var timestampDay = new Date( timestamp );
  1014.  var currentDay = new Date();
  1015.  
  1016.  var millisecondsTillTimestamp = Date.parse( timestamp );
  1017.  var millisecondsTillNow = (new Date()).getTime();
  1018.  var minutesDifference = parseInt( ( millisecondsTillNow - millisecondsTillTimestamp ) / ( 60 * 1000 ) );
  1019.  var hoursDifference = parseInt ( minutesDifference / 60 );
  1020.  var daysDifference = parseInt ( hoursDifference / 24 );
  1021.  
  1022.  this.minutesAge = 0;
  1023.  this.hoursAge = 0;
  1024.  this.daysAge = 0;
  1025.  
  1026.  if ( minutesDifference <= 0 )
  1027.  {
  1028.     return this;
  1029.  }
  1030.  
  1031.  // shows hours and mins only for the same day
  1032.  if ( timestampDay.getDate() == currentDay.getDate()
  1033.     && timestampDay.getMonth() == currentDay.getMonth()
  1034.     && timestampDay.getFullYear() == currentDay.getFullYear() )
  1035.  {
  1036.     this.minutesAge = minutesDifference % 60;
  1037.     this.hoursAge = hoursDifference % 24;
  1038.     this.daysAge = daysDifference;
  1039.  }
  1040.  else // only calculate total no of days past
  1041.  {
  1042.     timestampDay.setHours(currentDay.getHours(),currentDay.getMinutes(),currentDay.getSeconds(),currentDay.getMilliseconds());
  1043.     this.daysAge = parseInt ( ( currentDay.getTime() - timestampDay.getTime() ) / ( 60 * 1000 * 60 * 24 ) );
  1044.     if ( this.daysAge < 0 )
  1045.     {
  1046.     this.daysAge = 0;
  1047.     }
  1048.  }
  1049.  
  1050.  return this;
  1051. }
  1052.  
  1053. function calculateAgeStampText( age )
  1054. {
  1055.  var ageStampText = "";
  1056.  var unitText = "";
  1057.  var durationText = "";
  1058.  
  1059.  if ( age.daysAge > 0 )
  1060.  {
  1061.     durationText = getLocalizedString('day');
  1062.     if ( age.daysAge > 1 )
  1063.     {
  1064.     durationText = getLocalizedString('days');
  1065.     }
  1066.     unitText = age.daysAge;
  1067.  }
  1068.  else if ( age.hoursAge > 0 )
  1069.  {
  1070.     durationText = getLocalizedString('hr');
  1071.     if ( age.hoursAge > 1 )
  1072.     {
  1073.     durationText = getLocalizedString('hrs');
  1074.     }
  1075.     unitText = age.hoursAge;
  1076.  }
  1077.  else
  1078.  {
  1079.     if ( age.minutesAge != 0 )
  1080.     {
  1081.     durationText = getLocalizedString('min');
  1082.     unitText = age.minutesAge;
  1083.     }
  1084.  }
  1085.  
  1086.  if((unitText != "") && (durationText != ""))
  1087.  {
  1088.     ageStampText = getLocalizedString('ageStampMessage')
  1089.     ageStampText = ageStampText.replace("%1", unitText);
  1090.     ageStampText = ageStampText.replace("%2", durationText);
  1091.  }
  1092.  
  1093.  return ageStampText;
  1094. }
  1095.