/* 
 | 
 * 图片转换对话框脚本 
 | 
 **/ 
 | 
  
 | 
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 = "<div class='edui-charts-not-data'>未找到数据</div>"; 
 | 
        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<len; i++ ) { 
 | 
  
 | 
        contents.push( '<div class="view-box" data-chart-type="'+ i +'"><img width="300" src="images/charts'+ i +'.png"></div>' ); 
 | 
  
 | 
    } 
 | 
  
 | 
    $( "#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( '<th>'+ value +'</th>' ); 
 | 
            } else { 
 | 
                tableHtml[ i ].push( '<td><input  type="text" class="data-item" value="'+ value +'"></td>' ); 
 | 
            } 
 | 
  
 | 
            tableData[ i ][ j ] = value; 
 | 
  
 | 
        } 
 | 
  
 | 
        tableHtml[ i ] = tableHtml[ i ].join( "" ); 
 | 
  
 | 
    } 
 | 
  
 | 
    //draw 表格 
 | 
    $( "#tableContainer" ).html( '<table id="showTable" border="1"><tbody><tr>'+ tableHtml.join( "</tr><tr>" ) +'</tr></tbody></table>' ); 
 | 
  
 | 
} 
 | 
  
 | 
/* 
 | 
 * 根据表格已有的图表属性初始化当前图表属性 
 | 
 */ 
 | 
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 ]; 
 | 
  
 | 
        } 
 | 
  
 | 
    } 
 | 
  
 | 
} 
 |