extends basic

block extra_head
    title ECharts Documentation
    link(rel="stylesheet", type="text/css", href="css/ecOption.css")
    link(rel="stylesheet", type="text/css", href="vendors/prettify/prettify.css")
    link(rel="stylesheet", type="text/css", href="vendors/perfect-scrollbar/0.6.8/css/perfect-scrollbar.min.css")
    link(rel="stylesheet", type="text/css", href="vendors/jquery-autocomplete/jquery.auto-complete.css")
    link(rel="stylesheet", type="text/css", href="vendors/twentytwenty/twentytwenty.css")
    script(src="vendors/prettify/prettify.js")
    script(src="vendors/prettify/lang-css.js")
    script(src="vendors/esl.js")

block content

    nav(class='navbar navbar-default navbar-fixed-top')
        if ecWWWLang == 'en'
            include ../en/nav
        else
            include ../components/nav

    block vars

    if isOption
        .doc-version-change
            if ecWWWLang == 'zh'
                if isECharts4
                    a(href="option3.html") 前往 v3.x 文档
                else
                    a(href="option.html") 前往 v4.x 文档
                a(href="https://www.echartsjs.com/echarts2/") 前往 v2.x 文档
            else
                if isECharts4
                    //- a(href="option3.html") v3.x Doc
                else
                    a(href="option.html") v4.x Doc
                a(href="https://www.echartsjs.com/echarts2/index-en.html") v2.x Doc


    .ecdoc-apidoc

block extra_js

    script(src="vendors/twentytwenty/jquery.event.move.js")
    script(src="vendors/twentytwenty/jquery.twentytwenty.js")

    block global_args_extra

    script(src="vendors/jquery-autocomplete/jquery.auto-complete.min.js")

    script(type="text/javascript").
        document.getElementById('nav-doc').className = 'active';

        var vendorPath = '../vendors';

        define('globalArgs', extend({
            version: '',
            basePath: './',
            // Schema url is added by each doc page
            schemaUrl: '',
            iconfont: {
                down: '&#' + parseInt('e600', 16),
                up: '&#' + parseInt('e603', 16),
                right: '&#' + parseInt('e602', 16),
                left: '&#' + parseInt('e604', 16),
                handLens: '&#' + parseInt('e601', 16)
            }
        }, window.globalArgsExtra || {}));

        define('prettyPrint', function () {
            return prettyPrint;
        });

        require.config({
            baseUrl: './js',
            paths: {
                dt: vendorPath + '/dt/0.0.1',
                tpl: vendorPath + '/dt/0.0.1/tplLoader',
                etpl: vendorPath + '/etpl/3.0.0/etpl.min',
                signals: vendorPath + '/signals/1.0.0/signals.min',
                hasher: vendorPath + '/hasher/1.2.0/hasher.min',
                perfectScrollbar: vendorPath + '/perfect-scrollbar/0.6.8/js/perfect-scrollbar'
            },
            urlArgs: ''
        });

        require(['docTool/main'], function (main) {
            main.init();
        });

        function extend(tar, src) {
            for (var name in src) {
                if (src.hasOwnProperty(name)) {
                    tar[name] = src[name];
                }
            }
            return tar;
        }