/*
* 图片转换对话框脚本
**/
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 < len; i++) {
contents.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];
}
}
}