<!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>
        <script src="lib/jquery.min.js"></script>
        <meta name="viewport" content="width=device-width, initial-scale=1" />
        <link rel="stylesheet" href="lib/reset.css">
    </head>
    <body>
        <style>
            #main, #main2 {
                width: auto;
                margin: 100px;
                height: 550px;
            }
        </style>
        <div id="main"></div>
        <div id="main2"></div>

        <script src="data/obama_budget_proposal_2012.tree.js"></script>










        <script>

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

                var myChart = echarts.init(document.getElementById('main'));

                convertData(window.obama_budget_2012);

                function convertData(originList) {
                    for (var i = 0; i < originList.length; i++) {
                        var node = originList[i];
                        if (node) {
                            var value = node.value;
                            value[3] = value[2] > 0
                                ? 100
                                : value[2] < 0
                                ? -100
                                : 0;

                            if (node.children) {
                                convertData(node.children);
                            }
                        }
                    }
                }


                function isValidNumber(num) {
                    return num != null && isFinite(num);
                }

                myChart.setOption(option = {
                    title: {
                        left: 'center',
                        text: 'Category Mapping',
                        subtext: 'Growth > 0: green; Growth < 0: red; Growth = 0: grey'
                    },
                    tooltip: {
                        formatter: function (info) {
                            var value = info.value;

                            var amount = value[0];
                            amount = isValidNumber(amount)
                                ? echarts.format.addCommas(amount * 1000) + '$'
                                : '-';

                            var amount2011 = value[1];
                            amount2011 = isValidNumber(amount2011)
                                ? echarts.format.addCommas(amount2011 * 1000) + '$'
                                : '-';

                            var change = value[2];
                            change = isValidNumber(change)
                                ? change.toFixed(2) + '%'
                                : '-';

                            return [
                                '<div class="tooltip-title">' + echarts.format.encodeHTML(info.name) + '</div>',
                                '2012 Amount: &nbsp;&nbsp;' + amount + '<br>',
                                '2011 Amount: &nbsp;&nbsp;' + amount2011 + '<br>',
                                'Change From 2011: &nbsp;&nbsp;' + change
                            ].join('');
                        }
                    },
                    series: [{
                        name: 'ALL',
                        top: 80,
                        type: 'treemap',
                        label: {
                            show: true,
                            formatter: "{b}",
                            normal: {
                                textStyle: {
                                    ellipsis: true
                                }
                            }
                        },
                        itemStyle: {
                            normal: {
                                borderColor: 'black'
                            }
                        },
                        visualMin: -100,
                        visualMax: 100,
                        visualDimension: 3,
                        levels: [
                            {
                                itemStyle: {
                                    normal: {
                                        borderWidth: 3,
                                        borderColor: '#333',
                                        gapWidth: 3
                                    }
                                }
                            },
                            {
                                color: ['#942e38', '#aaa', '#269f3c'],
                                colorMappingBy: 'value',
                                itemStyle: {
                                    normal: {
                                        gapWidth: 1
                                    }
                                }
                            }
                        ],
                        data: window.obama_budget_2012
                    }]
                });


            });

        </script>














        <script>

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

                var myChart = echarts.init(document.getElementById('main2'));

                var visualMin = -100;
                var visualMax = 100;
                var visualMinBound = -40;
                var visualMaxBound = 40;

                convertData(window.obama_budget_2012);

                function convertData(originList) {
                    var min = Infinity;
                    var max = -Infinity;

                    for (var i = 0; i < originList.length; i++) {
                        var node = originList[i];
                        if (node) {
                            var value = node.value;
                            value[2] != null && value[2] < min && (min = value[2]);
                            value[2] != null && value[2] > max && (max = value[2]);
                        }
                    }

                    for (var i = 0; i < originList.length; i++) {
                        var node = originList[i];
                        if (node) {
                            var value = node.value;

                            // Scale value for visual effect
                            if (value[2] != null && value[2] > 0) {
                                value[3] = echarts.number.linearMap(
                                    value[2], [0, max], [visualMaxBound, visualMax], true
                                );
                            }
                            else if (value[2] != null && value[2] < 0) {
                                value[3] = echarts.number.linearMap(
                                    value[2], [min, 0], [visualMin, visualMinBound], true
                                );
                            }
                            else {
                                value[3] = 0;
                            }

                            if (!isFinite(value[3])) {
                                value[3] = 0;
                            }

                            if (node.children) {
                                convertData(node.children);
                            }
                        }
                    }
                }


                function isValidNumber(num) {
                    return num != null && isFinite(num);
                }

                myChart.setOption(option = {
                    title: {
                        left: 'center',
                        text: 'Gradient Mapping',
                        subtext: 'Growth > 0: green; Growth < 0: red; Growth = 0: grey'
                    },
                    tooltip: {
                        formatter: function (info) {
                            var value = info.value;

                            var amount = value[0];
                            amount = isValidNumber(amount)
                                ? echarts.format.addCommas(amount * 1000) + '$'
                                : '-';

                            var amount2011 = value[1];
                            amount2011 = isValidNumber(amount2011)
                                ? echarts.format.addCommas(amount2011 * 1000) + '$'
                                : '-';

                            var change = value[2];
                            change = isValidNumber(change)
                                ? change.toFixed(2) + '%'
                                : '-';

                            return [
                                '<div class="tooltip-title">' + echarts.format.encodeHTML(info.name) + '</div>',
                                '2012 Amount: &nbsp;&nbsp;' + amount + '<br>',
                                '2011 Amount: &nbsp;&nbsp;' + amount2011 + '<br>',
                                'Change From 2011: &nbsp;&nbsp;' + change
                            ].join('');
                        }
                    },
                    series: [{
                        name: 'ALL',
                        top: 80,
                        type: 'treemap',
                        label: {
                            show: true,
                            formatter: "{b}",
                            normal: {
                                textStyle: {
                                    ellipsis: true
                                }
                            }
                        },
                        itemStyle: {
                            normal: {
                                borderColor: 'black'
                            }
                        },
                        visualMin: visualMin,
                        visualMax: visualMax,
                        visualDimension: 3,
                        levels: [
                            {
                                itemStyle: {
                                    normal: {
                                        borderWidth: 3,
                                        borderColor: '#333',
                                        gapWidth: 3
                                    }
                                }
                            },
                            {
                                color: ['#942e38', '#aaa', '#269f3c'],
                                colorMappingBy: 'value',
                                itemStyle: {
                                    normal: {
                                        gapWidth: 1
                                    }
                                }
                            }
                        ],
                        data: window.obama_budget_2012
                    }]
                });


            });

        </script>

    </body>
</html>