CKEDITOR.dialog.add( 'asciisvg', function( editor ) {
var lang = editor.lang.asciisvg;
function getValues(dialog) {
var dialogContents = dialog.definition.contents[0];
var pageId = dialogContents.id;
var dialogFieldValues = {};
for (var i = 0; i < dialogContents.elements.length-1; i++) {
for (var j = 0; j < dialogContents.elements[i].children.length; j++) {
var fieldId = dialogContents.elements[i].children[j].id;
if (isNaN(dialog.getValueOf(pageId, fieldId))) {
dialogFieldValues[fieldId] = dialog.getValueOf(pageId, fieldId);
} else {
dialogFieldValues[fieldId] = Number(dialog.getValueOf(pageId, fieldId));
}
}
}
stroke = dialogFieldValues.color;
strokewidth = dialogFieldValues.width;
strokedasharray = dialogFieldValues.line;
xmin = dialogFieldValues.xmin;
xmax = dialogFieldValues.xmax;
xscl = dialogFieldValues.xscl;
ymin = dialogFieldValues.ymin;
ymax = dialogFieldValues.ymax;
yscl = dialogFieldValues.yscl;
width = dialogFieldValues.resizeTo;
height = dialogFieldValues.by;
return dialogFieldValues;
}
function updateFields(control) {
var dialog = control.getDialog();
var pageId = (dialog.definition.contents[0]).id;
var equationTypeField = dialog.getContentElement(pageId, 'equationType');
var equationField = dialog.getContentElement(pageId, 'equation');
var extraField = dialog.getContentElement(pageId, 'extraField');
var extraFieldIsVisible = extraField.getElement().isVisible();
var value = control.getValue();
if (value.indexOf(',') > -1) {
value = value.split(',');
} else {
value = [value];
}
var found = false;
var i = 0;
while (found === false && i < equationTypeField.items.length) {
if (equationTypeField.items[i][1] === value[0]) {
found = true;
} else {
i++;
}
}
equationTypeField.getInputElement().$.selectedIndex = i;
switch (value[0]) {
case 'func':
if (extraFieldIsVisible === true) {
extraField.getElement().hide();
}
equationField.setLabel(lang.FOfX);
dialog.setValueOf(pageId, 'equation', lang.SinOfX);
break;
case 'polar':
if (extraFieldIsVisible === true) {
extraField.getElement().hide();
}
equationField.setLabel(lang.ROfT);
dialog.setValueOf(pageId, 'equation', lang.T);
break;
case 'param':
equationField.setLabel(lang.FOfT);
dialog.setValueOf(pageId, 'equation', lang.SinOfT);
extraField.setLabel(lang.GOfT);
dialog.setValueOf(pageId, 'extraField', lang.CosOfT);
if (extraFieldIsVisible === false) {
extraField.getElement().show();
}
break;
case 'slope':
equationField.setLabel(lang.DySplitDxOfXAndY);
dialog.setValueOf(pageId, 'equation', lang.XByY);
extraField.setLabel(lang.Every);
dialog.setValueOf(pageId, 'extraField', '1');
if (extraFieldIsVisible === false) {
extraField.getElement().show();
}
break;
case 'label':
if (extraFieldIsVisible === true) {
extraField.getElement().hide();
}
equationField.setLabel(lang.Label);
dialog.setValueOf(pageId, 'equation', lang.Text);
break;
}
var fromField = dialog.getContentElement(pageId, 'from');
var toField = dialog.getContentElement(pageId, 'to');
if (value[0] === 'label') {
fromField.setLabel(lang.XPosition);
toField.setLabel(lang.YPosition);
dialog.setValueOf(pageId, 'from', '0');
dialog.setValueOf(pageId, 'to', '0');
} else {
fromField.setLabel(lang.From);
toField.setLabel(lang.To);
dialog.setValueOf(pageId, 'from', '-7.5');
dialog.setValueOf(pageId, 'to', '7.5');
}
if (value.length > 1) {
dialog.setValueOf(pageId, 'startWith', value[3]);
dialog.setValueOf(pageId, 'endWith', value[4]);
dialog.setValueOf(pageId, 'from', value[5]);
dialog.setValueOf(pageId, 'to', value[6]);
dialog.setValueOf(pageId, 'color', value[7]);
dialog.setValueOf(pageId, 'width', value[8]);
dialog.setValueOf(pageId, 'line', value[9]);
} else {
var fieldsToDefault = ['color','width','line','startWith','endWith'];
for (var i = 0; i < fieldsToDefault.length; i++) {
dialog.setValueOf(pageId, fieldsToDefault[i], dialog.getContentElement(pageId, fieldsToDefault[i]).default);
}
}
}
function addGraph(dialog) {
var pageId = (dialog.definition.contents[0]).id;
var equationTypeField = dialog.getContentElement(pageId, 'equationType');
var selectedIndex = equationTypeField.getInputElement().$.selectedIndex;
var equationType = [equationTypeField.items[selectedIndex][0]];
var equation = [dialog.getValueOf(pageId, 'equation')];
var graphEquation = [[],[]];
// Check if there is more than one equal sign (more than one equation type)
if (equationType[0].split('=').length - 1 > 1) {
equationType = equationType[0].split(',');
var extraField = dialog.getValueOf(pageId, 'extraField');
equation = [equation[0], extraField];
}
// Store left and right parts of the graph equations
for (var i = 0; i < equationType.length; i++) {
// Left part of the graph equations
if (equationType[0].indexOf('=') > -1) {
graphEquation[0][i] = equationType[i].substring(0, equationType[i].indexOf('='));
} else {
graphEquation[0][i] = equationType[i];
}
// Right part of the graph equations
graphEquation[1][i] = equation[i];
}
// Convert graphEquation arrays to strings separated by commas
graphEquation[0] = graphEquation[0].join();
graphEquation[1] = graphEquation[1].join();
// Add square brackets if there is more than one equation type
if (equationType.length > 1) {
graphEquation = '['+graphEquation[0]+']=['+graphEquation[1]+']';
} else {
graphEquation = graphEquation[0]+'='+graphEquation[1];
equation = equation[0];
}
var graphsField = dialog.getContentElement(pageId, 'graphs');
// Add graph equation to graphs select
var values = getValues(dialog);
graphsField.items.push(graphEquation);
var sscr = values.equationType+','+values.equation+','+values.extraField+','+values.startWith+','+values.endWith+','+values.from+','+values.to+','+values.color+','+values.width+','+values.line;
graphsField.add(graphEquation, sscr);
sscr = xmin+','+xmax+','+ymin+','+ymax+','+xscl+','+yscl+','+(xscl||yscl)+','+xgrid+','+ygrid+','+width+','+height;
var graphsFieldLastIndex = graphsField.getInputElement().$.options.length-1;
graphsField.getInputElement().$.selectedIndex = graphsFieldLastIndex;
picture.sscr = sscr;
switch(values.equationType) {
case 'func':
var functionCall = values.equation;
plot(functionCall, values.from, values.to, null, null, values.startWith, values.endWith);
break;
case 'polar':
var functionCall = ["cos(t)*("+values.equation+")","sin(t)*("+values.equation+")"];
plot(functionCall, values.from, values.to, null, null, values.startWith, values.endWith);
break;
case 'param':
var functionCall = [values.equation, values.extraField];
plot(functionCall, values.from, values.to, null, null, values.startWith, values.endWith);
break;
case 'slope':
slopefield(values.equation, values.extraField, values.extraField);
plot(null, values.from, values.to, null, null, values.startWith, values.endWith);
break;
case 'label':
text([values.from, values.to], values.equation);
break;
}
}
function removeSelectedGraph(dialog) {
var pageId = (dialog.definition.contents[0]).id;
var graphsField = dialog.getContentElement(pageId, 'graphs');
var selectedIndex = graphsField.getInputElement().$.selectedIndex;
graphsField.items.splice(selectedIndex, 1);
graphsField.remove(selectedIndex);
}
function updateGraphs(dialog) {
initialized = false;
var sscr = xmin+','+xmax+','+ymin+','+ymax+','+xscl+','+yscl+','+(xscl||yscl)+','+xgrid+','+ygrid;
picture.sscr = sscr;
parseShortScript(sscr, width, height);
var pageId = (dialog.definition.contents[0]).id;
var graphsField = dialog.getContentElement(pageId, 'graphs');
for (var i = 0; i < graphsField.items.length; i++) {
var values = (graphsField.getInputElement().$.options[i].getAttribute('value')).split(',');
stroke = values[7];
strokewidth = values[8];
strokedasharray = values[9];
for (var j = 0; j < values.length; j++) {
if (!isNaN(values[j])) {
values[j] = Number(values[j]);
}
}
switch(values[0]) {
case 'func':
var functionCall = values[1];
plot(functionCall, values[5], values[6], null, null, values[3], values[4]);
break;
case 'polar':
var functionCall = ["cos(t)*("+values[1]+")","sin(t)*("+values[1]+")"];
plot(functionCall, values[5], values[6], null, null, values[3], values[4]);
break;
case 'param':
var functionCall = [values[1], values[2]];
plot(functionCall, values[5], values[6], null, null, values[3], values[4]);
break;
case 'slope':
slopefield(values[1], values[2], values[2]);
plot(null, values[5], values[6], null, null, values[3], values[4]);
break;
case 'label':
text([values[5], values[6]], values[1]);
break;
}
}
}
return {
title: lang.GraphEditor,
minWidth: 350,
minHeight: 100,
contents: [
{
id: 'info',
elements: [
{
type: 'hbox',
widths: ['20%', '20%', '20%', '20%', '20%'],
children: [
{
id: 'equationType',
type: 'select',
label: lang.EquationType,
items: [
[lang.YEqualsFOfX, 'func'],
[lang.REqualsFOfT, 'polar'],
[lang.XEqualsFOfTCommaYEqualsGOfT, 'param'],
[lang.DySplitDxEqualsFOfXAndY, 'slope'],
[lang.Label, 'label']
],
default: 'func',
onChange: function (api) {
updateFields(this);
}
},
{
id: 'equation',
type: 'text',
label: lang.FOfX,
default: lang.XSquared
},
{
id: 'extraField',
type: 'text',
label: '',
default: ''
},
{
id: 'from',
type: 'text',
label: lang.From,
default: '-7.5'
},
{
id: 'to',
type: 'text',
label: lang.To,
default: '7.5'
}
]
},
{
type: 'hbox',
widths: ['20%', '20%', '20%', '20%', '20%'],
children: [
{
id: 'color',
type: 'select',
label: lang.Color,
items: [
[lang.Black, 'black'],
[lang.Red, 'red'],
[lang.Orange, 'orange'],
[lang.Yellow, 'yellow'],
[lang.Green, 'green'],
[lang.Blue, 'blue'],
[lang.Purple, 'purple']
],
default: 'black'
},
{
id: 'width',
type: 'select',
label: lang.Width,
items: [
['1'],
['2'],
['3'],
['4']
],
default: '1'
},
{
id: 'line',
type: 'select',
label: lang.Line,
items: [
[lang.Solid, '0'],
[lang.Dotted, '1'],
[lang.Dashed, '2'],
[lang.TightDash, '3'],
[lang.DashDot, '4']
],
default: '0'
},
{
id: 'startWith',
type: 'select',
label: lang.StartWith,
items: [
[lang.None, '0'],
[lang.Arrow, '1'],
[lang.OpenDot, '2'],
[lang.Dot, '3']
],
default: '0'
},
{
id: 'endWith',
type: 'select',
label: lang.EndWith,
items: [
[lang.None, '0'],
[lang.Arrow, '1'],
[lang.OpenDot, '2'],
[lang.Dot, '3']
],
default: '0'
}
]
},
{
type: 'hbox',
widths: ['17%', '17%', '16%', '17%', '17%', '16%'],
children: [
{
id: 'xmin',
type: 'text',
label: lang.XMin,
default: '-7.5'
},
{
id: 'xmax',
type: 'text',
label: lang.XMax,
default: '7.5'
},
{
id: 'xscl',
type: 'text',
label: lang.XScl,
default: '1'
},
{
id: 'ymin',
type: 'text',
label: lang.YMin,
default: '-5'
},
{
id: 'ymax',
type: 'text',
label: lang.YMax,
default: '5'
},
{
id: 'yscl',
type: 'text',
label: lang.YScl,
default: '1'
}
]
},
{
type: 'hbox',
widths: ['20%', '20%', '20%', '20%', '20%'],
children: [
{
type: 'checkbox',
id: 'showAxisLabels',
label: lang.ShowAxisLabels,
default: 'checked',
onClick: function() {
if (this.getValue()) {
xscl = 1;
xtick = 1;
yscl = 1;
ytick = 1;
} else {
xscl = null;
xtick = null;
yscl = null;
ytick = null;
}
updateGraphs(this.getDialog());
}
},
{
type: 'checkbox',
id: 'showXYGrid',
label: lang.ShowXYGrid,
default: 'checked',
onClick: function() {
if (this.getValue()) {
xgrid = 1;
ygrid = 1;
} else {
xgrid = 0;
ygrid = 0;
}
updateGraphs(this.getDialog());
}
},
{
id: 'resizeTo',
type: 'text',
label: lang.ResizeTo,
default: defaultwidth
},
{
id: 'by',
type: 'text',
label: lang.By,
default: defaultheight
},
{
type: 'button',
id: 'update',
label: lang.Update,
title: lang.Update,
onClick: function() {
var dialog = this.getDialog();
var pageId = (dialog.definition.contents[0]).id;
width = dialog.getValueOf(pageId, 'resizeTo');
height = dialog.getValueOf(pageId, 'by');
updateGraphs(dialog);
}
}
]
},
{
type: 'hbox',
widths: ['20%', '20%', '20%', '20%', '20%'],
children: [
{
type: 'button',
id: 'addGraph',
label: lang.AddGraph,
title: lang.AddGraph,
onClick: function() {
addGraph(this.getDialog());
}
},
{
id: 'graphs',
type: 'select',
label: lang.Graphs,
items: [],
onChange: function (api) {
updateFields(this);
}
},
{
type: 'button',
id: 'replaceSelectedGraph',
label: lang.ReplaceSelectedGraph,
title: lang.ReplaceSelectedGraph,
onClick: function() {
removeSelectedGraph(this.getDialog());
updateGraphs(this.getDialog());
addGraph(this.getDialog());
}
},
{
type: 'button',
id: 'remove',
label: lang.Remove,
title: lang.Remove,
onClick: function() {
removeSelectedGraph(this.getDialog());
updateGraphs(this.getDialog());
}
},
{
id: 'position',
type: 'select',
label: lang.Position,
items: [
[lang.Top, 'top'],
[lang.Middle, 'middle'],
[lang.Bottom, 'bottom'],
[lang.FloatLeft, 'floatLeft'],
[lang.FloatRight, 'floatRight']
],
default: 'middle',
onChange: function (api) {
var currentStyle = picture.attributes.style.value;
var regExpPattern = /vertical-align:\s?(\w|-)+/;
var verticalAlignValue = (regExpPattern.exec(currentStyle))[0];
var regExpPattern = /float:\s?\w+/;
var floatValue = (regExpPattern.exec(currentStyle))[0];
switch(this.getValue()) {
case 'top':
currentStyle = currentStyle.replace(verticalAlignValue, 'vertical-align: text-top');
currentStyle = currentStyle.replace(floatValue, 'float: none');
break;
case 'middle':
currentStyle = currentStyle.replace(verticalAlignValue, 'vertical-align: middle');
currentStyle = currentStyle.replace(floatValue, 'float: none');
break;
case 'bottom':
currentStyle = currentStyle.replace(verticalAlignValue, 'vertical-align: text-bottom');
currentStyle = currentStyle.replace(floatValue, 'float: none');
break;
case 'floatLeft':
currentStyle = currentStyle.replace(verticalAlignValue, 'vertical-align: middle');
currentStyle = currentStyle.replace(floatValue, 'float: left');
break;
case 'floatRight':
currentStyle = currentStyle.replace(verticalAlignValue, 'vertical-align: middle');
currentStyle = currentStyle.replace(floatValue, 'float: right');
break;
}
picture.attributes.style.value = currentStyle;
}
}
]
},
{
id: 'preview',
type: 'html',
html: '',
onShow: function( widget ) {
xmin = -7.5;
xmax = 7.5;
ymin = -5;
ymax = 5;
xscl = 1;
yscl = 1;
xgrid = 1;
ygrid = 1;
xtick = 1;
ytick = 1;
width = defaultwidth;
height = defaultheight;
drawPics();
var dialog = this.getDialog();
var pageId = (dialog.definition.contents[0]).id;
var fieldsToDefault = ['equationType','equation','color','width','line','startWith','endWith'];
for (var i = 0; i < fieldsToDefault.length; i++) {
dialog.setValueOf(pageId, fieldsToDefault[i], dialog.getContentElement(pageId, fieldsToDefault[i]).default);
}
var extraField = dialog.getContentElement(pageId,'extraField');
extraField.getElement().hide();
var graphsField = dialog.getContentElement(pageId, 'graphs');
var graphData = null;
graphsField.clear();
graphsField.items = [];
if (graphData !== editor.getSelection().getSelectedElement()) {
graphData = (editor.getSelection().getSelectedElement().$.attributes[0].value).split(',');
for (var i = 11; i < graphData.length; i+=10) {
var graphEquation = '';
switch(graphData[i]) {
case 'func':
graphEquation = 'y='+graphData[i+1];
break;
case 'polar':
graphEquation = 'r='+graphData[i+1];
break;
case 'param':
graphEquation = '[x,y]=['+graphData[i+1]+','+graphData[i+2]+']';
break;
case 'slope':
graphEquation = 'dx/dy='+graphData[i+1];
break;
case 'label':
graphEquation = lang.Label+'='+graphData[i+1];
break;
}
graphsField.items.push(graphEquation);
var sscr = graphData[i]+','+graphData[i+1]+','+graphData[i+2]+','+graphData[i+3]+','+graphData[i+4]+','+graphData[i+5]+','+graphData[i+6]+','+graphData[i+7]+','+graphData[i+8]+','+graphData[i+9];
graphsField.add(graphEquation, sscr);
}
xmin = graphData[0];
dialog.setValueOf(pageId, 'xmin', xmin);
xmax = graphData[1];
dialog.setValueOf(pageId, 'xmax', xmax);
ymin = graphData[2];
dialog.setValueOf(pageId, 'ymin', ymin);
ymax = graphData[3];
dialog.setValueOf(pageId, 'ymax', ymax);
if (graphData[6] === 'null') {
dialog.setValueOf(pageId, 'showAxisLabels', null);
xscl = null;
xtick = null;
yscl = null;
ytick = null;
} else {
xscl = 1;
xtick = 1;
yscl = 1;
ytick = 1;
}
if ((graphData[7]||graphData[8]) === '0') {
dialog.setValueOf(pageId, 'showXYGrid', null);
xgrid = 0;
ygrid = 0;
} else {
xgrid = 1;
ygrid = 1;
}
width = graphData[9];
dialog.setValueOf(pageId, 'resizeTo', width);
height = graphData[10];
dialog.setValueOf(pageId, 'by', height);
updateGraphs(dialog);
}
else {
updateGraphs(dialog);
addGraph(dialog);
}
},
commit : function(data)
{
var dialog = this.getDialog();
var pageId = (dialog.definition.contents[0]).id;
var previewField = dialog.getContentElement(pageId,this.id);
var sscr = xmin+','+xmax+','+ymin+','+ymax+','+xscl+','+yscl+','+(xscl||yscl)+','+xgrid+','+ygrid+','+width+','+height;
var graphsField = dialog.getContentElement(pageId, 'graphs');
for (var i = 0; i < graphsField.items.length; i++) {
sscr += ','+graphsField.getInputElement().$.options[i].getAttribute('value');
}
picture.sscr = sscr;
data.preview = '';
}
}
]
}
],
onOk: function( widget ) {
var data = {};
this.commitContent(data);
var currentStyle = picture.attributes.style.value;
var regExpPattern = /vertical-align:\s?(\w|-)+/;
var verticalAlignValue = (regExpPattern.exec(currentStyle))[0];
var regExpPattern = /float:\s?\w+/;
var floatValue = (regExpPattern.exec(currentStyle))[0];
var imgElement = '';
picture.sscr = '-7.5,7.5,-5,5,1,1,1,1,1,'+defaultwidth+','+defaultheight;
var element = CKEDITOR.dom.element.createFromHtml(imgElement);
editor.insertElement(element);
}
};
} );