
<!--
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/simpleRequire.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.js'
            ], 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>