• Edit
  • Download
  • <!doctype html>
    <html>
    
    <head>
      <meta charset="utf-8">
      <title>ZingChart Demo: Financial Widget Dashboard</title>
      <script nonce="undefined" src="https://cdn.zingchart.com/zingchart.min.js"></script>
      <style>
        .zc-body {
          background: #fff;
        }
    
        #myChart {
          margin: 10px 0 20px;
          opacity: 0;
          visibility: hidden;
          transition: opacity .3s;
        }
    
        #myChart.loaded {
          opacity: 1;
          visibility: visible;
        }
    
        .zc-demo {
          margin: 0 auto;
          width: 100%;
          max-width: 910px;
        }
    
        .zc-favorites {
          z-index: 100;
          position: absolute;
          top: 0;
          left: 0;
          box-shadow: 3px 3px 3px #333;
        }
    
        .zc-favorites-wrap {
          margin-top: 10px;
          margin: 0 auto;
          padding: 10px;
          min-height: 120px;
          background: #ebebeb;
          border: 0;
        }
    
        .zc-favorites-headline {
          font-size: 13px;
          display: block;
          margin-bottom: 7px;
        }
    
        .zc-favorites-db {
          display: grid;
          grid-template-columns: repeat(4, 1fr);
          grid-column-gap: 10px;
          grid-row-gap: 10px;
        }
    
        .zc-favorites-fb-db {
          float: left;
        }
    
        .zc-ref {
          display: none;
        }
      </style>
    </head>
    
    <body class="zc-body">
    
      <div class="zc-demo">
    
        <div id="myChart">
          <a href="https://www.zingchart.com/" rel="noopener" class="zc-ref">Powered by ZingChart</a>
        </div>
    
        <div class="zc-favorites-wrap">
          <strong class="zc-favorites-headline">Favorites (drag from above)</strong>
          <div id="db" class="zc-favorites-db"></div>
        </div>
    
      </div>
    
      <script>
        ZC.LICENSE = ["569d52cefae586f634c54f86dc99e6a9", "b55b025e438fa8a98e32482b5f768ff5"]; // Define Module Location
        zingchart.MODULESDIR = 'https://cdn.zingchart.com/modules/';
    
        // DEFINE DATA
        // -----------------------------
        // Data config
        let chartData = {
          type: 'null',
          backgroundColor: '#ddd #eee',
          height: '100%',
          width: '100%',
          widgets: [{
              type: 'exchange',
              rate: 'EUR/USD',
              colors: [
                ['#55154D', '#4E0E46'], '#fff', '#ccc'
              ],
              refresh: 500,
              ticks: 100,
              width: 450,
              x: '10px',
              y: '10px',
            },
            {
              type: 'exchange',
              rate: 'USD/CAD',
              colors: [
                ['#56000E', '#5F0017'], '#fff', '#ccc'
              ],
              x: '470px',
              y: '10px',
            },
            {
              type: 'exchange',
              rate: 'USD/JPY',
              colors: [
                ['#014358', '#013D52'], '#fff', '#ccc'
              ],
              decimals: 2,
              height: 200,
              width: 200,
              x: '700px',
              y: '10px',
            },
            {
              type: 'exchange',
              rate: 'BTC/USD',
              colors: [
                ['#264031', '#243C2E'], '#fff', '#ccc'
              ],
              decimals: 2,
              refresh: 200,
              ticks: 60,
              x: '10px',
              y: '160px',
            },
            {
              type: 'exchange',
              rate: 'CRUDE OIL WTI',
              colors: [
                ['#264F14', '#244B13'], '#fff', '#ccc'
              ],
              decimals: 2,
              x: '240px',
              y: '160px',
            },
            {
              type: 'exchange',
              rate: 'GOLD',
              colors: [
                ['#704F00', '#6B4A00'], '#fff', '#ccc'
              ],
              decimals: 2,
              height: 260,
              refresh: 2000,
              x: '470px',
              y: '160px',
            },
            {
              type: 'exchange',
              rate: 'GBP/USD',
              colors: [
                ['#262400', '#242200'], '#fff', '#ccc'
              ],
              height: 110,
              x: '10px',
              y: '310px',
            },
            {
              type: 'exchange',
              rate: 'NZD/USD',
              colors: [
                ['#260031', '#24002E'], '#fff', '#ccc'
              ],
              height: 110,
              x: '240px',
              y: '310px',
            },
            {
              type: 'exchange',
              rate: 'USD/CHF',
              colors: [
                ['#363636', '#333333'], '#fff', '#ccc'
              ],
              height: 200,
              width: 200,
              x: '700px',
              y: '220px',
            },
          ],
        };
        let chartDataFB = {
          backgroundColor: '#ddd #eee',
          type: 'null',
          widgets: [],
        };
        let SEQ = 0;
    
        // Main chart render location
        let chartId = 'myChart';
    
        // Favorites
        let fbId = 'fb';
    
        // INIT
        // -----------------------------
        // Append Amazon Script
        let aws = document.createElement('script');
        aws.src = 'https://s3-us-west-2.amazonaws.com/s.cdpn.io/374756/widgets.js';
        document.body.appendChild(aws);
        aws.addEventListener('load', init);
    
        // Constantly fetch new data sets
        window.fetchData = function(rate, callback) {
          let oRefValues = {
            'EUR/USD': 1.1143,
            'USD/JPY': 120.88,
            'USD/CAD': 1.2219,
            'BTC/USD': 232.71,
            'CRUDE OIL WTI': 58.59,
            GOLD: 1208.21,
            'GBP/USD': 1.552,
            'NZD/USD': 0.7368,
            'USD/CHF': 0.9364,
          };
          let fRefValue = oRefValues[rate],
            fDiff = fRefValue / 100;
          oRefValues[rate] = fRefValue + (-fDiff / 2 + fDiff * Math.random());
          let json = {
            rate: rate,
            ts: 100 * Math.round(new Date().getTime() / 100),
            value: oRefValues[rate],
          };
          callback.call(window, JSON.stringify(json));
        };
    
        // LOAD EVENTS
        // -----------------------------
        // Run these after AWS script is init
        function init() {
          // Render the main demo
          zingchart.render({
            id: chartId,
            width: '100%',
            height: 430,
            output: 'svg',
            strictmode: true,
            data: chartData,
            events: {
              load: loaded,
            },
          });
    
          // Bind 'mousedown' action when you click/drag a chart
          zingchart.bind(chartId, 'mousedown', md);
        }
    
        // CHART RENDERED
        // -----------------------------
        // Set CSS class to show chart after render
        function loaded() {
          let chart = document.querySelector('#' + chartId);
          chart.classList.add('loaded');
        }
    
        // DEFINE 'MOUSE DOWN' FUNCTION
        // -----------------------------
        function md(p) {
          // Early Exit: Element is not a button
          if (p.ev.button !== 0) return;
          // Add data
          let wdata = getData(p, chartData);
          // Early Exit: No data found
          if (!wdata) return;
    
          // Define data for 2nd location
          chartDataFB.widgets = [wdata];
          p.ev.preventDefault();
    
          // Add data to Favorites
          let appendData =
            '<div id="fb" class="zc-favorites" style="width:' +
            wdata.width +
            'px;height:' +
            wdata.height +
            'px;"></div>';
          document.body.insertAdjacentHTML('beforeend', appendData);
    
          setTimeout(function() {
            // Otherwise, create mouse functions and apply to the chart
            // ---
            // Get the Favorites DOM element
            let fb = document.querySelector('#' + fbId);
            // Early Exit: Not found
            if (!fb) return;
    
            // Position element
            fb.style.top = p.ev.clientY - wdata.height / 2 + 'px';
            fb.style.left = p.ev.clientX - wdata.width / 2 + 'px';
    
            // Bind mouse movements
            document.addEventListener('mousemove', mouseMove);
            document.addEventListener('mouseup', mouseUp);
    
            // Render 2nd chart in 'Favorites' DOM element
            zingchart.render({
              id: fbId,
              width: wdata.width,
              height: wdata.height,
              output: 'svg',
              strictmode: true,
              data: chartDataFB,
            });
          }, 0);
    
          // MOUSE FNS
    
          // Mousemove
          function mouseMove(ev) {
            ev.preventDefault();
            let fb = document.querySelector('#' + fbId);
            let doc = document.documentElement;
            let body = document.body;
            let offsetTop = doc.scrollTop ? doc.scrollTop : document.body.scrollTop;
            fb.style.top = ev.clientY - wdata.height / 2 + offsetTop + 'px';
            fb.style.left = ev.clientX - wdata.width / 2 + 'px';
          }
    
          // Mouseup
          function mouseUp(ev) {
            let fb = document.querySelector('#' + fbId);
            if (fb) {
              let db = document.querySelector('#db');
              let dbData = '<div id="fb' + SEQ + '" class="zc-favorites-fb-db"></div>';
              db.insertAdjacentHTML('beforeend', dbData);
              zingchart.render({
                id: fbId + SEQ,
                width: wdata.width,
                height: wdata.height,
                output: 'svg',
                strictmode: true,
                data: chartDataFB,
              });
              SEQ++;
              fb.remove();
              zingchart.exec(fbId, 'destroy');
            }
            document.removeEventListener('mousemove', mouseMove);
            document.removeEventListener('mouseup', mouseUp);
          }
        }
    
        // DEFINE 'GET DATA' FUNCTION
        // -----------------------------
        // Get the data from the clicked item
        function getData(p, data) {
          if (!data) return;
          let wdata;
          for (let w = 0; w < data.widgets.length; w++) {
            let rate = data.widgets[w].rate;
            let id = p.id + '-graph-' + p.id + rate.replace(/[^a-zA-Z0-9]/g, '');
            if (id === p.graphid) {
              wdata = data.widgets[w];
              wdata.x = 0;
              wdata.y = 0;
              wdata.width = 220;
              wdata.height = 100;
            }
          }
          return wdata;
        }
      </script>
    </body>
    
    </html>
    <!doctype html>
    <html>
    
    <head>
      <meta charset="utf-8">
      <title>ZingChart Demo: Financial Widget Dashboard</title>
      <script src="https://cdn.zingchart.com/zingchart.min.js"></script>
    </head>
    
    <body class="zc-body">
    
      <div class="zc-demo">
    
        <div id="myChart">
          <a href="https://www.zingchart.com/" rel="noopener" class="zc-ref">Powered by ZingChart</a>
        </div>
    
        <div class="zc-favorites-wrap">
          <strong class="zc-favorites-headline">Favorites (drag from above)</strong>
          <div id="db" class="zc-favorites-db"></div>
        </div>
    
      </div>
    
    </body>
    
    </html>
    .zc-body {
      background: #fff;
    }
    
    #myChart {
      margin: 10px 0 20px;
      opacity: 0;
      visibility: hidden;
      transition: opacity .3s;
    }
    
    #myChart.loaded {
      opacity: 1;
      visibility: visible;
    }
    
    .zc-demo {
      margin: 0 auto;
      width: 100%;
      max-width: 910px;
    }
    
    .zc-favorites {
      z-index: 100;
      position: absolute;
      top: 0;
      left: 0;
      box-shadow: 3px 3px 3px #333;
    }
    
    .zc-favorites-wrap {
      margin-top: 10px;
      margin: 0 auto;
      padding: 10px;
      min-height: 120px;
      background: #ebebeb;
      border: 0;
    }
    
    .zc-favorites-headline {
      font-size: 13px;
      display: block;
      margin-bottom: 7px;
    }
    
    .zc-favorites-db {
      display: grid;
      grid-template-columns: repeat(4, 1fr);
      grid-column-gap: 10px;
      grid-row-gap: 10px;
    }
    
    .zc-favorites-fb-db {
      float: left;
    }
    
    .zc-ref {
      display: none;
    }
    // Define Module Location
    zingchart.MODULESDIR = 'https://cdn.zingchart.com/modules/';
    
    // DEFINE DATA
    // -----------------------------
    // Data config
    let chartData = {
      type: 'null',
      backgroundColor: '#ddd #eee',
      height: '100%',
      width: '100%',
      widgets: [{
          type: 'exchange',
          rate: 'EUR/USD',
          colors: [
            ['#55154D', '#4E0E46'], '#fff', '#ccc'
          ],
          refresh: 500,
          ticks: 100,
          width: 450,
          x: '10px',
          y: '10px',
        },
        {
          type: 'exchange',
          rate: 'USD/CAD',
          colors: [
            ['#56000E', '#5F0017'], '#fff', '#ccc'
          ],
          x: '470px',
          y: '10px',
        },
        {
          type: 'exchange',
          rate: 'USD/JPY',
          colors: [
            ['#014358', '#013D52'], '#fff', '#ccc'
          ],
          decimals: 2,
          height: 200,
          width: 200,
          x: '700px',
          y: '10px',
        },
        {
          type: 'exchange',
          rate: 'BTC/USD',
          colors: [
            ['#264031', '#243C2E'], '#fff', '#ccc'
          ],
          decimals: 2,
          refresh: 200,
          ticks: 60,
          x: '10px',
          y: '160px',
        },
        {
          type: 'exchange',
          rate: 'CRUDE OIL WTI',
          colors: [
            ['#264F14', '#244B13'], '#fff', '#ccc'
          ],
          decimals: 2,
          x: '240px',
          y: '160px',
        },
        {
          type: 'exchange',
          rate: 'GOLD',
          colors: [
            ['#704F00', '#6B4A00'], '#fff', '#ccc'
          ],
          decimals: 2,
          height: 260,
          refresh: 2000,
          x: '470px',
          y: '160px',
        },
        {
          type: 'exchange',
          rate: 'GBP/USD',
          colors: [
            ['#262400', '#242200'], '#fff', '#ccc'
          ],
          height: 110,
          x: '10px',
          y: '310px',
        },
        {
          type: 'exchange',
          rate: 'NZD/USD',
          colors: [
            ['#260031', '#24002E'], '#fff', '#ccc'
          ],
          height: 110,
          x: '240px',
          y: '310px',
        },
        {
          type: 'exchange',
          rate: 'USD/CHF',
          colors: [
            ['#363636', '#333333'], '#fff', '#ccc'
          ],
          height: 200,
          width: 200,
          x: '700px',
          y: '220px',
        },
      ],
    };
    let chartDataFB = {
      backgroundColor: '#ddd #eee',
      type: 'null',
      widgets: [],
    };
    let SEQ = 0;
    
    // Main chart render location
    let chartId = 'myChart';
    
    // Favorites
    let fbId = 'fb';
    
    // INIT
    // -----------------------------
    // Append Amazon Script
    let aws = document.createElement('script');
    aws.src = 'https://s3-us-west-2.amazonaws.com/s.cdpn.io/374756/widgets.js';
    document.body.appendChild(aws);
    aws.addEventListener('load', init);
    
    // Constantly fetch new data sets
    window.fetchData = function(rate, callback) {
      let oRefValues = {
        'EUR/USD': 1.1143,
        'USD/JPY': 120.88,
        'USD/CAD': 1.2219,
        'BTC/USD': 232.71,
        'CRUDE OIL WTI': 58.59,
        GOLD: 1208.21,
        'GBP/USD': 1.552,
        'NZD/USD': 0.7368,
        'USD/CHF': 0.9364,
      };
      let fRefValue = oRefValues[rate],
        fDiff = fRefValue / 100;
      oRefValues[rate] = fRefValue + (-fDiff / 2 + fDiff * Math.random());
      let json = {
        rate: rate,
        ts: 100 * Math.round(new Date().getTime() / 100),
        value: oRefValues[rate],
      };
      callback.call(window, JSON.stringify(json));
    };
    
    // LOAD EVENTS
    // -----------------------------
    // Run these after AWS script is init
    function init() {
      // Render the main demo
      zingchart.render({
        id: chartId,
        width: '100%',
        height: 430,
        output: 'svg',
        strictmode: true,
        data: chartData,
        events: {
          load: loaded,
        },
      });
    
      // Bind 'mousedown' action when you click/drag a chart
      zingchart.bind(chartId, 'mousedown', md);
    }
    
    // CHART RENDERED
    // -----------------------------
    // Set CSS class to show chart after render
    function loaded() {
      let chart = document.querySelector('#' + chartId);
      chart.classList.add('loaded');
    }
    
    // DEFINE 'MOUSE DOWN' FUNCTION
    // -----------------------------
    function md(p) {
      // Early Exit: Element is not a button
      if (p.ev.button !== 0) return;
      // Add data
      let wdata = getData(p, chartData);
      // Early Exit: No data found
      if (!wdata) return;
    
      // Define data for 2nd location
      chartDataFB.widgets = [wdata];
      p.ev.preventDefault();
    
      // Add data to Favorites
      let appendData =
        '<div id="fb" class="zc-favorites" style="width:' +
        wdata.width +
        'px;height:' +
        wdata.height +
        'px;"></div>';
      document.body.insertAdjacentHTML('beforeend', appendData);
    
      setTimeout(function() {
        // Otherwise, create mouse functions and apply to the chart
        // ---
        // Get the Favorites DOM element
        let fb = document.querySelector('#' + fbId);
        // Early Exit: Not found
        if (!fb) return;
    
        // Position element
        fb.style.top = p.ev.clientY - wdata.height / 2 + 'px';
        fb.style.left = p.ev.clientX - wdata.width / 2 + 'px';
    
        // Bind mouse movements
        document.addEventListener('mousemove', mouseMove);
        document.addEventListener('mouseup', mouseUp);
    
        // Render 2nd chart in 'Favorites' DOM element
        zingchart.render({
          id: fbId,
          width: wdata.width,
          height: wdata.height,
          output: 'svg',
          strictmode: true,
          data: chartDataFB,
        });
      }, 0);
    
      // MOUSE FNS
    
      // Mousemove
      function mouseMove(ev) {
        ev.preventDefault();
        let fb = document.querySelector('#' + fbId);
        let doc = document.documentElement;
        let body = document.body;
        let offsetTop = doc.scrollTop ? doc.scrollTop : document.body.scrollTop;
        fb.style.top = ev.clientY - wdata.height / 2 + offsetTop + 'px';
        fb.style.left = ev.clientX - wdata.width / 2 + 'px';
      }
    
      // Mouseup
      function mouseUp(ev) {
        let fb = document.querySelector('#' + fbId);
        if (fb) {
          let db = document.querySelector('#db');
          let dbData = '<div id="fb' + SEQ + '" class="zc-favorites-fb-db"></div>';
          db.insertAdjacentHTML('beforeend', dbData);
          zingchart.render({
            id: fbId + SEQ,
            width: wdata.width,
            height: wdata.height,
            output: 'svg',
            strictmode: true,
            data: chartDataFB,
          });
          SEQ++;
          fb.remove();
          zingchart.exec(fbId, 'destroy');
        }
        document.removeEventListener('mousemove', mouseMove);
        document.removeEventListener('mouseup', mouseUp);
      }
    }
    
    // DEFINE 'GET DATA' FUNCTION
    // -----------------------------
    // Get the data from the clicked item
    function getData(p, data) {
      if (!data) return;
      let wdata;
      for (let w = 0; w < data.widgets.length; w++) {
        let rate = data.widgets[w].rate;
        let id = p.id + '-graph-' + p.id + rate.replace(/[^a-zA-Z0-9]/g, '');
        if (id === p.graphid) {
          wdata = data.widgets[w];
          wdata.x = 0;
          wdata.y = 0;
          wdata.width = 220;
          wdata.height = 100;
        }
      }
      return wdata;
    }