<!DOCTYPE html>
<!--
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">
        <script src="lib/simpleRequire.js"></script>
        <script src="lib/config.js"></script>
        <meta name="viewport" content="width=device-width, initial-scale=1" />
        <link rel="stylesheet" href="lib/reset.css">
    </head>
    <body>
        <style>
        </style>
        <div id="main"></div>
        <script>

            var echarts;
            var chart;
            var myChart;

            require([
                'echarts'
            ], function (ec) {

                echarts = ec;

                var rawData = [
                    [5.1, 3.5, 1.4, 0.2, "setosa"],
                    [4.9, 3.0, 1.4, 0.2, "setosa"],
                    [4.7, 3.2, 1.3, 0.2, "setosa"],
                    [4.6, 3.1, 1.5, 0.2, "setosa"],
                    [5.0, 3.6, 1.4, 0.2, "setosa"],
                    [5.4, 3.9, 1.7, 0.4, "setosa"],
                    [4.6, 3.4, 1.4, 0.3, "setosa"],
                    [5.0, 3.4, 1.5, 0.2, "setosa"],
                    [4.4, 2.9, 1.4, 0.2, "setosa"],
                    [4.9, 3.1, 1.5, 0.1, "setosa"],
                    [5.4, 3.7, 1.5, 0.2, "setosa"],
                    [4.8, 3.4, 1.6, 0.2, "setosa"],
                    [4.8, 3.0, 1.4, 0.1, "setosa"],
                    [4.3, 3.0, 1.1, 0.1, "setosa"],
                    [5.8, 4.0, 1.2, 0.2, "setosa"],
                    [5.7, 4.4, 1.5, 0.4, "setosa"],
                    [5.4, 3.9, 1.3, 0.4, "setosa"],
                    [5.1, 3.5, 1.4, 0.3, "setosa"],
                    [5.7, 3.8, 1.7, 0.3, "setosa"],
                    [5.1, 3.8, 1.5, 0.3, "setosa"],
                    [5.4, 3.4, 1.7, 0.2, "setosa"],
                    [5.1, 3.7, 1.5, 0.4, "setosa"],
                    [4.6, 3.6, 1.0, 0.2, "setosa"],
                    [5.1, 3.3, 1.7, 0.5, "setosa"],
                    [4.8, 3.4, 1.9, 0.2, "setosa"],
                    [5.0, 3.0, 1.6, 0.2, "setosa"],
                    [5.0, 3.4, 1.6, 0.4, "setosa"],
                    [5.2, 3.5, 1.5, 0.2, "setosa"],
                    [5.2, 3.4, 1.4, 0.2, "setosa"],
                    [4.7, 3.2, 1.6, 0.2, "setosa"],
                    [4.8, 3.1, 1.6, 0.2, "setosa"],
                    [5.4, 3.4, 1.5, 0.4, "setosa"],
                    [5.2, 4.1, 1.5, 0.1, "setosa"],
                    [5.5, 4.2, 1.4, 0.2, "setosa"],
                    [4.9, 3.1, 1.5, 0.2, "setosa"],
                    [5.0, 3.2, 1.2, 0.2, "setosa"],
                    [5.5, 3.5, 1.3, 0.2, "setosa"],
                    [4.9, 3.6, 1.4, 0.1, "setosa"],
                    [4.4, 3.0, 1.3, 0.2, "setosa"],
                    [5.1, 3.4, 1.5, 0.2, "setosa"],
                    [5.0, 3.5, 1.3, 0.3, "setosa"],
                    [4.5, 2.3, 1.3, 0.3, "setosa"],
                    [4.4, 3.2, 1.3, 0.2, "setosa"],
                    [5.0, 3.5, 1.6, 0.6, "setosa"],
                    [5.1, 3.8, 1.9, 0.4, "setosa"],
                    [4.8, 3.0, 1.4, 0.3, "setosa"],
                    [5.1, 3.8, 1.6, 0.2, "setosa"],
                    [4.6, 3.2, 1.4, 0.2, "setosa"],
                    [5.3, 3.7, 1.5, 0.2, "setosa"],
                    [5.0, 3.3, 1.4, 0.2, "setosa"],
                    [7.0, 3.2, 4.7, 1.4, "versicolor"],
                    [6.4, 3.2, 4.5, 1.5, "versicolor"],
                    [6.9, 3.1, 4.9, 1.5, "versicolor"],
                    [5.5, 2.3, 4.0, 1.3, "versicolor"],
                    [6.5, 2.8, 4.6, 1.5, "versicolor"],
                    [5.7, 2.8, 4.5, 1.3, "versicolor"],
                    [6.3, 3.3, 4.7, 1.6, "versicolor"],
                    [4.9, 2.4, 3.3, 1.0, "versicolor"],
                    [6.6, 2.9, 4.6, 1.3, "versicolor"],
                    [5.2, 2.7, 3.9, 1.4, "versicolor"],
                    [5.0, 2.0, 3.5, 1.0, "versicolor"],
                    [5.9, 3.0, 4.2, 1.5, "versicolor"],
                    [6.0, 2.2, 4.0, 1.0, "versicolor"],
                    [6.1, 2.9, 4.7, 1.4, "versicolor"],
                    [5.6, 2.9, 3.6, 1.3, "versicolor"],
                    [6.7, 3.1, 4.4, 1.4, "versicolor"],
                    [5.6, 3.0, 4.5, 1.5, "versicolor"],
                    [5.8, 2.7, 4.1, 1.0, "versicolor"],
                    [6.2, 2.2, 4.5, 1.5, "versicolor"],
                    [5.6, 2.5, 3.9, 1.1, "versicolor"],
                    [5.9, 3.2, 4.8, 1.8, "versicolor"],
                    [6.1, 2.8, 4.0, 1.3, "versicolor"],
                    [6.3, 2.5, 4.9, 1.5, "versicolor"],
                    [6.1, 2.8, 4.7, 1.2, "versicolor"],
                    [6.4, 2.9, 4.3, 1.3, "versicolor"],
                    [6.6, 3.0, 4.4, 1.4, "versicolor"],
                    [6.8, 2.8, 4.8, 1.4, "versicolor"],
                    [6.7, 3.0, 5.0, 1.7, "versicolor"],
                    [6.0, 2.9, 4.5, 1.5, "versicolor"],
                    [5.7, 2.6, 3.5, 1.0, "versicolor"],
                    [5.5, 2.4, 3.8, 1.1, "versicolor"],
                    [5.5, 2.4, 3.7, 1.0, "versicolor"],
                    [5.8, 2.7, 3.9, 1.2, "versicolor"],
                    [6.0, 2.7, 5.1, 1.6, "versicolor"],
                    [5.4, 3.0, 4.5, 1.5, "versicolor"],
                    [6.0, 3.4, 4.5, 1.6, "versicolor"],
                    [6.7, 3.1, 4.7, 1.5, "versicolor"],
                    [6.3, 2.3, 4.4, 1.3, "versicolor"],
                    [5.6, 3.0, 4.1, 1.3, "versicolor"],
                    [5.5, 2.5, 4.0, 1.3, "versicolor"],
                    [5.5, 2.6, 4.4, 1.2, "versicolor"],
                    [6.1, 3.0, 4.6, 1.4, "versicolor"],
                    [5.8, 2.6, 4.0, 1.2, "versicolor"],
                    [5.0, 2.3, 3.3, 1.0, "versicolor"],
                    [5.6, 2.7, 4.2, 1.3, "versicolor"],
                    [5.7, 3.0, 4.2, 1.2, "versicolor"],
                    [5.7, 2.9, 4.2, 1.3, "versicolor"],
                    [6.2, 2.9, 4.3, 1.3, "versicolor"],
                    [5.1, 2.5, 3.0, 1.1, "versicolor"],
                    [5.7, 2.8, 4.1, 1.3, "versicolor"],
                    [6.3, 3.3, 6.0, 2.5, "virginica"],
                    [5.8, 2.7, 5.1, 1.9, "virginica"],
                    [7.1, 3.0, 5.9, 2.1, "virginica"],
                    [6.3, 2.9, 5.6, 1.8, "virginica"],
                    [6.5, 3.0, 5.8, 2.2, "virginica"],
                    [7.6, 3.0, 6.6, 2.1, "virginica"],
                    [4.9, 2.5, 4.5, 1.7, "virginica"],
                    [7.3, 2.9, 6.3, 1.8, "virginica"],
                    [6.7, 2.5, 5.8, 1.8, "virginica"],
                    [7.2, 3.6, 6.1, 2.5, "virginica"],
                    [6.5, 3.2, 5.1, 2.0, "virginica"],
                    [6.4, 2.7, 5.3, 1.9, "virginica"],
                    [6.8, 3.0, 5.5, 2.1, "virginica"],
                    [5.7, 2.5, 5.0, 2.0, "virginica"],
                    [5.8, 2.8, 5.1, 2.4, "virginica"],
                    [6.4, 3.2, 5.3, 2.3, "virginica"],
                    [6.5, 3.0, 5.5, 1.8, "virginica"],
                    [7.7, 3.8, 6.7, 2.2, "virginica"],
                    [7.7, 2.6, 6.9, 2.3, "virginica"],
                    [6.0, 2.2, 5.0, 1.5, "virginica"],
                    [6.9, 3.2, 5.7, 2.3, "virginica"],
                    [5.6, 2.8, 4.9, 2.0, "virginica"],
                    [7.7, 2.8, 6.7, 2.0, "virginica"],
                    [6.3, 2.7, 4.9, 1.8, "virginica"],
                    [6.7, 3.3, 5.7, 2.1, "virginica"],
                    [7.2, 3.2, 6.0, 1.8, "virginica"],
                    [6.2, 2.8, 4.8, 1.8, "virginica"],
                    [6.1, 3.0, 4.9, 1.8, "virginica"],
                    [6.4, 2.8, 5.6, 2.1, "virginica"],
                    [7.2, 3.0, 5.8, 1.6, "virginica"],
                    [7.4, 2.8, 6.1, 1.9, "virginica"],
                    [7.9, 3.8, 6.4, 2.0, "virginica"],
                    [6.4, 2.8, 5.6, 2.2, "virginica"],
                    [6.3, 2.8, 5.1, 1.5, "virginica"],
                    [6.1, 2.6, 5.6, 1.4, "virginica"],
                    [7.7, 3.0, 6.1, 2.3, "virginica"],
                    [6.3, 3.4, 5.6, 2.4, "virginica"],
                    [6.4, 3.1, 5.5, 1.8, "virginica"],
                    [6.0, 3.0, 4.8, 1.8, "virginica"],
                    [6.9, 3.1, 5.4, 2.1, "virginica"],
                    [6.7, 3.1, 5.6, 2.4, "virginica"],
                    [6.9, 3.1, 5.1, 2.3, "virginica"],
                    [5.8, 2.7, 5.1, 1.9, "virginica"],
                    [6.8, 3.2, 5.9, 2.3, "virginica"],
                    [6.7, 3.3, 5.7, 2.5, "virginica"],
                    [6.7, 3.0, 5.2, 2.3, "virginica"],
                    [6.3, 2.5, 5.0, 1.9, "virginica"],
                    [6.5, 3.0, 5.2, 2.0, "virginica"],
                    [6.2, 3.4, 5.4, 2.3, "virginica"],
                    [5.9, 3.0, 5.1, 1.8, "virginica"]
                ];

                var GRID_WIDTH = 220;
                var GRID_HEIGHT = 220;
                var GAP = 20;
                var CATEGORY_DIM = 4;
                var CROSS_DIM_NUMBER = 4;
                var BASE_LEFT = 30;
                var BASE_TOP = 20;
                var SYMBOL_SIZE = 8;

                function genData(data, dimX, dimY) {
                    var result = [];
                    for (var i = 0; i < data.length; i++) {
                        result.push([data[i][dimX], data[i][dimY], data[i][CATEGORY_DIM]]);
                    }
                    return result;
                }

                function getCategories(data) {
                    var map = {};
                    var result = [];
                    for (var i = 0; i < data.length; i++) {
                        if (!map[data[i][CATEGORY_DIM]]) {
                            map[data[i][CATEGORY_DIM]] = 1;
                        }
                    }
                    for (var cate in map) {
                        if (map.hasOwnProperty(cate)) {
                            result.push(cate);
                        }
                    }
                    return result;
                }

                function genGrids(option) {
                    var gridList = option.grid = [];
                    var xAxisList = option.xAxis = [];
                    var yAxisList = option.yAxis = [];
                    var seriesList = option.series = [];
                    var visualMapSeriesIndices = option.visualMap.seriesIndex = [];
                    var axisPointerLinkList = option.axisPointer.link = [];
                    var axisPointerLinkMap = {};

                    for (var i = 0; i < CROSS_DIM_NUMBER; i++) {
                        for (var j = 0; j < CROSS_DIM_NUMBER; j++) {
                            var id = i + '-' + j;

                            var linkItem = axisPointerLinkMap['x' + i];
                            if (!linkItem) {
                                linkItem = axisPointerLinkMap['x' + i] = {xAxisId: []};
                                axisPointerLinkList.push(linkItem);
                            }
                            linkItem.xAxisId.push(id);

                            var linkItem = axisPointerLinkMap['y' + j];
                            if (!linkItem) {
                                linkItem = axisPointerLinkMap['y' + j] = {yAxisId: []};
                                axisPointerLinkList.push(linkItem);
                            }
                            linkItem.yAxisId.push(id);

                            gridList.push({
                                left: BASE_LEFT + i * (GRID_WIDTH + GAP),
                                top: BASE_TOP + (CROSS_DIM_NUMBER - 1 - j) * (GRID_HEIGHT + GAP),
                                width: GRID_WIDTH,
                                height: GRID_HEIGHT
                            });
                            xAxisList.push({
                                id: id,
                                axisLine: {
                                    onZero: false
                                },
                                axisTick: {
                                    show: j === 0
                                },
                                axisLabel: {
                                    show: j === 0
                                },
                                type: 'value',
                                gridIndex: i * CROSS_DIM_NUMBER + j,
                                scale: true
                            });
                            yAxisList.push({
                                id: id,
                                axisLine: {
                                    onZero: false
                                },
                                axisTick: {
                                    show: i === 0
                                },
                                axisLabel: {
                                    show: i === 0
                                },
                                type: 'value',
                                gridIndex: i * CROSS_DIM_NUMBER + j,
                                scale: true
                            });
                            seriesList.push({
                                type: 'scatter',
                                symbolSize: SYMBOL_SIZE,
                                xAxisIndex: i * CROSS_DIM_NUMBER + j,
                                yAxisIndex: i * CROSS_DIM_NUMBER + j,
                                data: genData(rawData, i, j)
                            });
                            visualMapSeriesIndices.push(i * CROSS_DIM_NUMBER + j);
                        }
                    }
                }

                var option = {
                    legend: {
                        data: ['scatter', 'scatter2', 'scatter3']
                    },
                    animation: false,
                    brush: {
                        brushLink: 'all'
                    },
                    axisPointer: {
                        show: true,
                        snap: true,
                        link: [],
                        lineStyle: {
                            type: 'dashed'
                        }
                    },
                    visualMap: {
                        type: 'piecewise',
                        categories: getCategories(rawData),
                        dimension: 2,
                        orient: 'horizontal',
                        top: 0,
                        left: 'center',
                        inRange: {
                            color: ['#c23531','#2f4554', '#61a0a8']
                        }
                    },
                    tooltip: {
                        trigger: 'item',
                        extraCssText: 'max-width:400px; white-space: normal;',
                        formatter: function (params) {
                            if (echarts.util.isArray(params)) {
                                var map = {
                                    x: {items: []},
                                    y: {items: []}
                                };
                                echarts.util.each(params, function (param) {
                                    var dim = param.axisDim;
                                    var mapItem = map[dim];
                                    mapItem.axisValueLabel = param.axisValueLabel;
                                    mapItem.items.push(
                                        param.value[dim === 'x' ? 1 : 0]
                                        + ' ' + param.value[2]
                                    );
                                });
                                return map.x.axisValueLabel + '<br>(' + map.x.items.join(') (') + ')'
                                    + '<br><br>'
                                    + map.y.axisValueLabel + '<br>(' + map.y.items.join(') (') + ')';
                            }
                            else {
                                return params.name + ' ' + params.value;
                            }
                        }
                    }
                };

                genGrids(option);

                var mainEl = document.getElementById('main');
                mainEl.style.height = BASE_TOP * 2 + CROSS_DIM_NUMBER * (GRID_HEIGHT + GAP) + 'px';
                chart = myChart = echarts.init(mainEl);
                chart.setOption(option);
            });

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