/*
 * 图片转换对话框脚本
 **/
var tableData = [],
    //编辑器页面table
    editorTable = null,
    chartsConfig = window.typeConfig,
    resizeTimer = null,
    //初始默认图表类型
    currentChartType = 0;
window.onload = function () {
    editorTable = domUtils.findParentByTagName( editor.selection.getRange().startContainer, 'table', true);
    //未找到表格, 显示错误页面
    if ( !editorTable ) {
        document.body.innerHTML = "
未找到数据
";
        return;
    }
    //初始化图表类型选择
    initChartsTypeView();
    renderTable( editorTable );
    initEvent();
    initUserConfig( editorTable.getAttribute( "data-chart" ) );
    $( "#scrollBed .view-box:eq("+ currentChartType +")" ).trigger( "click" );
    updateViewType( currentChartType );
    dialog.addListener( "resize", function () {
        if ( resizeTimer != null ) {
            window.clearTimeout( resizeTimer );
        }
        resizeTimer = window.setTimeout( function () {
            resizeTimer = null;
            renderCharts();
        }, 500 );
    } );
};
function initChartsTypeView () {
    var contents = [];
    for ( var i = 0, len = chartsConfig.length; i ' );
    }
    $( "#scrollBed" ).html( contents.join( "" ) );
}
//渲染table, 以便用户修改数据
function renderTable ( table ) {
    var tableHtml = [];
    //构造数据
    for ( var i = 0, row; row = table.rows[ i ]; i++ ) {
        tableData[ i ] = [];
        tableHtml[ i ] = [];
        for ( var j = 0, cell; cell = row.cells[ j ]; j++ ) {
            var value = getCellValue( cell );
            if ( i > 0 && j > 0 ) {
                value = +value;
            }
            if ( i === 0 || j === 0 ) {
                tableHtml[ i ].push( '
' );
    }
    $( "#scrollBed" ).html( contents.join( "" ) );
}
//渲染table, 以便用户修改数据
function renderTable ( table ) {
    var tableHtml = [];
    //构造数据
    for ( var i = 0, row; row = table.rows[ i ]; i++ ) {
        tableData[ i ] = [];
        tableHtml[ i ] = [];
        for ( var j = 0, cell; cell = row.cells[ j ]; j++ ) {
            var value = getCellValue( cell );
            if ( i > 0 && j > 0 ) {
                value = +value;
            }
            if ( i === 0 || j === 0 ) {
                tableHtml[ i ].push( ''+ value +'' );
            } else {
                tableHtml[ i ].push( ' | ' );
            }
            tableData[ i ][ j ] = value;
        }
        tableHtml[ i ] = tableHtml[ i ].join( "" );
    }
    //draw 表格
    $( "#tableContainer" ).html( ' | '+ tableHtml.join( "
" ) +'
' );
}
/*
 * 根据表格已有的图表属性初始化当前图表属性
 */
function initUserConfig ( config ) {
    var parsedConfig = {};
    if ( !config ) {
        return;
    }
    config = config.split( ";" );
    $.each( config, function ( index, item ) {
        item = item.split( ":" );
        parsedConfig[ item[ 0 ] ] = item[ 1 ];
    } );
    setUserConfig( parsedConfig );
}
function initEvent () {
    var cacheValue = null,
        //图表类型数
        typeViewCount = chartsConfig.length- 1,
        $chartsTypeViewBox = $( '#scrollBed .view-box' );
    $( ".charts-format" ).delegate( ".format-ctrl", "change", function () {
        renderCharts();
    } )
    $( ".table-view" ).delegate( ".data-item", "focus", function () {
        cacheValue = this.value;
    } ).delegate( ".data-item", "blur", function () {
        if ( this.value !== cacheValue ) {
            renderCharts();
        }
        cacheValue = null;
    } );
    $( "#buttonContainer" ).delegate( "a", "click", function (e) {
        e.preventDefault();
        if ( this.getAttribute( "data-title" ) === 'prev' ) {
            if ( currentChartType > 0 ) {
                currentChartType--;
                updateViewType( currentChartType );
            }
        } else {
            if ( currentChartType < typeViewCount ) {
                currentChartType++;
                updateViewType( currentChartType );
            }
        }
    } );
    //图表类型变化
    $( '#scrollBed' ).delegate( ".view-box", "click", function (e) {
        var index = $( this ).attr( "data-chart-type" );
        $chartsTypeViewBox.removeClass( "selected" );
        $( $chartsTypeViewBox[ index ] ).addClass( "selected" );
        currentChartType = index | 0;
        //饼图, 禁用部分配置
        if ( currentChartType === chartsConfig.length - 1 ) {
            disableNotPieConfig();
        //启用完整配置
        } else {
            enableNotPieConfig();
        }
        renderCharts();
    } );
}
function renderCharts () {
    var data = collectData();
    $('#chartsContainer').highcharts( $.extend( {}, chartsConfig[ currentChartType ], {
        credits: {
            enabled: false
        },
        exporting: {
            enabled: false
        },
        title: {
            text: data.title,
            x: -20 //center
        },
        subtitle: {
            text: data.subTitle,
            x: -20
        },
        xAxis: {
            title: {
                text: data.xTitle
            },
            categories: data.categories
        },
        yAxis: {
            title: {
                text: data.yTitle
            },
            plotLines: [{
                value: 0,
                width: 1,
                color: '#808080'
            }]
        },
        tooltip: {
            enabled: true,
            valueSuffix: data.suffix
        },
        legend: {
            layout: 'vertical',
            align: 'right',
            verticalAlign: 'middle',
            borderWidth: 1
        },
        series: data.series
    } ));
}
function updateViewType ( index ) {
    $( "#scrollBed" ).css( 'marginLeft', -index*324+'px' );
}
function collectData () {
    var form = document.forms[ 'data-form' ],
        data = null;
    if ( currentChartType !== chartsConfig.length - 1 ) {
        data = getSeriesAndCategories();
        $.extend( data, getUserConfig() );
    //饼图数据格式
    } else {
        data = getSeriesForPieChart();
        data.title = form[ 'title' ].value;
        data.suffix = form[ 'unit' ].value;
    }
    return data;
}
/**
 * 获取用户配置信息
 */
function getUserConfig () {
    var form = document.forms[ 'data-form' ],
        info = {
            title: form[ 'title' ].value,
            subTitle: form[ 'sub-title' ].value,
            xTitle: form[ 'x-title' ].value,
            yTitle: form[ 'y-title' ].value,
            suffix: form[ 'unit' ].value,
            //数据对齐方式
            tableDataFormat: getTableDataFormat (),
            //饼图提示文字
            tip: $( "#tipInput" ).val()
        };
    return info;
}
function setUserConfig ( config ) {
    var form = document.forms[ 'data-form' ];
    config.title && ( form[ 'title' ].value = config.title );
    config.subTitle && ( form[ 'sub-title' ].value = config.subTitle );
    config.xTitle && ( form[ 'x-title' ].value = config.xTitle );
    config.yTitle && ( form[ 'y-title' ].value = config.yTitle );
    config.suffix && ( form[ 'unit' ].value = config.suffix );
    config.dataFormat == "-1" && ( form[ 'charts-format' ][ 1 ].checked = true );
    config.tip && ( form[ 'tip' ].value = config.tip );
    currentChartType = config.chartType || 0;
}
function getSeriesAndCategories () {
    var form = document.forms[ 'data-form' ],
        series = [],
        categories = [],
        tmp = [],
        tableData = getTableData();
    //反转数据
    if ( getTableDataFormat() === "-1" ) {
        for ( var i = 0, len = tableData.length; i < len; i++ ) {
            for ( var j = 0, jlen = tableData[ i ].length; j < jlen; j++ ) {
                if ( !tmp[ j ] ) {
                    tmp[ j ] = [];
                }
                tmp[ j ][ i ] = tableData[ i ][ j ];
            }
        }
        tableData = tmp;
    }
    categories = tableData[0].slice( 1 );
    for ( var i = 1, data; data = tableData[ i ]; i++ ) {
        series.push( {
            name: data[ 0 ],
            data: data.slice( 1 )
        } );
    }
    return {
        series: series,
        categories: categories
    };
}
/*
 * 获取数据源数据对齐方式
 */
function getTableDataFormat () {
    var form = document.forms[ 'data-form' ],
        items = form['charts-format'];
    return items[ 0 ].checked ? items[ 0 ].value : items[ 1 ].value;
}
/*
 * 禁用非饼图类型的配置项
 */
function disableNotPieConfig() {
    updateConfigItem( 'disable' );
}
/*
 * 启用非饼图类型的配置项
 */
function enableNotPieConfig() {
    updateConfigItem( 'enable' );
}
function updateConfigItem ( value ) {
    var table = $( "#showTable" )[ 0 ],
        isDisable = value === 'disable' ? true : false;
    //table中的input处理
    for ( var i = 2 , row; row = table.rows[ i ]; i++ ) {
        for ( var j = 1, cell; cell = row.cells[ j ]; j++ ) {
            $( "input", cell ).attr( "disabled", isDisable );
        }
    }
    //其他项处理
    $( "input.not-pie-item" ).attr( "disabled", isDisable );
    $( "#tipInput" ).attr( "disabled", !isDisable )
}
/*
 * 获取饼图数据
 * 饼图的数据只取第一行的
 **/
function getSeriesForPieChart () {
    var series = {
            type: 'pie',
            name: $("#tipInput").val(),
            data: []
        },
        tableData = getTableData();
    for ( var j = 1, jlen = tableData[ 0 ].length; j < jlen; j++ ) {
        var title = tableData[ 0 ][ j ],
            val = tableData[ 1 ][ j ];
        series.data.push( [ title, val ] );
    }
    return {
        series: [ series ]
    };
}
function getTableData () {
    var table = document.getElementById( "showTable" ),
        xCount = table.rows[0].cells.length - 1,
        values = getTableInputValue();
    for ( var i = 0, value; value = values[ i ]; i++ ) {
        tableData[ Math.floor( i / xCount ) + 1 ][ i % xCount + 1 ] = values[ i ];
    }
    return tableData;
}
function getTableInputValue () {
    var table = document.getElementById( "showTable" ),
        inputs = table.getElementsByTagName( "input" ),
        values = [];
    for ( var i = 0, input; input = inputs[ i ]; i++ ) {
        values.push( input.value | 0 );
    }
    return values;
}
function getCellValue ( cell ) {
    var value = utils.trim( ( cell.innerText || cell.textContent || '' ) );
    return value.replace( new RegExp( UE.dom.domUtils.fillChar, 'g' ), '' ).replace( /^\s+|\s+$/g, '' );
}
//dialog确认事件
dialog.onok = function () {
    //收集信息
    var form = document.forms[ 'data-form' ],
        info = getUserConfig();
    //添加图表类型
    info.chartType = currentChartType;
    //同步表格数据到编辑器
    syncTableData();
    //执行图表命令
    editor.execCommand( 'charts', info );
};
/*
 * 同步图表编辑视图的表格数据到编辑器里的原始表格
 */
function syncTableData () {
    var tableData = getTableData();
    for ( var i = 1, row; row = editorTable.rows[ i ]; i++ ) {
        for ( var j = 1, cell; cell = row.cells[ j ]; j++ ) {
            cell.innerHTML = tableData[ i ] [ j ];
        }
    }
}