
<!--
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements.  See the NOTICE file
distributed with this work for additional information
regarding copyright ownership.  The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License.  You may obtain a copy of the License at

   http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied.  See the License for the
specific language governing permissions and limitations
under the License.
-->

<html>
    <head>
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width, initial-scale=1" />
        <script src="lib/esl.js"></script>
        <script src="lib/config.js"></script>
        <script src="lib/facePrint.js"></script>
    </head>
    <body>
        <style>
            html, body, #main {
                width: 100%;
                height: 100%;
            }
        </style>
        Check tooltip.
        <div id="info"></div>
        <div id="main"></div>
        <script>

            /**
             * @see <https://en.wikipedia.org/wiki/Michelson%E2%80%93Morley_experiment>
             * @see <http://bl.ocks.org/mbostock/4061502>
             */
            var chart;
            var data;

            require([
                'echarts',
                'data/security-sh-2013.json'
                // 'echarts/chart/candlestick',
                // 'echarts/chart/line',
                // 'echarts/component/title',
                // 'echarts/component/legend',
                // 'echarts/component/grid',
                // 'echarts/component/tooltip',
                // 'echarts/component/dataZoom',
                // 'echarts/component/markPoint',
                // 'echarts/component/markLine'
            ], function (echarts, rawData) {

                chart = echarts.init(document.getElementById('main'), null, {

                });
                data = splitData(rawData);

                update();

                chart.on('click', function (info) {
                    console.log(info);
                    if (info.data && info.data.length === 4) {
                        alert([
                            'clicked on: ',
                            'DATA: ' + info.name,
                            'OPEN: ' + info.data[0],
                            'CLOSE: ' + info.data[1],
                            'LOWEST: ' + info.data[2],
                            'HIGHEST: ' + info.data[3]
                        ].join('\n'));
                    }
                    else if (info.data && info.data.length === 2) {
                        // Markpoint
                        alert('mark point');
                    }
                });
            })

            function splitData(rawData) {
                var categoryData = [];
                var values = []
                for (var i = 0; i < rawData.length; i++) {
                    categoryData.push(rawData[i].splice(0, 1)[0]);
                    values.push(rawData[i])
                }
                return {
                    categoryData: categoryData,
                    values: values
                };
            }

            function parseDate(timestamp) {
                var date = new Date(timestamp);
                return date.getFullYear() + '-' + (date.getMonth() + 1) + '-' + date.getDate();
            }

            function update() {

                chart.setOption({
                    legend: {
                        data: ['上证指数', '开盘']
                    },
                    tooltip: {
                        trigger: 'axis',
                        axisPointer: {
                            type: 'line'
                        }
                    },
                    grid: {
                        left: '10%',
                        right: '10%',
                        bottom: '15%'
                    },
                    xAxis: {
                        type: 'category',
                        data: data.categoryData,
                        scale: true,
                        boundaryGap : false,
                        axisLine: {onZero: false},
                        splitLine: {show: false},
                        splitNumber: 20,
                        min: 'dataMin',
                        max: 'dataMax'
                    },
                    yAxis: {
                        scale: true,
                        splitArea: {
                            show: true
                        }
                    },
                    dataZoom: [
                        {
                            type: 'inside',
                            start: 50,
                            end: 100
                        },
                        {
                            show: true,
                            type: 'slider',
                            y: '90%',
                            start: 50,
                            end: 100
                        }
                    ],
                    series: [
                        {
                            name: '开盘',
                            type: 'line',
                            data: (function () {
                                opens = [];
                                for (var i = 0, len = data.values.length; i < len; i++) {
                                    opens.push(data.values[i][0]);
                                }
                                return opens;
                            })(),
                            smooth: true,
                            lineStyle: {
                                normal: {color: '#aaa'}
                            }
                        },
                        {
                            name: '上证指数',
                            type: 'candlestick',
                            data: data.values,
                            // itemStyle: {
                            //     borderColor: '#345',
                            //     borderColor0: '#998',
                            //     borderWidth: 2
                            // },
                            // encode: {
                            //     tooltip: [0, 1, 2, 3]
                            // },
                            // tooltip: {
                            //     formatter: function (param) {
                            //         var param = param[0];
                            //         return [
                            //             '日期：' + param.name + '<hr size=1 style="margin: 3px 0">',
                            //             '开盘：' + param.data[0] + '<br/>',
                            //             '收盘：' + param.data[1] + '<br/>',
                            //             '日最低：' + param.data[2] + '<br/>',
                            //             '日最高：' + param.data[3] + '<br/>'
                            //         ].join('')
                            //     }
                            // },
                            markPoint: {
                                data: [
                                    {
                                        name: '某个坐标',
                                        coord: ['2013/5/21', 2300]
                                    },
                                    {
                                        name: '某个屏幕坐标',
                                        x: 100,
                                        y: 200,
                                        label: {
                                            normal: {
                                                show: false
                                            },
                                            emphasis: {
                                                show: true,
                                                position: 'top',
                                                formatter: 'zxcv'
                                            }
                                        }
                                    },
                                    {
                                        name: 'max value (default)',
                                        type: 'max'
                                    },
                                    {
                                        name: 'min value (default)',
                                        type: 'min'
                                    },
                                    {
                                        name: 'max value (dim:close)',
                                        type: 'max',
                                        valueDim: 'close'
                                    },
                                    {
                                        name: 'average value (dim:close)',
                                        type: 'average',
                                        valueDim: 'close'
                                    }
                                ],
                                tooltip: {
                                    formatter: function (param) {
                                        return param.name + '<br>' + (param.data.coord || '');
                                    }
                                }
                            },
                            markLine: {
                                data: [
                                    [
                                        {name: '两个坐标之间的标线', coord: ['2013/4/25', 2130]},
                                        {coord: ['2013/5/27', 2220]}
                                    ],
                                    [
                                        {name: '两个屏幕坐标之间的标线', x: 100, y: 100},
                                        {x: 250, y: 130}
                                    ],
                                    [
                                        {name: 'max - min', type: 'max'},
                                        {type: 'min'}
                                    ],
                                    {
                                        name: 'min line',
                                        type: 'min'
                                    },
                                    {
                                        name: 'max line on dim:open',
                                        type: 'max',
                                        valueDim: 'open'
                                    }
                                ]
                            }
                        }
                    ]
                });

                // setTimeout(function () {
                //     chart.setOption({
                //         dataZoom: {
                //             startValue: '2013/1/28',
                //             endValue: '2013/1/30'
                //         }
                //     });
                // }, 1000);
            }

        </script>
    </body>
</html>